web-dev-qa-db-de.com

Python urllib2 mit Keep Alive

Wie kann ich eine "Keep Alive" HTTP-Anfrage mit Pythons urllib2 erstellen?

41
ibz

Verwenden Sie die Bibliothek urlgrabber . Dazu gehört ein HTTP-Handler für urllib2, der HTTP 1.1 und Keepalive unterstützt:

>>> 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')

Hinweis: Sie sollten die urlgrabber-Version 3.9.0 oder eine frühere Version verwenden, da das Modul keepalive in Version 3.9.1 entfernt wurde

Es gibt ein port des Keepalive-Moduls für Python 3.

32
msanders

Versuchen Sie urllib3 , das die folgenden Funktionen aufweist:

  • Verwenden Sie dieselbe Socketverbindung erneut für mehrere Anforderungen (HTTPConnectionPool und HTTPSConnectionPool) (mit optionaler clientseitiger Zertifikatsüberprüfung).
  • Dateibuchungen (encode_multipart_formdata).
  • Integrierte Umleitung und Wiederholungsversuche (optional).
  • Unterstützt gzip und deflate decoding.
  • Fadensicher und vernünftig.
  • Kleine und leicht verständliche Codebase, die sich hervorragend zum Erweitern und Bauen eignet. Eine umfassendere Lösung finden Sie unter Anfragen.

oder eine viel umfassendere Lösung - Requests - die Keep-Alive von Version 0.8.0 (durch Verwendung von urllib3 intern) unterstützt und die folgenden Funktionen hat :

  • Extrem einfache KOPF-, GET-, POST-, PUT-, PATCH-, DELETE-Requests.
  • Gevent-Unterstützung für Asyncronous Requests.
  • Sitzungen mit Cookie-Dauerhaftigkeit.
  • Unterstützung für Basic, Digest und Custom Authentication.
  • Automatische Formularverschlüsselung von Wörterbüchern
  • Eine einfache Wörterbuchoberfläche für Anfrage-/Antwort-Cookies.
  • Mehrteilige Dateiuploads.
  • Automatische Dekodierung von Unicode-, GZIP- und Deflate-Antworten.
  • Volle Unterstützung für Unicode-URLs und Domainnamen.
13
Piotr Dobrogost

Oder checke die HTTPConnection von httplib aus.

7
Mark

Leider wurde keepalive.py am 25. September 2009 durch die folgende Änderung aus urlgrabber entfernt, nachdem urlgrabber so geändert wurde, dass es von pycurl abhängt (das keep-alive unterstützt):

http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94

Die letzte Version von keepalive.py erhalten Sie jedoch weiterhin hier:

http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=blob_plain;f=urlgrabber/keepalive.py;hb=a531cb19eb162ad7e0b62039d19259341f37f3a6

5
jwatt

Beachten Sie, dass Urlgrabber nicht vollständig mit Python 2.6 funktioniert. Ich habe die Probleme behoben (denke ich), indem ich folgende Änderungen in keepalive.py vorgenommen habe.

Entfernen Sie dies in keepalive.HTTPHandler.do_open ()

     if r.status == 200 or not HANDLE_ERRORS:
         return r

Und füge das ein

     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

Bitte vermeiden Sie kollektive Schmerzen und verwenden Sie stattdessen Requests . Es wird standardmäßig das Richtige tun und ggf. Keep-Alive verwenden.

3
Prof. Falken

Hier ist ein etwas ähnliches urlopen (), das am Leben bleibt, obwohl es nicht threadsicher ist.

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