Comment puis-je faire une requête HTTP "garder en vie" en utilisant urllib2 de Python?
Utilisez la bibliothèque urlgrabber . Cela inclut un gestionnaire HTTP pour urllib2 qui prend en charge HTTP 1.1 et keepalive:
>>> 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')
Remarque: vous devez utiliser urlgrabber version 3.9.0 ou antérieure, car le module keepalive a été supprimé de la version 3.9.1.
Il existe un port du module keepalive vers Python 3.
Essayez urllib3 qui présente les caractéristiques suivantes:
ou une solution beaucoup plus complète - Requests - qui prend en charge le maintien en vie de version 0.8.0 (en utilisant urllib3 en interne) et qui présente les caractéristiques suivantes :
Ou consultez le/HTTPConnection de httplib .
Malheureusement, keepalive.py a été retiré d'urlgrabber le 25 septembre 2009 par le changement suivant, qui changeait après en remplaçant urlgrabber par pycurl (qui prend en charge le maintien en vie):
_ { http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94 }
Cependant, vous pouvez toujours obtenir la dernière révision de keepalive.py ici:
Notez que urlgrabber ne fonctionne pas entièrement avec Python 2.6. J'ai corrigé les problèmes (je pense) en apportant les modifications suivantes dans keepalive.py.
Dans keepalive.HTTPHandler.do_open (), supprimez cette
if r.status == 200 or not HANDLE_ERRORS:
return r
Et insérer ceci
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
Veuillez éviter les douleurs collectives et utilisez Demandes à la place. Il fera le bon choix par défaut et utilisera Keep-Alive si applicable.
Voici une urlopen () un peu similaire qui maintient en vie, bien que ce ne soit pas threadsafe.
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