线程化HTTP请求(带代理)

时间:2011-07-01 09:09:00

标签: python twisted urllib2

我看过类似的问题,但似乎对使用HTTP处理线程的最佳方式存在很多分歧。

我特别想做的事情:我正在使用Python 2.7,我想尝试使用每个SOCKS5代理来处理HTTP请求(特别是POST事物)。代码我已经工作了,但是相当缓慢,因为它等待每个请求(到代理服务器,然后是Web服务器)在启动另一个之前完成。每个线程最有可能使用不同的SOCKS代理发出不同的请求。

到目前为止,我一直在使用urllib2。我查看了像PycURL这样的模块,但是在Windows上使用Python 2.7进行正确安装是非常困难的,我想支持它,我正在编写代码。我愿意使用任何其他模块。

我特别关注了这些问题:

Python urllib2.urlopen() is slow, need a better way to read several urls

Python - Example of urllib2 asynchronous / threaded request using HTTPS

许多例子得到了支持和争论。假设评论者是正确的,使用像Twisted这样的异步框架的客户端听起来像是最快的使用方法。但是,我用Google搜索,并没有为SOCKS5代理提供任何形式的支持。我目前正在使用Socksipy模块,我可以尝试类似:

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, IP, port)
socks.wrapmodule(twisted.web.client)

我不知道这是否会起作用,我甚至不知道Twisted是否是我真正想要使用的。我也可以使用线程模块并将其用于我当前的urllib2代码,但如果这比Twisted慢得多,我可能不想打扰。有没有人有任何见解?

1 个答案:

答案 0 :(得分:3)

也许更简单的方法就是依靠gevent(或eventlet)来打开许多与服务器的连接。这些库monkeypatch urllib然后使异步,同时仍然让你编写sync-ish代码。它们与线程相比较小的开销也意味着你可以产生更多(1000s并不罕见)。

我使用了类似这样的东西(从here抄袭):

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

import gevent
from gevent import monkey

# patches stdlib (including socket and ssl modules) to cooperate with other greenlets
monkey.patch_all()

import urllib2


def print_head(url):
    print ('Starting %s' % url)
    data = urllib2.urlopen(url).read()
    print ('%s: %s bytes: %r' % (url, len(data), data[:50]))

jobs = [gevent.spawn(print_head, url) for url in urls]