4

我使用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
4

1 回答 1

21

这是一个很难解决的问题,比大多数人意识到的要棘手。原因是有些人不想你发现。大多数域名注册商使用大量黑魔法(即大量特定于 TLD 的黑客)来获得他们提供的漂亮列表,但他们经常弄错。当然,最终他们肯定会知道,因为他们拥有EPP访问权限,可以保存权威答案(但通常只有在您单击“订购”时才会这样做)。

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

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

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

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

于 2015-07-23T20:38:05.193 回答