本文分享用Python批量查询域名的方法,并用并行化,加速查询。
批量查询域名,最开始我是从网上下载工具(还一口气用了好几次域名查询工具,唉),效果很不理想(定制有限,后缀支持有限)。后来,发现godaddy提供批量查询,链接在这里,但最多一次只能查500个,有时还不能成功返回,还有每次去选中域名后缀也是很累的事。
随着对Python熟悉度增加,开始用Python批量查询域名。这种酸爽,像是发现了另一片天空。不过,还是有问题,比如大批量查询,被域名商拒绝,甚至被认为是DDOS攻击。
以下结合源代码简要介绍,源代码已分享在GitHub,在这里。
我用一种很粗爆的方法产生域名组合:全排列。使用itertools.permutations函数,很容易做到这一点。源代码如下(长度1-3,26个字母全组合,给定感兴趣的后缀):
import itertools import string ### 使用 characters = list(string.ascii_lowercase) extensions = ['net', 'org', 'me', 'info', 'cn', 'in', 'it'] min_length = 1 max_length = 3 query = Bulk_domain_names_query() domain_names = query.domain_names_generator(characters, extensions, min_length, max_length) ### 函数 def domain_names_generator(self, characters, extensions, min_length, max_length): domain_names = list() for r in range(min_length, max_length+1) : for name in itertools.permutations(characters, r) : for extension in extensions : domain_name = ''.join(name) + '.' + str(extension) domain_names.append(domain_name) return domain_names
用pywhois库查询,代码如下:
import whois #pip install python-whois def whois_domain_name(self, url): try : w = whois.whois(url) except (whois.parser.PywhoisError): #NOT FOUND return url
上面的查询,总共需要查询12w+次,如下:
>>> sum(pow(26, i) for i in range(1,4)) * 7 127946
用并行化查询加快速度,参考博文《Parallelism in one line》,源代码如下:
from multiprocessing import Pool from multiprocessing.dummy import Pool as ThreadPool def select_unregisteredd_domain_names(self, domain_names): #Parallelism using map pool = ThreadPool(16) # Sets the pool size results = pool.map(self.whois_domain_name, domain_names) pool.close() #close the pool and wait for the work to finish pool.join() return results
我将查询结果放在GitHub,在这里(晚点添加)。本以为12w+很快就跑完了,没想到跑了一两个小时,才把.net跑出来,结果如下:
jv.net uli.net vno.net xni.net
实际上,这4个域名都已经被注册了。
域名投资大不如从前了,理由如下:
其实上述方法,查询到的结果并不理想,尽管用了并行化,还是很慢(我估计原因是,请求失败,重试多次),域名商采取一些策略阻止大规模查询,甚至被视为DDOS攻击。详情可以参见StackOverflow的问题:How to find out programmatically if a domain name is registered or not
参考资料:
[1]Blog: Parallelism in one line