Pythonのurllib2を使用して「キープアライブ」HTTPリクエストを作成するにはどうすればよいですか?
rlgrabber ライブラリを使用します。これには、HTTP 1.1およびキープアライブをサポートする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')
注: keepalive モジュールはバージョン3.9.1で削除されているため、urlgrabberバージョン .9. 以前を使用する必要があります。
Python 3.へのキープアライブモジュールの port があります。
次の機能を備えた rllib を試してください。
またはより包括的なソリューション- Requests - version 0.8.0からのキープアライブをサポートし(urllib3を内部で使用)、次の 機能 =:
または httplib のHTTPConnectionを確認してください。
残念ながら、urlgrabberがpycurl(キープアライブをサポートする)に依存するように変更された後、次の変更によりkeepalive.pyが2009年9月25日にurlgrabberから削除されました。
http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94
ただし、ここでもkeepalive.pyの最新のリビジョンを取得できます。
python 2.6ではurlgrabberが完全に機能しないことに注意してください。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
集団的な痛みを避け、代わりに Requests を使用してください。デフォルトで適切な処理を行い、該当する場合はキープアライブを使用します。
スレッドセーフではありませんが、キープアライブを行う多少似た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