1

我想编写一个脚本来为我的缓存 dns 服务器预取域名列表。我正在使用来自 Alexa 的前 1,000,000 个访问网站,可在此处获得:

http://s3.amazonaws.com/alexa-static/top-1m.csv.zip

如何编写 Python 脚本来读取此 CSV 文件并对列出的每个域名执行“nslookup”(或更有效的方式),每个查询之间可能会有轻微延迟?还是有更好的方法来做到这一点?

我猜逐行处理CSV而不是一次读取它以最大程度地减少内存使用会是最有效的。

具体来说,我正在寻找解决这个问题的策略(库、工具等......)。示例代码表示赞赏,但不是必需的。

4

2 回答 2

3

你可以完全坚持使用 python 标准模块,因为它们提供了你需要的一切。

由于open返回一个可迭代的文件对象(不将整个文件加载到内存中),您可以使用如下代码:

from socket import gethostbyaddr 

with open('top-1m.csv') as input:
    for line in input:
        index, host = line.strip().split(',')
        try: 
            output = gethostbyaddr(host)
            print "%s %s is %s/%s" % (index, host, output[0], output[2])
        except: 
            print host, "not found"

结果:

1 facebook.com 是 www-slb-10-08-prn1.facebook.com/['69.171.234.21']
2 google.com 是 fra07s07-in-f100.1e100.net/['209.85.148.100']
3 youtube .com 是 fra07s07-in-f93.1e100.net/['209.85.148.93']
4 yahoo.com 是 ir2.fp.vip.bf1.yahoo.com/['98.139.183.24']
baidu.com not found

我不推荐csv这里,因为每行总是只有两个值。如果您需要处理诸如引号字符之类的事情,或者如果您需要编写一个 csv 文件等,请使用它。

虽然twisted它也是一个很棒的网络模块,但对于这样一个简单的任务来说有点过分了。只需使用该socket模块。

于 2012-08-21T13:12:06.920 回答
0

模块,是的csv,你当然只是逐行阅读。对于进行 DNS 查找,我建议使用twisted.names.client

于 2012-08-21T13:04:58.797 回答