Question

Comment créer un " garder en vie " Requête HTTP utilisant l'urllib2 de Python?

Était-ce utile?

La solution

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 la version urlgrabber 3.9.0 ou antérieur, le module keepalive a été supprimé de la version 3.9.1.

Il existe un port du module keepalive vers Python 3.

Autres conseils

Essayez urllib3 qui présente les fonctionnalités 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 deflate.
  • Sans danger pour les fils et la santé mentale.
  • Petite base de code facile à comprendre, parfaite 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 la persistance de version 0.8.0 (en utilisant urllib3 en interne) et présente les éléments suivants: fonctionnalités :

  • Requête extrêmement simple: demandes HEAD, GET, POST, PUT, PATCH, DELETE.
  • Prise en charge de Gevent pour les requêtes asynchrones.
  • Sessions avec persistance de 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 requête / 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 des noms de domaine Unicode.

Ou consultez la connexion HTTP de httplib .

Évitez les douleurs collectives et utilisez plutôt Requêtes . Il fera le bon choix par défaut et utilisera le maintien en vie, le cas échéant.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top