¿Cómo puedo hacer una solicitud HTTP "keep alive" usando el urllib2 de Python?Python urllib2 con keep alive
Respuesta
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.
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
Gracias, pero sería bueno si explicaras lo que este fijo en lugar de ese comentario etiquetado inútil. – 2371
El r original y su resp son ambos
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í:
O echa un vistazo httplib 's HTTPConnection.
que funcionó para mí ... –
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 –
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.
Por favor, evite el dolor colectivo y use Requests en su lugar. Hará lo correcto por defecto y usar keep-alive si corresponde.
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í. –
@JeffersonHudson, no estaba al tanto de eso. Puede tener mejor suerte con https://github.com/requests/requests-ntlm –
Ya he propuesto Solicitudes en mi respuesta publicada más de un año antes de esta ... –
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
- 1. HTTP Keep Alive y TCP keep alive
- 2. NSURLConnection y keep-alive
- 3. UIWebView y keep-alive?
- 4. ¿Cómo funciona Keep-alive con ThreadPoolExecutor?
- 5. Tomcat, HTTP Keep-Alive y Java's HttpsUrlConnection
- 6. Node.js https.request with keep-alive header
- 7. Cómo deshabilitar Keep-Alive por Directorio
- 8. Habilitar Keep-Alive (Velocidad de página)
- 9. ¿Cómo enviar solicitudes consecutivas con HTTP keep-alive en node.js?
- 10. Posible habilitar Keep-alive con un balanceador de carga?
- 11. Uso de la función keep-alive en .htaccess
- 12. "Conexión: Keep-Alive" en la respuesta del servidor
- 13. cómo manejar la conexión keep alive en android Service
- 14. es una solicitud HTTP/1.1 implícitamente keep-alive por defecto?
- 15. Cómo probar HTTP Keep alive en realidad está funcionando
- 16. Implementando mensajes keep-alive en Netty usando WriteTimeoutHandler
- 17. ¿Cómo puedo desactivar HTTP Keep-Alive en ASP.NET MVC?
- 18. HTTP POST autenticado con carga útil XML usando Python urllib2
- 19. Autenticación HTTP básica no parece funcionar con urllib2 en python
- 20. Usar HTTP Keep-Alive para que el servidor se comunique con el cliente
- 21. HTTP no tiene estado, entonces, ¿qué quiere decir con keep-alive?
- 22. Python URLLib/URLLib2 POST
- 23. Python: ¿Procesamiento de Javascript con urllib2?
- 24. Interfaz de origen con Python y urllib2
- 25. Autenticación de Windows con Python y urllib2
- 26. cuelga detecta con Python urllib2.urlopen
- 27. RSS Manejo de redirecciones con Python/urllib2
- 28. Python: Urllib2 y OpenCV
- 29. Python - urllib2 y cookielib
- 30. ¿Por qué las conexiones persistentes no son compatibles con URLLib2?
Gracias David. He actualizado la respuesta en consecuencia. – msanders
Nuevo sitio: http://urlgrabber.baseurl.org/ –
Gracias @Forest: he actualizado el enlace en la respuesta. – msanders