Pregunta

¿Cómo puedo hacer que un "se mantenga vivo"? ¿Solicitud HTTP usando urllib2 de Python?

¿Fue útil?

Solución

Utilice la biblioteca 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 de urlgrabber 3.9.0 o anterior, ya que el keepalive se ha eliminado en la versión 3.9.1

Hay un puerto del módulo keepalive a Python 3.

Otros consejos

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 opcional del certificado del lado del cliente).
  • Publicación de archivos (encode_multipart_formdata).
  • Redirección y reintentos integrados (opcional).
  • Admite la decodificación gzip y desinflar.
  • A prueba de hilos y sanidad.
  • Base de código pequeña y fácil de entender, perfecta para ampliar y desarrollar. Para una solución más completa, eche un vistazo a Solicitudes.

o una solución mucho más completa: Solicitudes , que admite mantener vivo desde versión 0.8.0 (usando urllib3 internamente) y tiene lo siguiente características :

  • Solicitudes HEAD, GET, POST, PUT, PATCH, DELETE extremadamente simples.
  • Soporte para solicitudes asincrónicas.
  • Sesiones con persistencia de cookies.
  • Soporte básico, resumen y autenticación personalizada.
  • Codificación automática de forma de diccionarios
  • Una interfaz de diccionario simple para las cookies de solicitud / respuesta.
  • Subidas de archivos de varias partes.
  • Decodificación automática de respuestas Unicode, gzip y desinflar.
  • Soporte completo para URL unicode y nombres de dominio.

O consulte la httplib 's HTTPConnection.

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

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

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

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

En keepalive.HTTPHandler.do_open () elimina 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

Evite el dolor colectivo y utilice Solicitudes en su lugar. Hará lo correcto por defecto y usará keep-alive si corresponde.

Aquí hay un urlopen () algo similar que mantiene vivo, aunque no es seguro.

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top