Download über einen Proxy mit Requests und iter_content
Konsumieren Sie eine Requests-Antwort schrittweise, während normale Statusprüfungen, Aufräumen und eine bewusste Richtlinie für Teilausgaben erhalten bleiben.
with session.get(url, stream=True, proxies=routes,
timeout=(5, 30)) as response:
response.raise_for_status()
with open(part_path, 'wb') as output:
for chunk in response.iter_content(chunk_size=64 * 1024):
if chunk:
output.write(chunk)
Verwenden Sie dieses Muster mit der vorhandenen Requests-Sitzung der Anwendung, den Proxy-Routen, der URL und dem temporären Ausgabepfad. Für eine öffentliche HTTP-Route liefert die HTTP-Proxy-Liste Kandidatenadressen für Ihr Proxy-Mapping. Das Streaming-Muster konsumiert den Body schrittweise, statt response.content zu beziehen und dann ein zweites Objekt voller Größe zu schreiben.
Behalten Sie diese Eigenschaft während des gesamten Downloads bei: stream=True verschiebt den Body, aber ein anschließender Zugriff auf response.content kann ihn dennoch vollständig im Speicher sammeln. Die Chunk-Größe von iter_content ist eine Lesepräferenz, keine Anforderung von HTTP-Chunked-Transfer-Kodierung an der Website oder am Proxy.
Der Kontextmanager der Antwort schließt die Antwort auch dann, wenn ein Schreibvorgang fehlschlägt oder die Anwendung früh stoppt. Das dargestellte Timeout-Paar ist keine Echtzeitfrist für die gesamte Übertragung; legen Sie die Lebensdauer-Richtlinie des Downloads bei Bedarf separat fest.
Prüfen Sie nach erfolgreichem Konsum das von der Anwendung erwartete Artefakt, bevor Sie den endgültigen Namen veröffentlichen. Bei Unterbrechung darf die Teil-Datei nur im Rahmen einer bewussten Wiederaufnahmerichtlinie behalten werden, mit Metadaten, die die entfernte Repräsentation identifizieren. Eine nicht leere temporäre Datei ist kein erfolgreicher Download.