Pythonのurllib2を使用して「キープアライブ」HTTPリクエストを作成するにはどうすればよいですか?
7 に答える
urlgrabberライブラリを使用します。これには、HTTP1.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')
注:キープアライブモジュールはバージョン3.9.1で削除されているため、urlgrabberバージョン3.9.0以前を使用する必要があります。
Python3へのキープアライブモジュールのポートがあります。
次の機能を持つurllib3を試してください。
- 複数のリクエスト (HTTPConnectionPool および HTTPSConnectionPool) に同じソケット接続を再利用します (オプションのクライアント側の証明書検証を使用)。
- ファイル投稿 (encode_multipart_formdata)。
- 組み込みのリダイレクトと再試行 (オプション)。
- gzip および deflate デコードをサポートします。
- スレッドセーフでサニティセーフ。
- 小さくて理解しやすいコードベースで、拡張や構築に最適です。より包括的なソリューションについては、リクエストをご覧ください。
または、はるかに包括的なソリューション -リクエスト-バージョン0.8.0 から (内部で urllib3 を使用して)キープアライブをサポートし、次の機能を備えています。
- 非常に単純な HEAD、GET、POST、PUT、PATCH、DELETE リクエスト。
- 非同期リクエストの Gevent サポート。
- Cookie の永続性を伴うセッション。
- 基本、ダイジェスト、およびカスタム認証のサポート。
- 辞書の自動フォーム エンコーディング
- リクエスト/レスポンス Cookie 用のシンプルなディクショナリ インターフェイス。
- マルチパート ファイルのアップロード。
- Unicode、gzip、および deflate 応答の自動デコード。
- Unicode URL とドメイン名を完全にサポート。
またはhttplibの HTTPConnectionをチェックしてください。
残念ながら、2009 年 9 月 25 日に urlgrabber が pycurl (keep-alive をサポートする) に依存するように変更された後、次の変更により keepalive.py が urlgrabber から削除されました。
http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94
ただし、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
集団的な苦痛を避け、代わりにリクエストを使用してください。デフォルトで正しいことを行い、該当する場合はキープアライブを使用します。
これは、スレッドセーフではありませんが、キープアライブを行う多少似た 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