我有一个域名文件,例如相当于 2500。
我想对这些域名进行whois。
问题是我从来没有这样做过,也不知道从哪里开始。如果您有任何想法,我会全力以赴。
TIA。
您还可以使用 Linux 命令工具whois
。以下代码打开一个子进程并搜索域。
但是您必须在短时间内小心处理许多请求。一段时间后,服务器最终会阻止您。;)
import subprocess
def find_whois(domain):
# Linux 'whois' command wrapper
#
# Executes a whois lookup with the linux command whois.
# Returncodes from: https://github.com/rfc1036/whois/blob/master/whois.c
domain = domain.lower().strip()
d = domain.split('.')
if d[0] == 'www': d = d[1:]
# Run command with timeout
proc = subprocess.Popen(['whois', domain], stderr=subprocess.PIPE, stdout=subprocess.PIPE)
ans,err = proc.communicate(input)
if err == 1: raise WhoisError('No Whois Server for this TLD or wrong query syntax')
elif err == 2: raise WhoisError('Whois has timed out after ' + str(whois_timeout) + ' seconds. (try again later or try higher timeout)')
ans = ans.decode('UTF-8')
return ans
with open('domains.txt') as input:
with open('out.txt','a') as output:
for line in input:
output.write(find_whois(line))
该with open as
语句处理文件流。输出文件中的“a”表示文件以附加模式打开。
看起来您已经获得了一些有用的答案,但我认为最好多谈谈批量(和一般而言)进行 WHOIS 查询的挑战并提供一些替代解决方案。
查找单个域名通常需要找到该域的相关 WHOIS 服务器,然后通过端口 43 请求信息。如果您可以访问类似 unix 的 shell(例如 Bash),则可以使用whois
它轻松完成此操作(如前所述其他人):
$ whois example.com
非常相似的 WHOIS 工具也可用作大量编程语言的模块。Python 的 pywhois 模块就是一个例子。
以最简单的形式,批量 WHOIS 查询只是遍历域列表,为每个域发出 whois 请求并将记录写入输出。
这是 Bash 中的一个示例,它从文件中读取域domains.txt
并将每个 WHOIS 记录写入单独的文件(如果您使用的是 Windows,请尝试 Cygwin)。
#!/bin/bash
domain_list="domains.txt"
while read line
do
name=$line
echo "Looking up ${line}..."
whois $name > ${line}.txt
sleep 1
done < $domain_list
当心 WHOIS 批量查询的以下并发症:
某些 WHOIS 服务器可能无法为您提供完整的 WHOIS 记录。对于特定国家/地区的域(例如 .de 和 .fr)和在某些注册商处注册的域(例如 GoDaddy)尤其如此。
如果您想要尽可能完整的记录,您通常必须访问注册表的网站或可能已缓存记录的第三方服务(例如 DomainTools)。这更难以自动化,可能必须手动完成。即使这样,记录也可能不包含您想要的内容(例如,注册人的联系方式)。
某些 WHOIS 服务器会限制您在特定时间范围内可以发出的请求数量。如果您达到了限制,您可能会发现您必须在几个小时后返回才能再次请求记录。例如,对于 .org 域,您在一分钟内最多只能进行 3 次查找,并且一些注册商会在 24 小时内禁止您。
最好在查找之间暂停几秒钟,或者尝试通过 TLD 重新排列您的域列表,这样您就不会连续多次打扰同一台服务器。
一些 WHOIS 服务器经常停机,请求会超时,这意味着您可能需要返回并重新进行这些查找。ICANN 规定whois 服务器必须有相当长的正常运行时间,但我发现一两台服务器在提供记录方面很糟糕。
解析 WHOIS 记录(例如注册人联系信息)可能是一项挑战,因为:
记录的格式并不总是一致的。您会在 .com 域中发现这一点。.com 记录可能由全球数以千计的注册商中的任何一个持有(不是 .com 注册机构,威瑞信),并且并非所有人都选择以 ICANN 推荐的易于解析的格式呈现记录。
同样,您要提取的信息可能不在您从查找中返回的记录中。
由于已经提到过,pywhois 是解析 WHOIS 数据的一种选择。这是一个非常简单的 Python 脚本,它查找每个域的 WHOIS 记录并提取注册人姓名(如果可能*),将结果写入 CSV 文件。如果您愿意,也可以包含其他字段:
import whois
import csv
with open("domains.txt", "r") as f:
domains = f.readlines()
with open("output_file.csv", "wb") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["Domain", "Registrant Name"])
for domain in domains:
domain = domain.rstrip()
record = whois.whois(domain)
try:
r_name = record.registrant_name
except AttributeError:
r_name = "error"
writer.writerow([domain, r_name])
* 当我快速测试这个脚本时,pywhois 在提取注册人姓名时不是很可靠。您可以尝试的另一个类似库是pythonwhois
.
假设域在一个名为domains.txt
并且您已经pywhois
安装的文件中,那么这样的事情应该可以解决问题:
import whois
infile = "domains.txt"
# get domains from file
with open(infile, 'rb') as f:
domains = [line.rstrip() for line in f if line.rstrip()]
for domain in domains:
print domain
record = whois.whois(domain)
# write each whois record to a file {domain}.txt
with open("%s.txt" % domain, 'wb') as f:
f.write(record.text)
这会将每个 whois 记录输出到一个名为{domain}.txt
没有pywhois
:
import subprocess
infile = "domains.txt"
# get domains from file
with open(infile, 'rb') as f:
domains = [line.rstrip() for line in f if line.rstrip()]
for domain in domains:
print domain
record = subprocess.check_output(["whois", domain])
# write each whois record to a file {domain}.txt
with open("%s.txt" % domain, 'wb') as f:
f.write(record)
从http://technet.microsoft.com/en-us/sysinternals/bb897435.aspx下载并安装 Microsoft 的 whois 工具
创建一个包含域名列表的文本文件,并带有标题行。
name
google.com
yahoo.com
stackoverflow.com
创建一个powershell脚本:
$domainname = Import-Csv -Path "C:\domains.txt"
foreach($domain in $domainname)
{
.\whois.exe $domain.name Export-Csv -Path "C:\domain-info.csv" -Append
}
运行 powershell 脚本。