2013-08-28 16 views
22
This is the script: 

import requests 
import json 
import urlparse 
from requests.adapters import HTTPAdapter 

s = requests.Session() 
s.mount('http://', HTTPAdapter(max_retries=1)) 

with open('proxies.txt') as proxies: 
    for line in proxies: 
     proxy=json.loads(line) 

    with open('urls.txt') as urls: 
     for line in urls: 

      url=line.rstrip() 
      data=requests.get(url, proxies=proxy) 
      data1=data.content 
      print data1 
      print {'http': line} 

, jak widać, próbując uzyskać dostęp do listy adresów URL za pośrednictwem listy serwerów proxy. Oto plik urls.txt:Python: requests.exceptions.ConnectionError. Maksymalna liczba ponownych prób przekroczyła adres URL:

http://api.exip.org/?call=ip 

Oto plik proxies.txt:

{"http":"http://107.17.92.18:8080"} 

Mam ten pełnomocnika na www.hidemyass.com. Czy może to być złe proxy? Próbowałem kilku i to jest wynik. Uwaga: jeśli próbujesz replikować to, być może będziesz musiał zaktualizować serwer proxy do najnowszego na hidemyass.com. W końcu przestają działać. tutaj jest pełna błędów i traceback:

Traceback (most recent call last): 
    File "test.py", line 17, in <module> 
    data=requests.get(url, proxies=proxy) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get 
    return request('get', url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 335, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 454, in send 
    history = [resp for resp in gen] if allow_redirects else [] 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 144, in resolve_redirects 
    allow_redirects=False, 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 438, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 327, in send 
    raise ConnectionError(e) 
requests.exceptions.ConnectionError: HTTPConnectionPool(host=u'219.231.143.96', port=18186): Max retries exceeded with url: http://www.google.com/ (Caused by <class 'httplib.BadStatusLine'>: '') 
+0

Czy wcięcie w twoim przykładzie jest prawidłowe? – Lukasa

+0

Wierzę, że tak, dlaczego? – BigBoy1337

+0

Ponieważ ciała twoich pętli 'for' nie są wcięte. Wygląda na to, że spowodowałoby to dla mnie Wrażenie Zwłoki. – Lukasa

Odpowiedz

29

Patrząc na ślad stosu podasz twój błąd jest spowodowany przez httplib.BadStatusLine wyjątku, który zgodnie z docs wynosi:

Raised if a server responds with a HTTP status code that we don’t understand.

Innymi słowy coś, co jest zwracane (jeśli zostanie zwrócone w ogóle) przez serwer proxy, nie może zostać przetworzone przez httplib, który faktycznie wywołuje żądanie.

Z mojego doświadczenia z (pisaniem) http proxy mogę powiedzieć, że niektóre implementacje mogą nie stosować się do specyfikacji zbyt ściśle (specyfikacje rfc na http nie są łatwe do odczytania) lub użyć hacków do naprawienia starych przeglądarek, które mają luki w ich implementacji .

więc, odpowiadając w ten sposób:

Could it be a bad proxy?

... powiedziałbym - że jest to możliwe. Jedynym sposobem na upewnienie się jest to, co jest zwracane przez serwer proxy.

Spróbuj przeprowadzić debugowanie za pomocą debuggera lub sniffera pakietów (coś w stylu: Wireshark lub Network Monitor), aby przeanalizować, co dzieje się w sieci. Posiadanie informacji o tym, co dokładnie jest zwracane przez serwer proxy, powinno dać ci klucz do rozwiązania tego problemu.

+0

Nie korzystam z protokołu httplib, chyba że znajduje się on w bibliotece żądań?Poza tym, czy mówisz, że moja prośba przechodzi przez serwer proxy do strony internetowej, z powrotem do serwera proxy, a następnie to, co serwer proxy próbuje mi przekazać, jest nieczytelne? – BigBoy1337

+0

@ BigBoy1337 o httplib: wygląda na to, że jest używany pośrednio (w każdym razie masz wyjątek od niego w swoim tracebacku). O "czy mówisz, że moja prośba przechodzi przez serwer proxy do strony internetowej, z powrotem do serwera proxy, a następnie to, co serwer proxy próbuje mi przekazać, jest nieczytelne?": Jest to możliwe, ale nie jest konieczne. W tej chwili wiemy tylko, że odpowiedź od pełnomocnika jest nieważna. ... –

+0

... Możliwe, że serwer proxy napotkał błąd wewnętrzny jeszcze przed dostarczeniem żądania do końcowego serwera WWW, a zatem serwer proxy odpowiedział nieprawidłową odpowiedzią. Możliwe jest również, że ten wewnętrzny błąd wystąpił w proxy po tym, jak serwer sieciowy odpowiedział prawidłową odpowiedzią na serwer proxy. Ponadto możliwe jest, że serwer sieciowy odpowiedział na nieautoryzowany serwer proxy, co z kolei spowodowało nieważną odpowiedź z serwera proxy. Jak już powiedziałem w mojej odpowiedzi - najprostszym sposobem, aby dowiedzieć się, jaka jest główna przyczyna, to pobrać więcej danych o tym, co faktycznie było odpowiedzią z serwera proxy. –

6

Być może przeciążasz serwer proxy wysyłając zbyt wiele żądań w krótkim czasie, mówisz, że masz proxy z popularnej darmowej witryny proxy, co oznacza, że ​​nie jesteś jedyną osobą używającą tego serwera i często jest pod dużym obciążeniem.

Jeśli dodać pewne opóźnienie pomiędzy prośby takiego:

from time import sleep 

[...] 

data=requests.get(url, proxies=proxy) 
data1=data.content 
print data1 
print {'http': line} 
sleep(1) 

(uwaga na sleep(1) który wstrzymuje wykonanie kodu na jedną sekundę)

to działa?

+0

Żądanie zawsze dodaje pierwotną przyczynę wyjątku na końcu. requests.exceptions.ConnectionError: HTTPConnectionPool (host = u'219.231.143.96 ', port = 18186): Maksymalna liczba ponownych prób przekroczona za pomocą adresu URL: http://www.google.com/ (spowodowana przez : '') W tym przykładzie. (Spowodowane przez : '') Oznacza to, że nie byłoby problemu z Timing więcej nieobsłużonego HTTP, jak w podanej odpowiedzi. – PsyKzz

+0

@MattPsyK Wielokrotnie miałem ten wyjątek "BadStatusLine" w popularnej witrynie (działającej pod standardowym Apache), gdy wysyłałem zbyt wiele żądań w tym samym czasie (sztuczka sleep() działała dla mnie), więc może to ten sam problem tutaj ... –

+0

sztuczka snu nie działa dla mnie. Mam ten sam błąd. – BigBoy1337

Powiązane problemy