Come posso fare una richiesta HTTP "keep alive" usando urllib2 di Python?Python urllib2 con keep alive
risposta
Utilizzare la libreria urlgrabber. Questo include un gestore HTTP per urllib2 che supporta HTTP 1.1 e 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: si consiglia di utilizzare la versione urlgrabber 3.9.0 o precedenti, come il modulo keepalive è stato rimosso nella versione 3.9.1
C'è a port il modulo keepalive a Python 3.
Nota che urlgrabber non funziona completamente con Python 2.6. Ho risolto i problemi (credo) apportando le seguenti modifiche in keepalive.py.
In keepalive.HTTPHandler.do_open() rimuovere questo
if r.status == 200 or not HANDLE_ERRORS:
return r
E inserire questo
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
Grazie, ma sarebbe bello se tu spiegassi cosa ha risolto invece di quel commento taggato inutile. – 2371
L'originale r e il tuo resp sono entrambi
Purtroppo keepalive.py è stato rimosso dal urlgrabber il 25 Settembre 2009 dal seguente cambiamento dopo urlgrabber era cambiato per dipendere da pycurl (che supporta keep-alive):
http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94
.210Tuttavia, è ancora possibile ottenere l'ultima revisione di keepalive.py qui:
O controllare httplib s' HTTPConnection.
che ha funzionato per me ... –
come abilitare keep-alive per HTTPConnection? Ho provato ad aggiungere 'Connection: Keep-Alive' a entrambe le richieste e le intestazioni di risposta, ma' httplib' si riconnette ancora su ogni richiesta –
Prova urllib3 che ha le seguenti caratteristiche:
- riutilizzare la stessa connessione socket per richieste multiple (HTTPConnectionPool e HTTPSConnectionPool) (con la verifica dei certificati lato client opzionale).
- Pubblicazione di file (encode_multipart_formdata).
- Reindirizzamento e tentativi interni (facoltativo).
- Supporta la decodifica gzip e deflate.
- thread-safe e sanity-safe.
- Base di codice piccola e facile da comprendere, perfetta per estendere e sviluppare. Per una soluzione più completa, dai un'occhiata a Richieste.
o una soluzione molto più completo - Requests - che supporta keep-alive da version 0.8.0 (utilizzando urllib3 internamente) ed ha il seguente features:
- estremamente semplice HEAD, GET, POST , PUT, PATCH, DELETE Richieste.
- Supporto Gevent per richieste asincrone.
- Sessioni con persistenza dei cookie.
- Supporto per l'autenticazione di base, di digitazione e personalizzata.
- Codifica automatica dei dizionari
- Una semplice interfaccia di dizionario per i cookie di richiesta/risposta.
- Caricamenti di file multipart.
- Decodifica automatica di risposte Unicode, gzip e deflate.
- Supporto completo per URL unicode e nomi di dominio.
Si prega di evitare il dolore collettivo e utilizzare Requests invece. Farà la cosa giusta per impostazione predefinita e usa keep-alive se applicabile.
Sto lavorando su qualche autenticazione NTLM e la libreria delle richieste NTLM non funziona correttamente. Tuttavia, la libreria NTLM urllib2 funziona correttamente. Questa domanda è stata quindi utile per me. –
@JeffersonHudson, non ne ero a conoscenza. Potresti avere più fortuna con https://github.com/requests/requests-ntlm –
Ho già proposto richieste nella mia risposta pubblicate più di un anno prima di questa ... –
Ecco un urlopen() un po 'simile che mantiene in vita, anche se non è sicuro.
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 e TCP keep alive
- 2. NSURLConnection e keep-alive
- 3. iOS e Go - Keep-Alive con NSURLSession
- 4. HTTP keep-alive in node.js
- 5. Problemi keep-alive di connessione
- 6. Abilita keep-alive (velocità pagina)
- 7. Utilizzo della funzione keep-alive in .htaccess
- 8. "Connessione: keep-alive" nella risposta del server
- 9. apache proxy to tomcat keep alive confusion
- 10. È possibile abilitare Keep-alive con un bilanciamento del carico?
- 11. Come inviare richieste consecutive con HTTP keep-alive in node.js?
- 12. AFNetworking/NSURLConnection HTTPS keep alive mostra un comportamento strano
- 13. C# Come impostare HttpClient Keep-Alive su false
- 14. come gestire la connessione keep alive in servizio Android
- 15. HTTP non ha una statistica, quindi cosa significa keep-alive?
- 16. SPDY è diverso da multiplexing http su connessioni keep alive
- 17. Come disabilitare HTTP Keep-Alive in ASP.NET MVC?
- 18. Come testare HTTP Keep alive funziona in realtà
- 19. Puoi usare gzip su SSL? E connessione: intestazioni Keep-Alive
- 20. Implementazione di messaggi keep-alive in Netty utilizzando WriteTimeoutHandler
- 21. Python Urllib2 Cookiejar con selenio
- 22. POST HTTP autenticato con payload XML utilizzando Python urllib2
- 23. Python URLLib/URLLib2 POST
- 24. Python - urllib2 & cookielib
- 25. Python urllib2 Intestazione risposta
- 26. Python urllib2 Errori
- 27. Python: Urllib2 e OpenCV
- 28. Python - POSTARE con un opener urllib2
- 29. Handling rss reindirizza con Python/urllib2
- 30. Autenticazione di Windows con Python e urllib2
Grazie David. Ho aggiornato la risposta di conseguenza. – msanders
Nuovo sito: http://urlgrabber.baseurl.org/ –
Grazie @Forest: ora ho aggiornato il collegamento nella risposta. – msanders