Skip to main content
 首页 » 编程设计

python之增加 python 脚本的吞吐量

2024年08月12日33sky-heaven

我正在通过挖掘处理来自 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/ 的示例)