Python的urllib2保持活着
我如何使用Python的urllib2做一个“保持活力”的HTTP请求?
使用urlgrabber库。 这包括支持HTTP 1.1和keepalive的urllib2的HTTP处理程序:
>>> import urllib2 >>> from urlgrabber.keepalive import HTTPHandler >>> keepalive_handler = HTTPHandler() >>> opener = urllib2.build_opener(keepalive_handler) >>> urllib2.install_opener(opener) >>> >>> fo = urllib2.urlopen('http://www.python.org')
注意:您应该使用urlgrabber版本3.9.0或更低版本,因为Keepalive模块已经在版本3.9.1中被删除
Python 3有一个端口 keepalive模块。
尝试urllib3 ,它具有以下function:
- 对于多个请求(HTTPConnectionPool和HTTPSConnectionPool)重复使用相同的套接字连接(可选的客户端证书validation)。
- 文件发布(encode_multipart_formdata)。
- 内置redirect和重试(可选)。
- 支持gzip和deflate解码。
- 线程安全和健全安全。
- 小巧且易于理解的代码库,非常适合扩展和构build。 要获得更全面的解决scheme,请查看请求。
或更全面的解决scheme – 请求 – 支持保持从0.8.0 版本 (在内部使用urllib3),并具有以下function :
- 非常简单的HEAD,GET,POST,PUT,PATCH,DELETE请求。
- asynchronous请求的Gevent支持。
- 会话与cookie的持久性。
- 基本,摘要和自定义身份validation支持。
- 词典的自动表单编码
- 请求/响应cookie的简单字典界面。
- 多部分file upload。
- Unicode,gzip和deflate响应自动解码。
- 全面支持unicodeurl和域名。
或者查看httplib的HTTPConnection。
不幸的是,keepalive.py在urlgrabber被更改为依赖pycurl(支持保持活动状态)之后在2009年9月25日从urlgrabber中被删除了:
http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94
但是,您仍然可以在此处获取keepalive.py的最新版本:
请注意,urlgrabber并不完全适用于python 2.6。 我通过在keepalive.py中进行以下修改来解决问题(我认为)。
在keepalive.HTTPHandler.do_open()删除这个
if r.status == 200 or not HANDLE_ERRORS: return r
并插入此
if r.status == 200 or not HANDLE_ERRORS: # [speedplane] Must return an adinfourl object resp = urllib2.addinfourl(r, r.msg, req.get_full_url()) resp.code = r.status resp.msg = r.reason return resp
请避免集体痛苦,并使用请求 。 它会默认做正确的事情,如果适用的话,使用保持活着。
这里有一个有点类似的urlopen(),虽然它不是线程安全的,但它保持活跃。
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