蟒蛇urllib2与保活
-
10-07-2019 - |
题
我怎么可以做一个"keep alive"HTTP请求使用Python urllib2?
解决方案
使用 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 或更早,因为版本3.9.1中已删除 keepalive 模块
有一个针对Python 3的keepalive模块的端口。
其他提示
尝试 urllib3 这具有以下特点:
- 重新使用同一座连接的多个请求(HTTPConnectionPool和HTTPSConnectionPool)(与任择客户的侧证书的验证)。
- 文件发布(encode_multipart_formdata).
- 内重新定向和重试(可选择)。
- 支持gzip和紧缩的解码。
- 线的安全和理智的安全。
- 小的和易于理解代码的完美的延伸和建筑物。为了更全面的解决办法,看看请求。
或者一个更全面的解决方案- 请求 -支持保持活动,从 版本 0.8.0(通过使用urllib3内部)和具有以下 功能:
- 非常简单的头,GET,POST,放、修补,删除请求。
- Gevent支持异步请求。
- 会议cookie persistience.
- 基本的摘要,并定的身份验证的支持。
- 自动形式编码的字典
- 一个简单的字典界面请求/回应饼干。
- 多部分文件上传。
- 机械全自动解码的Unicode,gzip,并放气的反应。
- 完全支持unicode的网址和域名。
或查看 httplib 的HTTPConnection。
不幸的是,在urlgrabber更改为依赖pycurl(支持keep-alive)之后,2009年9月25日keepalive.py从urlgrabber中删除了以下更改:
但是,您仍然可以在此处获取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
请避免集体痛苦并改为使用请求。默认情况下它会做正确的事情,如果适用的话,使用keep-alive。
这是一个有点相似的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
不隶属于 StackOverflow