Python urllib2 avec keep alive
Comment puis-je faire une requête HTTP" keep alive " en utilisant urllib2 de Python?
7 réponses
utilisez la bibliothèque urlgrabber . Cela inclut un gestionnaire HTTP pour urllib2 qui supporte 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')
Note: vous devez utiliser la version d'urlgrabber 3.9.0 ou une version antérieure, car le module keepalive a été supprimé dans la version 3.9.1
il y a un port du module keepalive à Python 3.
Essayer urllib3 qui a les caractéristiques suivantes:
- réutiliser la même connexion de socket pour les requêtes multiples (HTTPConnectionPool et HTTPSConnectionPool) (avec vérification facultative du certificat côté client).
- affichage de fichier (encode_multipart_formdata).
- redirection et retouches intégrées (optionnelles).
- supporte le décodage gzip et deflate.
- Thread-safe et santé mentale-fort.
- petit et facile à comprendre codebase parfait pour étendre et construire sur. Pour une solution plus complète, consultez les demandes.
ou une solution plus complète - Demandes - qui prend en charge keep-alive de version 0.8.0 (en utilisant urllib3 à l'interne) et les suivantes caractéristiques :
- Extremely simple HEAD, GET, POST, PUT, PATCH, DELETE Requests.
- Gevent de soutien pour un Système de Demandes.
- Sessions avec persistance des cookies.
- Basic, Digest, et Personnalisée en charge de l'Authentification.
- Automatique de formulaire de codage des dictionnaires
- une interface de dictionnaire simple pour les cookies de requête/réponse.
- téléchargement de fichiers en plusieurs parties.
- Automatc décodage de l'Unicode, gzip et deflate réponses.
- prise en charge complète des URLs unicode et des noms de domaine.
malheureusement keepalive.py a été supprimé de urlgrabber le 25 septembre 2009 par le changement suivant après que urlgrabber a été modifié pour dépendre de pycurl (qui soutient keep-alive):
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 faisant les modifications suivantes en keepalive.py.
dans keepalive.HTTPHandler.do_open () supprimer ce
if r.status == 200 or not HANDLE_ERRORS:
return r
et ajouter
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
s'il vous Plaît évitez de douleur collective et l'utilisation Demandes à la place. Il fera la bonne chose par défaut et utilisera keep-alive s'il y a lieu.
voici un urlopen() quelque peu similaire qui se 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