42

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

4

7 に答える 7

34

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へのキープアライブモジュールのポートがあります。

于 2009-06-24T09:56:44.060 に答える
13

次の機能を持つ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 とドメイン名を完全にサポート。
于 2011-11-10T22:00:14.213 に答える
6

またはhttplibの HTTPConnectionをチェックしてください。

于 2011-05-28T16:54:26.673 に答える
5

残念ながら、2009 年 9 月 25 日に urlgrabber が pycurl (keep-alive をサポートする) に依存するように変更された後、次の変更により keepalive.py が 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

于 2011-01-06T02:51:07.950 に答える
4

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
于 2010-01-08T00:05:38.017 に答える
3

集団的な苦痛を避け、代わりにリクエストを使用してください。デフォルトで正しいことを行い、該当する場合はキープアライブを使用します。

于 2013-01-11T16:39:05.970 に答える
0

これは、スレッドセーフではありませんが、キープアライブを行う多少似た 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
于 2014-11-23T15:06:01.817 に答える