Wie kann ich eine "Keep Alive" HTTP-Anfrage mit Pythons urllib2 erstellen?
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.
Versuchen Sie urllib3 , das die folgenden Funktionen aufweist:
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 :
Oder checke die HTTPConnection von httplib aus.
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:
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
Bitte vermeiden Sie kollektive Schmerzen und verwenden Sie stattdessen Requests . Es wird standardmäßig das Richtige tun und ggf. Keep-Alive verwenden.
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