webentwicklung-frage-antwort-db.com.de

Python: request.exceptions.ConnectionError. Max Wiederholungen wurden mit URL überschritten

Dies ist das Skript:

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}

wie Sie sehen, versucht es, über eine Liste von Proxys auf eine Liste von URLs zuzugreifen. Hier ist die urls.txt-Datei: 

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

hier ist die proxies.txt-Datei: 

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

Ich habe diesen Proxy unter www.hidemyass.com erhalten. Könnte es ein schlechter Stellvertreter sein? Ich habe mehrere ausprobiert und das ist das Ergebnis. Hinweis: Wenn Sie versuchen, dies zu replizieren, müssen Sie möglicherweise den Proxy auf hidemyass.com aktualisieren. Sie scheinen irgendwann aufhören zu arbeiten. hier ist der vollständige fehler und 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'>: '')
24
BigBoy1337

Wenn Sie sich die Stack-Ablaufverfolgung ansehen, haben Sie angegeben, dass Ihr Fehler auf eine httplib.BadStatusLine-Ausnahme zurückzuführen ist, die laut docs folgendermaßen lautet:

Wird ausgelöst, wenn ein Server mit einem HTTP-Statuscode antwortet, den wir nicht verstehen.

Mit anderen Worten, etwas, das vom Proxy-Server zurückgegeben wird (wenn überhaupt zurückgegeben), kann nicht von httplib analysiert werden, das die eigentliche Anforderung ausführt.

Aus meiner Erfahrung mit (Schreib-) http-Proxys kann ich sagen, dass einige Implementierungen den Spezifikationen möglicherweise nicht zu streng folgen (rfc-Spezifikationen auf http sind eigentlich nicht einfach zu lesen) oder Hacks verwenden, um alte Browser zu reparieren, die Fehler in ihrer Implementierung aufweisen.

So beantworte ich das:

Könnte es ein schlechter Stellvertreter sein?

... würde ich sagen - das ist möglich. Der einzige Weg, um sicher zu gehen, ist zu sehen, was vom Proxy-Server zurückgegeben wird.

Versuchen Sie es mit dem Debugger zu debuggen oder Packet Sniffer (etwas wie Wireshark oder Network Monitor ) zu packen, um zu analysieren, was im Netzwerk passiert. Wenn Sie Informationen darüber erhalten, was genau vom Proxy-Server zurückgegeben wird, sollten Sie einen Schlüssel zur Lösung dieses Problems erhalten.

31
Eugene Loy

Möglicherweise überladen Sie den Proxy-Server, indem Sie in kurzer Zeit zu viele Anfragen senden. Sie sagen, Sie hätten den Proxy von einer beliebten kostenlosen Proxy-Website erhalten, was bedeutet, dass Sie nicht der einzige Server sind, der diesen Server verwendet Belastung.

Wenn Sie eine Verzögerung zwischen Ihren Anforderungen hinzufügen, wie folgt:

from time import sleep

[...]

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

(Beachten Sie das sleep(1), das die Ausführung des Codes für eine Sekunde anhält)

Funktioniert es ? 

7
user2629998
def hello(self):
    self.s = requests.Session()
    self.s.headers.update({'User-Agent': self.user_agent})
    return True

Probieren Sie es aus, es hat für mich funktioniert :)

0
Ashu