如何加速Python的urllib2进行多个请求
我正在使用Python的urllib2库向一个特定的主机发送多个HTTP请求。每次发送请求时,都会新建一个TCP和HTTP连接,这个过程需要花费不少时间。有没有办法在使用urllib2时保持TCP/HTTP连接一直处于活动状态呢?
3 个回答
0
如果你需要比普通的 httplib 更自动化的东西,这个可能会对你有帮助,不过它不是线程安全的。
try:
from http.client import HTTPConnection, HTTPSConnection
except ImportError:
from httplib import HTTPConnection, HTTPSConnection
import select
connections = {}
def request(method, url, body=None, headers={}, **kwargs):
scheme, _, host, path = url.split('/', 3)
h = connections.get((scheme, host))
if h and select.select([h.sock], [], [], 0)[0]:
h.close()
h = None
if not h:
Connection = HTTPConnection if scheme == 'http:' else HTTPSConnection
h = connections[(scheme, host)] = Connection(host, **kwargs)
h.request(method, '/' + path, body, headers)
return h.getresponse()
def urlopen(url, data=None, *args, **kwargs):
resp = request('POST' if data else 'GET', url, data, *args, **kwargs)
assert resp.status < 400, (resp.status, resp.reason, resp.read())
return resp
2
我以前用过第三方的 urllib3
库,效果很好。这个库是为了配合 urllib2
使用的,它的主要功能是把连接集中起来,以便重复使用。
下面是从 维基百科 修改过来的一个例子:
>>> from urllib3 import HTTPConnectionPool
>>> # Create a connection pool for a specific host
... http_pool = HTTPConnectionPool('www.google.com')
>>> # simple GET request, for example
... r = http_pool.urlopen('GET', '/')
>>> print r.status, len(r.data)
200 28050
>>> r = http_pool.urlopen('GET', '/search?q=hello+world')
>>> print r.status, len(r.data)
200 79124
27
如果你换用 httplib,你就能更好地控制底层的连接。
举个例子:
import httplib
conn = httplib.HTTPConnection(url)
conn.request('GET', '/foo')
r1 = conn.getresponse()
r1.read()
conn.request('GET', '/bar')
r2 = conn.getresponse()
r2.read()
conn.close()
这样做会在同一个底层的TCP连接上发送两个HTTP GET请求。