在python中,在逗号分隔的域名列表上执行DNS查询的最有效方法是什么?

时间:2012-08-21 12:54:47

标签: python dns

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

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

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

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

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

2 个答案:

答案 0 :(得分: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

我不建议使用csv,因为每行只有两个值。如果你需要处理引用字符之类的东西,或者如果你需要编写csv文件等,请使用它。

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

答案 1 :(得分:0)

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