Python urllib2 avec keep alive

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

40
demandé sur Piotr Dobrogost 2009-06-24 13:50:43

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.

31
répondu msanders 2018-03-19 17:56:38

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.
13
répondu Piotr Dobrogost 2011-11-11 11:32:31

or check out httplib 's HTTPConnection.

7
répondu Mark 2011-05-28 17:18:21

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):

http://yum.baseurl.org/gitweb?p=urlgrabber.git;a = commit;h = f964aa8bdc52b29a2c137a917c72eibouc4c4dda94

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=a531cb19eb162ad7e0b62039d19259341f37f3a6

5
répondu jwatt 2011-01-06 15:15:10

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
4
répondu speedplane 2011-12-07 10:10:16

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.

3
répondu Prof. Falken 2013-06-12 13:59:38

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
0
répondu Collin Anderson 2014-11-23 15:06:01