キープアライブを使用したPython urllib2
-
10-07-2019 - |
質問
「キープアライブ」を作成するにはどうすればよいですか。 Pythonのurllib2を使用したHTTPリクエスト?
解決
urlgrabber ライブラリを使用します。これには、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')
注:urlgrabberバージョン 3.9.0 またはそれ以前、 keepalive モジュールはバージョン3.9.1で削除されたため
Python 3へのキープアライブモジュールのポートがあります。
他のヒント
次の機能を備えた urllib3 をお試しください。
- 複数の要求(HTTPConnectionPoolおよびHTTPSConnectionPool)に同じソケット接続を再利用します(オプションのクライアント側証明書検証を使用)。
- ファイルの投稿(encode_multipart_formdata)。
- 組み込みのリダイレクトと再試行(オプション)。
- gzipおよびdeflateデコードをサポートしています。
- スレッドセーフおよび健全性セーフ。
- 小さくて理解しやすいコードベースは、拡張および構築に最適です。より包括的なソリューションについては、リクエストをご覧ください。
またはより包括的なソリューション-リクエスト- version 0.8.0(内部でurllib3を使用)、次の機能:
- 非常にシンプルなHEAD、GET、POST、PUT、PATCH、DELETEリクエスト。
- 非同期リクエストのイベントサポート。
- Cookieの永続性を持つセッション。
- 基本、ダイジェスト、およびカスタム認証のサポート。
- 辞書の自動フォームエンコーディング
- リクエスト/レスポンスCookie用のシンプルな辞書インターフェイス。
- マルチパートファイルのアップロード。
- Unicode、gzip、およびdeflate応答の自動デコード。
- Unicode URLおよびドメイン名の完全サポート。
または httplib のHTTPConnectionをご覧ください。
残念ながらkeepalive.pyはurlgrabberがpycurl(キープアライブをサポートする)に依存するように変更された後、次の変更により2009年9月25日にurlgrabberから削除されました。
ただし、ここでは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