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的最新版本:

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 

请避免集体痛苦,并使用请求 。 它会默认做正确的事情,如果适用的话,使用保持活着。

这里有一个有点类似的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