質問

「キープアライブ」を作成するにはどうすればよいですか。 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から削除されました。

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top