我怎么可以做一个"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中删除了以下更改:

http://yum.baseurl.org/ ?的GitWeb p = urlgrabber.git; A =提交; H = f964aa8bdc52b29a2c137a917c72eecd4c4dda94

但是,您仍然可以在此处获取keepalive.py的最新修订版:

http: //yum.baseurl.org/gitweb?p=urlgrabber.git;a=blob_plain;f=urlgrabber/keepalive.py;hb=a531cb19eb162ad7e0b62039d19259341f37f3a6

请注意,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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top