libreria httperror example build_opener python http urllib2 keep-alive

example - urllib2 httperror python



Python urllib2 con mantener vivo (7)

¿Cómo puedo hacer una solicitud HTTP "mantener vivo" usando el urllib2 de Python?


Aquí hay un urlopen algo similar () que se mantiene activo, aunque no es seguro para los hilos.

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


Lamentablemente, keepalive.py fue eliminado de urlgrabber el 25 de septiembre de 2009 por el siguiente cambio después de cambiar urlgrabber para que dependa de pycurl (que admite keep-alive):

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

Sin embargo, todavía puede obtener la última revisión de keepalive.py aquí:

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



Por favor, evite el dolor colectivo y use las Requests lugar. Hará lo correcto por defecto y usar keep-alive si corresponde.


Pruebe urllib3 que tiene las siguientes características:

  • Reutilice la misma conexión de socket para múltiples solicitudes (HTTPConnectionPool y HTTPSConnectionPool) (con verificación de certificado opcional del lado del cliente).
  • Publicación de archivos (encode_multipart_formdata).
  • Redirección y reintentos incorporados (opcional).
  • Admite gzip y desinfla la decodificación.
  • Thread-safe y sanity-safe.
  • Base de código pequeña y fácil de entender, perfecta para ampliar y construir. Para una solución más completa, eche un vistazo a las solicitudes.

o una solución mucho más completa - Requests - que admite keep-alive desde la version 0.8.0 (mediante el uso interno de urllib3) y tiene las siguientes features :

  • Extremadamente simple HEAD, GET, POST, PUT, PATCH, DELETE Requests.
  • Soporte de Gevent para solicitudes asincrónicas.
  • Sesiones con persistencia de cookies.
  • Soporte de Autenticación Básica, Digest y Personalizada.
  • Codificación automática de forma de diccionarios
  • Una interfaz de diccionario simple para las cookies de solicitud / respuesta.
  • Subidas múltiples de archivos.
  • Decodificación automática de Unicode, gzip y desinfle las respuestas.
  • Soporte completo para URL Unicode y nombres de dominio.

Tenga en cuenta que urlgrabber no funciona del todo con Python 2.6. Solucioné los problemas (creo) haciendo las siguientes modificaciones en keepalive.py.

En keepalive.HTTPHandler.do_open () eliminar esto

if r.status == 200 or not HANDLE_ERRORS: return r

E inserte esto

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


Use la biblioteca de urlgrabber . Esto incluye un controlador HTTP para urllib2 que admite HTTP 1.1 y 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'')

Nota: debe usar la versión 3.9.0 o anterior de 3.9.0 , ya que el módulo keepalive se ha eliminado en la versión 3.9.1

Hay un port del módulo Keepalive para Python 3.