web-dev-qa-db-fra.com

Python urllib2 avec Keep Alive

Comment puis-je faire une requête HTTP "garder en vie" en utilisant urllib2 de Python?

41
ibz

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.

32
msanders

Essayez urllib3 qui présente les caractéristiques suivantes:

  • Réutilisez la même connexion de socket pour plusieurs demandes (HTTPConnectionPool et HTTPSConnectionPool) (avec vérification facultative du certificat côté client).
  • Enregistrement de fichier (encode_multipart_formdata).
  • Redirection et tentatives intégrées (facultatif).
  • Prend en charge le décodage gzip et dégonfler.
  • Fil-safe et sanity-safe.
  • Petit et facile à comprendre, le code base est parfait pour l’extension et la construction. Pour une solution plus complète, consultez Demandes.

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 :

  • Extrêmement simple, HEAD, GET, POST, PUT, PATCH, DELETE Requests.
  • Prise en charge de Gevent pour les requêtes asynchrones.
  • Sessions avec persistance des cookies.
  • Prise en charge de l'authentification de base, Digest et personnalisée.
  • Encodage automatique des dictionnaires
  • Une interface de dictionnaire simple pour les cookies de demande/réponse.
  • Téléchargement de fichiers en plusieurs parties.
  • Décodage automatique des réponses Unicode, gzip et deflate.
  • Prise en charge complète des URL et noms de domaine Unicode.
13
Piotr Dobrogost

Ou consultez le/HTTPConnection de httplib .

7
Mark

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:

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

5
jwatt

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
4
speedplane

Veuillez éviter les douleurs collectives et utilisez Demandes à la place. Il fera le bon choix par défaut et utilisera Keep-Alive si applicable.

3
Prof. Falken

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
0
Collin Anderson