2009-06-24 14 views

Respuesta

30

Utilice la biblioteca urlgrabber. Esto incluye un controlador HTTP para urllib2 que soporta HTTP 1.1 y mantenimiento de conexión:

>>> 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: se debe utilizar la versión urlgrabber 3.9.0 o más temprano, ya que el módulo keepalive se ha eliminado en la versión 3.9.1

Hay a port el módulo de keepalive a Python 3.

+0

Gracias David. He actualizado la respuesta en consecuencia. – msanders

+0

Nuevo sitio: http://urlgrabber.baseurl.org/ –

+0

Gracias @Forest: he actualizado el enlace en la respuesta. – msanders

4

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 esta

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

Y insertar este

 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 
+0

Gracias, pero sería bueno si explicaras lo que este fijo en lugar de ese comentario etiquetado inútil. – 2371

+0

El r original y su resp son ambos y ambos tienen los mismos atributos. addinfourl dice "clase para agregar los métodos info() y geturl() a un archivo abierto." pero el original ya tiene información() y geturl(). No se pudo calcular el beneficio. – 2371

4

Desafortunadamente keepalive.py fue retirado de urlgrabber el 25 sep 2009 por el siguiente cambio después fue urlgrabber cambiado para depender 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 del keepalive.py aquí:

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

7

O echa un vistazo httplib 's HTTPConnection.

+0

que funcionó para mí ... –

+1

cómo habilitar keep-alive para HTTPConnection? Intenté agregar 'Connection: Keep-Alive' a ambas solicitudes y encabezados de respuesta, pero' httplib' todavía se vuelve a conectar en cada solicitud –

11

Trate urllib3 que tiene las siguientes características:

  • reutilizar la misma conexión de zócalo para múltiples peticiones (HTTPConnectionPool y HTTPSConnectionPool) (con verificación de certificado de cliente opcional).
  • Publicación de archivos (encode_multipart_formdata).
  • Redirección integrada y reintentos (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 apoya keep-alive de version 0.8.0 (mediante el uso de urllib3 internamente) y tiene la siguiente features:

  • CABEZA extremadamente simple, GET, POST , PUT, PATCH, DELETE Solicitudes.
  • Compatibilidad con Gevent para solicitudes asincrónicas.
  • Sesiones con persistencia de cookies.
  • Soporte básico, resumen y autenticación personalizada.
  • Codificación automática de forma de los diccionarios
  • 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.
4

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

+0

Estoy trabajando en alguna autenticación NTLM y la biblioteca NTLM Peticiones no funciona correctamente. Sin embargo, la biblioteca urllib2 NTLM funciona correctamente. Esta pregunta fue, por lo tanto, útil para mí. –

+0

@JeffersonHudson, no estaba al tanto de eso. Puede tener mejor suerte con https://github.com/requests/requests-ntlm –

+1

Ya he propuesto Solicitudes en mi respuesta publicada más de un año antes de esta ... –

0

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 
Cuestiones relacionadas