我有一个域名文件,例如相当于2500。
我想对这些域名做个调查。
问题是我从来没有这样做过,也不知道从哪里开始。如果你有什么想法,我洗耳恭听。
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查找
查找单个域名通常包括找到该域的相关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域,您在一分钟内最多只能查找三次,一些注册商会24小时禁止您登录。
最好在两次查找之间暂停几秒钟,或者尝试按TLD打乱您的域列表,这样您就不会连续太多次打扰同一服务器。
一些WHOIS服务器经常停机,请求将超时,这意味着您可能需要返回并重新进行这些查找。ICANN规定whois服务器必须有相当不错的正常运行时间,但我发现有一两台服务器在发布记录方面很糟糕。
正在分析记录
分析WHOIS记录(例如注册人联系信息)可能是一个挑战,因为:
记录的格式并不总是一致的。你会在.com域中发现这一点。.com记录可能由全球数千家注册商中的任何一家持有(不是由.com注册中心Verisign持有),并且并非所有注册商都选择以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)
从下载并安装Microsoft的whois工具http://technet.microsoft.com/en-us/sysinternals/bb897435.aspx
创建一个包含域名列表和标题行的文本文件。
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脚本。
您可以使用一个简单的"一个衬垫";使用命令CCD_ 10。
xargs -n 1 -a valid_dns.txt -I {} sh -c 'echo "Domain: {}"; whois {}'
++