我正在处理一个从DNSBL到dig的数千个域名列表,创建一个url和ip的CSV。这是一个非常耗时的过程,可能需要几个小时。我服务器的DNSBL每隔15分钟更新一次。有没有方法可以提高Python脚本的吞吐量以跟上服务器的更新?在
编辑:根据需要编辑脚本。在
import re
import subprocess as sp
text = open("domainslist", 'r')
text = text.read()
text = re.split("\n+", text)
file = open('final.csv', 'w')
for element in text:
try:
ip = sp.Popen(["dig", "+short", url], stdout = sp.PIPE)
ip = re.split("\n+", ip.stdout.read())
file.write(url + "," + ip[0] + "\n")
except:
pass
嗯,可能是名字的决定让你花了这么长时间。如果不计算这个数(即,如果dig返回得非常快),Python应该能够轻松地处理数千个条目。在
也就是说,你应该尝试一种线程方法。这将(理论上)同时解析多个地址,而不是按顺序。您还可以继续使用dig来实现这一点,修改下面的示例代码应该很简单,但是,为了让事情变得有趣(希望更像python),让我们使用一个现有的模块来实现这个目的:dnspython
因此,请安装:
然后尝试以下方法:
^{pr2}$如果这证明同时启动了太多的线程,可以尝试分批执行,或者使用队列(参见http://www.ibm.com/developerworks/aix/library/au-threadingpython/示例)
这里的大部分时间都花在对
dig
的外部调用中,因此要提高该速度,您需要多线程。这将允许您同时对dig
运行多个调用。请参见示例:Python Subprocess.Popen from a thread。或者,可以使用Twisted(http://twistedmatrix.com/trac/)。在你没必要这么做。在
我会考虑使用纯Python库来执行DNS查询,而不是委托给
dig
,因为调用另一个进程可能相对耗时。(当然,在互联网上查找任何东西也相对耗时,因此gilesc所说的多线程仍然适用)谷歌搜索python dns将为您提供一些开始的选项。在相关问题 更多 >
编程相关推荐