2009-06-24 16 views

Odpowiedz

30

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.

+0

Dzięki David. Odpowiednio zaktualizowałem odpowiedź. – msanders

+0

Nowa strona: http://urlgrabber.baseurl.org/ –

+0

Dzięki @Forest - Zaktualizowałem teraz link w odpowiedzi. – msanders

4

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 
+0

Dzięki, ale byłoby miło, gdybyś wyjaśnił, co to naprawiono zamiast tego bezużytecznego oznaczonego komentarza. – 2371

+0

Oryginalny r i twój resp są instancjami i oba mają te same atrybuty. addinfourl mówi "klasa, aby dodać metody info() i geturl() do otwartego pliku." ale oryginał ma już info() i geturl(). Nie udało się wypracować korzyści. – 2371

4

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:

http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=blob_plain;f=urlgrabber/keepalive.py;hb=a531cb19eb162ad7e0b62039d19259341f37f3a6

7

Albo sprawdzić httplib „s httpconnection.

+0

, które zadziałało dla mnie ... –

+1

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 –

11

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.
4

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ść.

+0

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. –

+0

@JeffersonHudson, nie wiedziałem o tym. Możesz mieć więcej szczęścia z https://github.com/requests/requests-ntlm –

+1

Proponowałem już wnioski w mojej odpowiedzi zamieszczone ponad rok przed tym ... –

0

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 
Powiązane problemy