Estoy haciendo varias solicitudes http a un host en particular usando la biblioteca urllib2 de python. Cada vez que se realiza una solicitud, se crea una nueva conexión http y tcp que toma una cantidad de tiempo notable. ¿Hay alguna forma de mantener viva la conexión tcp/http usando urllib2?Cómo acelerar el urllib2 de Python al hacer varias solicitudes
Respuesta
Si cambia a httplib, tendrá un control más preciso sobre la conexión subyacente.
Por ejemplo:
import httplib
conn = httplib.HTTPConnection(url)
conn.request('GET', '/foo')
r1 = conn.getresponse()
r1.read()
conn.request('GET', '/bar')
r2 = conn.getresponse()
r2.read()
conn.close()
Esto enviaría 2 HTTP GET en la misma conexión TCP subyacente.
He usado la biblioteca de terceros urllib3
con buenos resultados en el pasado. Está diseñado para complementar urllib2
agrupando conexiones para su reutilización.
ejemplo Modificado de the wiki:
>>> from urllib3 import HTTPConnectionPool
>>> # Create a connection pool for a specific host
... http_pool = HTTPConnectionPool('www.google.com')
>>> # simple GET request, for example
... r = http_pool.urlopen('GET', '/')
>>> print r.status, len(r.data)
200 28050
>>> r = http_pool.urlopen('GET', '/search?q=hello+world')
>>> print r.status, len(r.data)
200 79124
No puedo encontrar esta biblioteca, el enlace está muerto. ¿Te importaría mirar http://stackoverflow.com/questions/18221809/sending-a-few-requests-using-one-connection? –
Si necesita algo más automático que httplib llano, esto podría ayudar, aunque no es THREADSAFE.
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. ¿Cómo hacer solicitudes de urllib2 a través de Tor en Python?
- 2. Mantener el orden de las solicitudes al hacer varias devoluciones de llamada ajax
- 3. Python URLLib/URLLib2 POST
- 4. varias solicitudes de una HttpURLConnection
- 5. Python: Urllib2 y OpenCV
- 6. Python - urllib2 y cookielib
- 7. NSURLConnection sendAsynchronousRequest: queue: completionHandler: hacer varias solicitudes en una fila?
- 8. Python urllib2 con keep alive
- 9. ¿Cómo manejar el tiempo de espera de urllib2? - Python
- 10. Python y urllib2: cómo hacer una solicitud GET con los parámetros
- 11. Python urllib2 Encabezado de respuesta
- 12. ¿Acelerar el acceso al sistema de archivos?
- 13. Python: urllib/urllib2/httplib confusion
- 14. Python urllib2 autenticación básica Problema
- 15. ¿Cómo puedo acelerar la consulta de MySQL con varias combinaciones?
- 16. Establecer host-header al usar Python y urllib2
- 17. RSS Manejo de redirecciones con Python/urllib2
- 18. ¿Cómo puedo acelerar los hilos de Python?
- 19. python: urllib2 cómo enviar cookies con la solicitud de urlopen
- 20. Cómo acelerar el bucle de pitón
- 21. Interfaz de origen con Python y urllib2
- 22. Python - Ejemplo de solicitud asíncrona/subprocesada de urllib2 mediante HTTPS
- 23. Cómo acelerar SELECT .. LIKE consultas en MySQL en varias columnas?
- 24. ¿Es posible acelerar Python IO?
- 25. ¿La mayoría de los navegadores realizan varias solicitudes HTTP al mostrar un PDF desde el navegador?
- 26. Proxies con el módulo 'Solicitudes' de Python
- 27. ¿Cómo hacer que Compass vea varias carpetas al mismo tiempo?
- 28. python urllib2: restablecimiento de conexión por pares
- 29. Python: ¿Procesamiento de Javascript con urllib2?
- 30. Proceso de Python bloqueado por urllib2
Esa es una buena respuesta ya que httplib es parte de python. Eso nos ahorra tener que instalar un módulo de terceros. ¡Gracias! –
Tal vez sea para alguien útil, también existe HTTPSConnection. – Petr