Jak mogę utworzyć żądanie HTTP "keep alive" za pomocą urllib2 w Pythonie?Python urllib2 z utrzymaniem przy życiu
Odpowiedz
Użyj biblioteki urlgrabber. Obejmuje to moduł obsługi HTTP dla urllib2 który obsługuje HTTP 1.1 i podtrzymywanie:
>>> 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')
Uwaga: należy użyć urlgrabber wersję 3.9.0 lub wcześniej, jak moduł keepalive został usunięty w wersji 3.9.1
Istnieje a port moduł keepalive do Pythona 3.
Pamiętaj, że urlgrabber nie działa w pełni w Pythonie 2.6. Naprawiłem problemy (myślę), wprowadzając następujące zmiany w pliku keepalive.py.
W keepalive.HTTPHandler.do_open() usunąć ten
if r.status == 200 or not HANDLE_ERRORS:
return r
i wstawić ten
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
Dzięki, ale byłoby miło, gdybyś wyjaśnił, co to naprawiono zamiast tego bezużytecznego oznaczonego komentarza. – 2371
Oryginalny r i twój resp są instancjami
niestety keepalive.py został usunięty z urlgrabber 25 wrz 2009 przez następującą zmianą było po urlgrabber zmienione tak, aby zależało od pycurl (który obsługuje utrzymywanie aktywności):
http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit;h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94
Jednak nadal można dostać ostatnią rewizję keepalive.py tutaj:
Albo sprawdzić httplib „s httpconnection.
, które zadziałało dla mnie ... –
jak włączyć podtrzymywanie połączenia HTTPConnection? Próbowałem dodać 'Connection: Keep-Alive' zarówno do żądań, jak i nagłówków odpowiedzi, ale' httplib' wciąż łączy się ponownie dla każdego żądania –
Spróbuj urllib3 który posiada następujące cechy:
- ponownie użyć tego samego połączenia z gniazdem dla wielu żądań (HTTPConnectionPool i HTTPSConnectionPool) (z opcjonalnym weryfikacji certyfikatów po stronie klienta).
- Publikowanie plików (encode_multipart_formdata).
- Wbudowane przekierowanie i ponowna próba (opcjonalnie).
- Obsługuje dekodowanie gzip i deflate.
- Bezpieczeństwo wątków i zdrowie psychiczne.
- Mała i łatwa do zrozumienia podstawa kodu idealna do rozbudowy i rozbudowy. Aby uzyskać bardziej kompleksowe rozwiązanie, zapoznaj się z Żądaniami.
lub znacznie bardziej kompleksowe rozwiązanie - Requests - który wspiera keep-alive z version 0.8.0 (za pomocą urllib3 wewnętrznie) i ma następującą features:
- Niezwykle prosty HEAD, GET, POST , PUT, PATCH, DELETE Żądania.
- Obsługa Gevent dla żądań asynchronicznych.
- Sesje z uporczywością plików cookie.
- Obsługa uwierzytelniania podstawowego, zaawansowanego i niestandardowego.
- Automatyczne kodowanie formularzy słowników
- Prosty interfejs słownika plików cookie żądania/odpowiedzi.
- Przesyłanie wielu plików.
- Automatyczne dekodowanie odpowiedzi Unicode, gzip i deflate.
- Pełna obsługa adresów URL i nazw domen w Unicode.
Prosimy unikać kolektywnego bólu i zamiast tego używać Requests. Domyślnie zrobi to, co właściwe, i jeśli to konieczne, zachowa żywotność.
Pracuję nad pewnym uwierzytelnieniem NTLM, a biblioteka żądań NTLM nie działa poprawnie. Jednak biblioteka NTLM urllib2 działa poprawnie. To pytanie było dla mnie pomocne. –
@JeffersonHudson, nie wiedziałem o tym. Możesz mieć więcej szczęścia z https://github.com/requests/requests-ntlm –
Proponowałem już wnioski w mojej odpowiedzi zamieszczone ponad rok przed tym ... –
Oto nieco podobny urlopen(), który utrzymuje się przy życiu, choć nie jest bezpieczny dla wątków.
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. Problemy z utrzymaniem Google Cloud Message przy życiu
- 2. Python Urllib2 Cookiejar z Selenium
- 3. python: urllib2 przy użyciu innego interfejsu sieciowego
- 4. Python - POSTing z otwieraczem urllib2
- 5. Python - urllib2 & cookielib
- 6. python urllib2 urlopen odpowiedź
- 7. Utrzymaj subproces przy życiu i podawaj mu polecenia? Python
- 8. Python - threading.Timer pozostaje przy życiu po wywołaniu cancel() metoda
- 9. Python: Przetwarzanie kodu JavaScript z urllib2?
- 10. Handling rss przekierowania z Python/urllib2
- 11. Python: urllib/urllib2/httplib confusion
- 12. Czas oczekiwania na urllib2? - Python
- 13. Upewnianie się, że połączenie z bazą danych psycopg2 przy życiu
- 14. utrzymanie przy życiu zmienna w funkcji javascript
- 15. Gniazda Pythona - utrzymują gniazdo przy życiu?
- 16. Trzymaj usługę WCF przy życiu pod IIS
- 17. Kompilator F # utrzymuje martwe obiekty przy życiu
- 18. Python urllib2 Uwierzytelnianie HTTPS i proxy NTLM
- 19. Problemy z utrzymaniem połączenia w sieci
- 20. przechodzić pliki cookie sesji w nagłówku http z python urllib2?
- 21. Python urllib2, podstawowe uwierzytelnianie HTTP i tr.im
- 22. Python urllib2 URLError Kod statusu HTTP.
- 23. Python - błąd typu nieobsługiwanego w urllib2
- 24. Python urllib2: Otrzymuję odpowiedź JSON z adresu URL
- 25. Python: urllib2.urlopen (adres URL, dane) Dlaczego musisz urllib.urlencode() dane?
- 26. python urllib2 - poczekaj na zakończenie strony ładowanie/przekierowanie przed skrobaniem?
- 27. Python urllib i urllib2 nie otwierające adresów localhost?
- 28. Nie można utrzymać Websocket przy życiu w tle iOS
- 29. Błąd uzgadniania alertu SSLv3 z urllib2
- 30. Gniazdo XPCOM się zamyka. Jak utrzymać to przy życiu?
Dzięki David. Odpowiednio zaktualizowałem odpowiedź. – msanders
Nowa strona: http://urlgrabber.baseurl.org/ –
Dzięki @Forest - Zaktualizowałem teraz link w odpowiedzi. – msanders