用Python批量查询域名(并行化,附源代码)

本文分享用Python批量查询域名的方法,并用并行化,加速查询。

1. 写在前面

批量查询域名,最开始我是从网上下载工具(还一口气用了好几次域名查询工具,唉),效果很不理想(定制有限,后缀支持有限)。后来,发现GoDaddy提供批量查询,链接在这里,但最多一次只能查500个,有时还不能成功返回,还有每次去选中域名后缀也是很累的事。

随着对Python熟悉度增加,开始用Python批量查询域名。这种酸爽,像是发现了另一片天空。不过,还是有问题,比如大批量查询,被域名商拒绝,甚至被认为是DDOS攻击。

以下结合源代码简要介绍,源代码已分享在GitHub,在这里

2. 产生域名组合

我用一种很粗爆的方法产生域名组合:全排列。使用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

3. 查询域名

用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

4. 并行化查询

上面的查询,总共需要查询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

5. 查询结果

我将查询结果放在GitHub,在这里(晚点添加)。本以为12w+很快就跑完了,没想到跑了一两个小时,才把.net跑出来,结果如下:

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

实际上,这4个域名都已经被注册了,可见很不准确。我还遍历了2-4位数字的所有.com域名,返回的结果是这个鬼样:

      4 connect: Network is unreachable
      1 getaddrinfo(whois.dnr.la): No address associated with hostname
      1 getaddrinfo(whois.threadagent.com): Name or service not known
    213 Timeout.

6. 交流讨论

6.1 域名价值

域名投资大不如从前了,理由如下:

  • .com,好的域名几乎都注完了,4个字母的组合全部注册完了(我用上述方法测试过了),英语单词,双拼
  • 域名后缀越来越多了,在这里New Domain Release Dates可以查看新域名后缀发布日期。不过话又说回来,域名后缀越来越多,进一步突显了.com域名的价值:-)
  • 移动互联网兴起,访问入口从搜索引擎,应用进入
  • 其他原因

6.2 更效地查询

其实上述方法,查询到的结果并不理想,尽管用了并行化,还是很慢(我估计原因是,请求失败,重试多次),域名商采取一些策略阻止大规模查询,甚至被视为DDOS攻击。详情可以参见StackOverflow的问题:How to find out programmatically if a domain name is registered or not

参考资料:
[1]Blog: Parallelism in one line

发表评论

电子邮件地址不会被公开。 必填项已用*标注