Einen Proxy-Download mit Python urllib in eine Datei streamen
Streamen Sie einen Proxy-Download in eine temporäre Datei und veröffentlichen Sie den endgültigen Dateinamen erst, nachdem das Kopieren abgeschlossen ist.
import os
import shutil
from urllib.request import ProxyHandler, build_opener
proxy = 'http://proxy.example.net:8080'
opener = build_opener(ProxyHandler({
'http': proxy,
'https': proxy,
}))
temporary = 'archive.zip.part'
destination = 'archive.zip'
with opener.open('https://downloads.example.net/archive.zip',
timeout=20) as response:
with open(temporary, 'wb') as output:
shutil.copyfileobj(response, output)
os.replace(temporary, destination)Ersetzen Sie die URLs und Dateinamen durch die der Anwendung. Für einen zulässigen Download einer öffentlichen Datei ohne Proxy-Authentifizierung kann die HTTP-Proxy-Liste Kandidaten-Endpunkte für die Proxy-URL liefern. Dieser spezielle urllib-Opener verwendet einen HTTP-Proxy für ein HTTPS-Ziel mit normaler Zertifikatsprüfung. Er installiert keinen globalen Opener; eine Authentifizierung erfordert bei Bedarf ihre unterstützte Einrichtung.
copyfileobj kopiert in Blöcken. Beim Verlassen des Dateikontexts wird die Datei geschlossen und gepufferte Schreibvorgänge werden geleert, bevor os.replace den endgültigen Namen setzt.
Wenn die Anforderung oder das Kopieren eine Ausnahme auslöst, wird die Umbenennung übersprungen. Je nach Aufräumrichtlinie kann eine Teil-Datei zurückbleiben, und dieser Ablauf lässt eine vorhandene endgültige Datei bei diesem Fehlschlag unberührt. Bei Erfolg kann das Ersetzen diese endgültige Datei überschreiben, wählen Sie die Richtlinie also bewusst.
Verwenden Sie eindeutige temporäre Namen für parallele Aufträge. Getrennte Opener-Objekte schützen keine Aufträge, die denselben .part-Pfad teilen.
Die Einstellung von 20 Sekunden begrenzt unterstützte Socket-Operationen und nicht die gesamte Downloadzeit. Für eine Frist für den gesamten Auftrag ist eine separate Behandlung in der Anwendung nötig. Der Abschluss der Übertragung ist außerdem getrennt von der Prüfung der heruntergeladenen Datei.