如何以编程方式查明域名是否已注册

How to find out programmatically if a domain name is registered or not

我用pywhois判断域名是否被注册。这是我的源代码。 (从 a.netzzz.net 的所有排列)

#!/usr/bin/env python
import whois  #pip install python-whois
import string
import itertools

def main():
    characters = list(string.ascii_lowercase)
    ##domain names generator
    for r in range(1, 4) :
        for name in itertools.permutations(characters, r) : #from 'a.net' to 'zzz.net'
            url = ''.join(name) + '.net'

            #check if a domain name is registered or not
            try :
                w = whois.whois(url)
            except (whois.parser.PywhoisError):  #NOT FOUND
                print(url)   #unregistered domain names?

if __name__ == '__main__':
    main()

我得到了以下结果:

jv.net
uli.net
vno.net
xni.net

但是,以上所有域名都已经被注册了。这是不准确的。 谁能解释一下? 有很多错误:

fgets: Connection reset by peer
connect: No route to host
connect: Network is unreachable
connect: Connection refused
Timeout.

有另一种方法,已报告here

import socket   
try:    
    socket.gethostbyname_ex(url) 
except:
    print(url) #unregistered domain names?

说到速度,我用map并行处理。

def select_unregisteredd_domain_names(self, domain_names):
    #Parallelism using map
    pool = ThreadPool(16)  # Sets the pool size
    results = pool.map(query_method(), domain_names)
    pool.close()  #close the pool and wait for the work to finish
    pool.join()

    return results

这是一个棘手的问题,比大多数人意识到的要棘手。这样做的原因是有些人不希望 你发现这一点。大多数域名注册商都使用大量黑魔法(即大量 TLD 特定的黑客攻击)来获得他们提供的优质列表,但他们常常弄错了。当然,最后他们肯定会知道,因为他们有 EPP 访问权限,可以保留权威答案(但通常只有在您单击 "order" 时才会这样做)。

你的第一个方法 (whois) 曾经是一个很好的方法,我在 90 年代大规模地这样做了,当时一切都更加开放。如今,许多 TLD 在验证码和阻塞性 Web 界面等后面保护这些信息。如果不出意外,每个 IP 的查询数量将有配额。 (这也可能是有充分理由的,我过去常常收到大量垃圾邮件到用于注册域的电子邮件地址)。另请注意,使用查询向他们的 WHOIS 数据库发送垃圾邮件通常会违反他们的使用条款,您可能会受到速率限制、阻止,甚至会向您的 ISP 收到滥用报告。

您的第二种方法 (DNS) 通常要快得多(但不要使用 gethostbyname,使用 Twisted 或其他一些异步 DNS 以提高效率)。您需要弄清楚每个 TLD 对已占用域和免费域的响应是什么样的。仅仅因为一个域没有解析并不意味着它是免费的(它可能只是未被使用)。相反,某些 TLD 具有所有不存在域的登录页面。某些情况下单独使用DNS是无法判断的。

那么,你是怎么解决的呢?恐怕不容易。对于每个 TLD,您需要弄清楚如何巧妙地使用 DNS 和 whois 数据库,从 DNS 开始,在棘手的情况下诉诸其他方式。确保不要用查询淹没 whois 数据库。

另一种选择是 API 访问其中一个注册商,他们可能会提供对域搜索的编程访问。