gpt4 book ai didi

python - 增加 python 脚本的吞吐量

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:24 24 4
gpt4 key购买 nike

我正在通过挖掘处理来自 DNSBL 的数千个域名列表,创建 URL 和 IP 的 CSV。这是一个非常耗时的过程,可能需要几个小时。我服务器的 DNSBL 每十五分钟更新一次。有没有一种方法可以增加 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,修改下面的示例代码应该很简单,但是,为了让事情变得有趣(并且希望更像 pythonic),让我们为此使用一个现有模块:dnspython

所以,安装它:

sudo pip install -f http://www.dnspython.org/kits/1.8.0/ dnspython

然后尝试如下操作:

import threading
from dns import resolver

class Resolver(threading.Thread):
def __init__(self, address, result_dict):
threading.Thread.__init__(self)
self.address = address
self.result_dict = result_dict

def run(self):
try:
result = resolver.query(self.address)[0].to_text()
self.result_dict[self.address] = result
except resolver.NXDOMAIN:
pass


def main():
infile = open("domainlist", "r")
intext = infile.readlines()
threads = []
results = {}
for address in [address.strip() for address in intext if address.strip()]:
resolver_thread = Resolver(address, results)
threads.append(resolver_thread)
resolver_thread.start()

for thread in threads:
thread.join()

outfile = open('final.csv', 'w')
outfile.write("\n".join("%s,%s" % (address, ip) for address, ip in results.iteritems()))
outfile.close()

if __name__ == '__main__':
main()

如果这证明同时启动太多线程,您可以尝试分批执行,或使用队列(参见 http://www.ibm.com/developerworks/aix/library/au-threadingpython/ 的示例)

关于python - 增加 python 脚本的吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3089413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com