36 Stimmen

Python: requests.exceptions.ConnectionError. Maximale Anzahl von Versuchen mit der 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 können, versucht es, auf eine Liste von URLs über eine Liste von Proxies zuzugreifen. Hier ist die Datei urls.txt:

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

Hier ist die Datei proxies.txt:

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

Ich habe diesen Proxy von www.hidemyass.com erhalten. Könnte es ein schlechter Proxy sein? Ich habe mehrere ausprobiert und dies ist das Ergebnis. Hinweis: Wenn Sie dies nachstellen möchten, müssen Sie den Proxy möglicherweise gegen einen neueren auf hidemyass.com aktualisieren. Sie scheinen früher oder später aufzuhören zu funktionieren. Hier ist der vollständige Fehler und Traceback:

Traceback (most recent call last):
  File "test.py", line 17, in 
    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 : '')

37voto

Eugene Loy Punkte 12140

Beim Betrachten des Stack-Traces, den Sie bereitgestellt haben, wird Ihr Fehler durch die Ausnahme httplib.BadStatusLine verursacht, die laut Dokumenten wie folgt definiert ist:

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

Anders ausgedrückt kann etwas, was (falls überhaupt zurückgegeben wird) vom Proxy-Server nicht von httplib, das die eigentliche Anfrage ausführt, geparst werden.

Basierend auf meinen Erfahrungen mit (dem Schreiben von) HTTP-Proxies kann ich sagen, dass einige Implementierungen die Spezifikationen möglicherweise nicht zu streng einhalten (RFC-Spezifikationen zu HTTP sind tatsächlich nicht leicht zu lesen) oder Hacks verwenden, um alte Browser zu reparieren, die Fehler in ihrer Implementierung aufweisen.

Also, um diese Frage zu beantworten:

Könnte es ein schlechter Proxy sein?

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

Versuchen Sie es mit einem Debugger zu debuggen oder schnappen Sie sich einen Paketsniffer (etwas wie Wireshark oder Network Monitor), um zu analysieren, was im Netzwerk passiert. Informationen darüber, was genau vom Proxy-Server zurückgegeben wird, sollten Ihnen den Schlüssel zur Lösung dieses Problems geben.

9voto

Vielleicht überlasten Sie den Proxy-Server, indem Sie zu viele Anfragen in kurzer Zeit senden. Sie sagen, dass Sie den Proxy von einer beliebten kostenlosen Proxy-Website bekommen haben, was bedeutet, dass Sie nicht der einzige sind, der diesen Server benutzt und er oft stark belastet ist.

Wenn Sie etwas Verzögerung zwischen Ihren Anfragen hinzufügen, wie hier:

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 pausiert)

Funktioniert es?

3voto

Ashu Punkte 347
def hallo(self):
    self.s = requests.Session()
    self.s.headers.update({'User-Agent': self.user_agent})
    return True

Versuche dies, es hat bei mir funktioniert :)

1voto

Vaibhav Hiwase Punkte 421

Dies geschieht, wenn Sie zu viele Anfragen an die öffentliche IP-Adresse von https://anydomainname.example.com/ senden. Es wird, wie Sie sehen können, aufgrund eines Grundes verursacht, der den Zugriff auf die öffentliche IP-Adresse blockiert oder nicht zulässt, die mit https://anydomainname.example.com/ verknüpft ist. Eine bessere Lösung ist das folgende Python-Skript, das die öffentliche IP-Adresse einer beliebigen Domain berechnet und diese Zuordnung zur Datei /etc/hosts erstellt.

import re
import socket
import subprocess
from typing import Tuple

ENDPOINT = 'https://anydomainname.example.com/'

def get_public_ip() -> Tuple[str, str, str]:
    """
    Befehl, um die öffentliche IP-Adresse des Host-Rechners und der Endpunkt-Domäne zu erhalten
    Returns
    -------
    my_public_ip : str
        IP-Adressenzeichenfolge des Host-Rechners.
    end_point_ip_address : str
        IP-Adresse des Endpunkt-Domänenhosts.
    end_point_domain : str
        Domänenname des Endpunkts.

    """
    # bash_command = """host myip.opendns.com resolver1.opendns.com | \
    #     grep "myip.opendns.com has" | awk '{print $4}'"""
    # bash_command = """curl ifconfig.co"""
    # bash_command = """curl ifconfig.me"""
    bash_command = """ curl icanhazip.com"""
    my_public_ip = subprocess.getoutput(bash_command)
    my_public_ip = re.compile("[0-9.]{4,}").findall(my_public_ip)[0]
    end_point_domain = (
        ENDPOINT.replace("https://", "")
        .replace("http://", "")
        .replace("/", "")
    )
    end_point_ip_address = socket.gethostbyname(end_point_domain)
    return my_public_ip, end_point_ip_address, end_point_domain

def set_etc_host(ip_address: str, domain: str) -> str:
    """
    Eine Funktion zum Schreiben der Zuordnung von IP-Adresse und Domänennamen in /etc/hosts.
    Ref: https://stackoverflow.com/questions/38302867/how-to-update-etc-hosts-file-in-docker-image-during-docker-build

    Parameters
    ----------
    ip_address : str
        IP-Adresse der Domäne.
    domain : str
        Domänenname des Endpunkts.

    Returns
    -------
    str
        Nachricht zur Identifizierung des Erfolgs oder des Scheiterns des Vorgangs.

    """
    bash_command = """echo "{}    {}" >> /etc/hosts""".format(ip_address, domain)
    output = subprocess.getoutput(bash_command)
    return output

if __name__ == "__main__":
    my_public_ip, end_point_ip_address, end_point_domain = get_public_ip()
    output = set_etc_host(ip_address=end_point_ip_address, domain=end_point_domain)
    print("Meine öffentliche IP-Adresse:", my_public_ip)
    print("ENDPUNKT öffentliche IP-Adresse:", end_point_ip_address)
    print("ENDPUNKT-Domänenname:", end_point_domain )
    print("Befehlsausgabe:", output)

Sie können das obige Skript aufrufen, bevor Sie Ihre gewünschte Funktion ausführen :)

1voto

dkaradima Punkte 71

Dies geschieht, wenn Sie den Server mit mehreren Anfragen überlasten. Um dies zu umgehen, können Sie die Zeit zwischen jeder Anfrage erhöhen. Aber das Beste in meinem Fall war, die Anzahl der Wiederholungsversuche bei jeder Anfrage zu erhöhen

requests.adapters.DEFAULT_RETRIES = 5 # Anzahl der Wiederholungsversuche erhöhen
requests.get(url)

Wenn dies immer noch nicht hilfreich ist, finden Sie weitere Möglichkeiten hier.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X