我怎样才能让使用Python的urllib2的“保持活动”的HTTP请求?
Answer 1:
使用urlgrabber库。 这包括的urllib2支持HTTP 1.1和存活的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或更早,作为保活模块已在3.9.1版本中删除
有一个端口的存活模块到Python 3的。
Answer 2:
尝试urllib3它具有以下特点:
- 重复使用多个请求同一个套接字连接(HTTPConnectionPool和HTTPSConnectionPool)(带有可选的客户端证书验证)。
- 文件发布(encode_multipart_formdata)。
- 内置的重定向和重试(可选)。
- 支持gzip和deflate解码。
- 线程安全和健全安全。
- 体积小,易于理解的代码库适合于扩展和建设。 为了更全面的解决方案,看看请求。
或者一个更全面的解决方案- 请 -支持保持活动从版本 0.8.0(通过使用urllib3内部),具有以下特点 :
- 极其简单的HEAD,GET,POST,PUT,PATCH,DELETE请求。
- 对于Asyncronous请求GEVENT支持。
- 会议与饼干persistience。
- 基本,摘要和自定义验证支持。
- 编码形式字典的自动
- 一个简单的字典接口,用于请求/响应的cookie。
- 多文件上传。
- Unicode中,以gzip Automatc解码以及放响应。
- 对于Unicode URL和域名的全面支持。
Answer 3:
入住或退房手续httplib的的HttpConnection的。
Answer 4:
不幸的是keepalive.py从urlgrabber通过以下变化取消了对2009年9月25日urlgrabber更改后依靠pycurl(支持保持活动):
http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94
但是,你仍然可以得到keepalive.py的最后一个版本在这里:
http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=blob_plain;f=urlgrabber/keepalive.py;hb=a531cb19eb162ad7e0b62039d19259341f37f3a6
Answer 5:
需要注意的是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
Answer 6:
请避免集体疼痛和使用要求来代替。 默认情况下将做正确的事情,并使用保活(如果适用)。
Answer 7:
这里有几分相似的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