web-dev-qa-db-ja.com

Python urllib2 with keep alive

Pythonのurllib2を使用して「キープアライブ」HTTPリクエストを作成するにはどうすればよいですか?

43
ibz

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 があります。

34
msanders

次の機能を備えた rllib を試してください。

  • 複数の要求(HTTPConnectionPoolおよびHTTPSConnectionPool)に同じソケット接続を再利用します(オプションのクライアント側の証明書検証を使用)。
  • ファイル投稿(encode_multipart_formdata)。
  • 組み込みのリダイレクトと再試行(オプション)。
  • Gzipとdeflateのデコードをサポートします。
  • スレッドセーフおよびサニティセーフ。
  • 小さくて理解しやすいコードベースで、拡張および構築に最適です。より包括的なソリューションについては、リクエストをご覧ください。

またはより包括的なソリューション- Requests - version 0.8.0からのキープアライブをサポートし(urllib3を内部で使用)、次の 機能 =:

  • 非常にシンプルなHEAD、GET、POST、PUT、PATCH、DELETEリクエスト。
  • 非同期リクエストのGeventサポート。
  • Cookieの永続性を備えたセッション。
  • 基本認証、ダイジェスト認証、カスタム認証のサポート。
  • 辞書の自動フォームエンコーディング
  • リクエスト/レスポンスCookieのシンプルな辞書インターフェース。
  • マルチパートファイルのアップロード。
  • Unicode、gzip、およびdeflate応答のAutomatcデコード。
  • ユニコードURLとドメイン名の完全サポート。
13
Piotr Dobrogost

または httplib のHTTPConnectionを確認してください。

7
Mark

残念ながら、urlgrabberがpycurl(キープアライブをサポートする)に依存するように変更された後、次の変更によりkeepalive.pyが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

5
jwatt

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
4
speedplane

集団的な痛みを避け、代わりに 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
0
Collin Anderson