Überprüfen, ob eine Datei von der Python Requests-Bibliothek heruntergeladen wird
-
21-12-2019 - |
Frage
Ich hatte Probleme mit einem Skript, das ich entwickle, wobei ich keine Ausgabe erhalte und die Speichernutzung des Skripts mit der Zeit immer größer wird.Ich habe herausgefunden, dass das Problem bei einigen der URLs liegt, die ich mit der Requests-Bibliothek überprüfe.Ich erwarte, eine Webseite herunterzuladen, lade jedoch stattdessen eine große Datei herunter.Alle diese Daten werden dann im Speicher gespeichert, was zu meinen Problemen führt.
Was ich wissen möchte ist;Gibt es eine Möglichkeit mit der Anforderungsbibliothek zu überprüfen, was heruntergeladen wird?Mit wget kann ich sehen:Länge:710330974 (677M) [application/zip].
Sind diese Informationen in den Kopfzeilen der Anfragen verfügbar?Wenn ja, gibt es eine Möglichkeit, den Download abzubrechen, wenn festgestellt wird, dass es sich nicht um eine HTML-Webseite handelt?
Dank im Voraus.
Lösung
Ja, die Kopfzeilen können Ihnen viel über die Seite verraten, am meisten Seiten enthalten einen Content-Length-Header.
Standardmäßig wird die Anfrage jedoch vor dem vollständig heruntergeladen .get()
oder .post()
, usw.Anruf geht zurück.Stellen Sie die ein stream=True
Schlüsselwort, um das Laden der Antwort zu verzögern:
response = requests.get(url, stream=True)
Jetzt können Sie die Header überprüfen und die Anfrage einfach verwerfen, wenn Ihnen das, was Sie finden, nicht gefällt:
length = int(response.headers.get('Content-Length', 0))
if length > 1048576:
print 'Response larger than 1MB, discarding
Anschließend Zugriff auf die .content
oder .text
Attribute oder die .json()
Die Methode löst einen vollständigen Download der Antwort aus.