Python的urllib2的与保活Python的urllib2的与保活(Python urllib

2019-05-13 17:01发布

我怎样才能让使用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


文章来源: Python urllib2 with keep alive