wake-up-neo.com

Python-Requests erhalten ('Verbindung abgebrochen.', BadStatusLine ("''",)) Fehler

def download_torrent(url):
    fname = os.getcwd() + '/' + url.split('title=')[-1] + '.torrent'
    try:
        schema = ('http:')
        r = requests.get(schema + url, stream=True)
        with open(fname, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    f.flush()
    except requests.exceptions.RequestException as e:
        print('\n' + OutColors.LR + str(e))
        sys.exit(1)

    return fname

In diesem Codeblock erhalte ich eine Fehlermeldung, wenn ich das vollständige Skript ausführte. Wenn ich den Torrent tatsächlich herunterlade, bekomme ich:

('Connection aborted.', BadStatusLine("''",))

Ich habe nur den Codeblock gepostet, der meiner Meinung nach relevant ist. Das gesamte Skript ist unten. Es ist von Pantuts, aber ich glaube nicht, dass es länger erhalten bleibt und ich versuche, es mit Python3 zum Laufen zu bringen. Nach meiner Recherche könnte der Fehler bedeuten, dass ich http anstelle von https verwende, aber ich habe beide versucht.

Ursprüngliches Skript

22
eurabilis

Der Fehler zeigt an, dass der Host nicht wie erwartet reagiert. In diesem Fall liegt es daran, dass es erkennt, dass Sie versuchen, es zu kratzen und Sie absichtlich trennen.

Wenn Sie Ihren requests-Code mit dieser URL von einer Test-Website aus ausprobieren: http://mirror.internode.on.net/pub/test/5meg.test1, werden Sie feststellen, dass er normal heruntergeladen wird.

Um dies zu umgehen, fälschen Sie Ihren user agent . Ihr Benutzeragent identifiziert Ihren Webbrowser, und Webhosts prüfen ihn normalerweise, um Bots zu erkennen.

Verwenden Sie das Feld headers, um Ihren Benutzeragenten festzulegen. Hier ist ein Beispiel, das dem Webhost sagt, dass Sie Firefox sind.

headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0' }
r = requests.get(url, headers=headers)

Es gibt viele andere Unstimmigkeiten1 zwischen Bots und vom Benutzer betriebenen Browsern, auf die Webhosts zugreifen können, aber der Benutzeragent ist einer der einfachsten und gebräuchlichsten.

Wenn Sie möchten, dass Ihr Scraper schwerer zu erkennen ist, sollten Sie einen headless-Browser wie headless Chrome verwenden.2 (oder ghost.py wenn Sie bei Python bleiben möchten), dem Sie vertrauen können, wird sich wie ein echter Browser verhalten (weil er es ist!).


Fußnoten:

1Mögliche andere Überprüfungen umfassen das Überprüfen, ob Bilder nicht heruntergeladen werden, Seitenressourcen nicht in der normalen Reihenfolge heruntergeladen werden, Seiten, die schneller heruntergeladen werden, als ein Mensch sie lesen kann, und Cookies nicht richtig eingestellt sind. Google weist auf Mausbewegungen hin, die als unzureichend menschenähnlich gelten.

2Headless Chrome ist der kompetenteste Headless-Browser im Jahr 2018, aber wenn sein Gewicht ein Problem für Sie ist, sind die etwas überholten Vorgänger PhantomJS und ghost.py , leichter und dennoch verwendbar.

36
sorbet

In meinem Fall muss ich die Benutzeragentenfelder aus den Kopfzeilen entfernen

url='https://...'
headers = {}
requests.get(url, headers=headers)

sobald ich 'User-Agent' eingestellt habe, erhalte ich ('Connection aborted.', BadStatusLine("''",))__. und dieser Fehler tritt nur bei der einzelnen Site auf. Mein erster Beitrag, ich bekomme viele Hilfen von dieser Site

0
M.ison