我使用pywhois来确定域名是否已注册。这是我的源代码。(所有从a.net
到zzz.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.
有另一种方法,在这里报告。
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访问权限,可以保存权威的答案(但通常只有当你点击"订购"时才会这样做)。
你的第一个方法(whois)曾经是一个很好的方法,我在90年代的时候做过大规模的这种方法,当时一切都更开放。如今,许多顶级域名通过验证码和阻碍性的web界面等来保护这些信息。不出意外的话,每个IP的查询数量将会有配额。(这也可能是有充分理由的,我曾经收到过大量的垃圾邮件,发送给用于注册域名的电子邮件地址)。另请注意,通过查询向他们的WHOIS数据库发送垃圾邮件通常违反了他们的使用条款,您可能会受到速率限制,阻止,甚至向您的ISP收到滥用报告。
第二种方法(DNS)通常要快得多(但不要使用gethostbyname,使用Twisted或其他一些异步DNS以提高效率)。您需要弄清楚每个顶级域名对已占用和空闲域名的响应情况。仅仅因为一个域名没有解析并不意味着它是免费的(它可能只是未被使用)。相反,一些顶级域名有所有不存在的域名的登陆页面。在某些情况下,仅使用DNS是不可能确定的。
怎么解呢?恐怕不容易。对于每个TLD,您需要弄清楚如何巧妙地使用DNS和whois数据库,从DNS开始,在棘手的情况下采用其他方法。请确保不要用查询淹没whois数据库。
另一个选择是获得API访问一个注册商,他们可能提供编程访问域名搜索