将本地urllib设置为本地?

时间:2013-07-24 05:55:20

标签: python urllib

我有一个多线程进程。对于每个线程,运行以下代码;但是,它会将用于每个线程的代理覆盖到添加的最新代理。有没有办法让这个代理设置在线程本地?

        self.p_handler = urllib.request.ProxyHandler({'http' : self.proxy})
        self.opener = urllib.request.build_opener(self.p_handler)
        urllib.request.install_opener(self.opener)
        urllib.request.urlretrieve(url, filename)

1 个答案:

答案 0 :(得分:2)

不要使用install_opener(全局安装它),只需调用open对象的opener方法,然后将结果传输到文件中。

self.p_handler = urllib.request.ProxyHandler({'http' : self.proxy})
self.opener = urllib.request.build_opener(self.p_handler)
result = self.opener.open(url)
with open(filename, 'wb') as f:
    for chunk in iter(lambda: result.read(1024), ''):
        f.write(chunk)

这里的最后两行只是为了避免将整个文件保存在内存中;它们允许它以千字节大小的形式流过。如果你不介意在内存中使用它,最后一点会变得更简单:

result = self.opener.open(url)
with open(filename, 'wb') as f:
    f.write(result.read())