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í:
O consulte httplib de httplib.
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.