Strumieniowanie pobierania przez proxy do pliku z Python urllib
Przesyłaj strumieniowo pobieranie przez proxy do pliku tymczasowego i publikuj ostateczną nazwę pliku dopiero po zakończeniu kopiowania.
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)Zastąp adresy URL i nazwy plików tymi z aplikacji. W przypadku dozwolonego pobierania pliku publicznego bez uwierzytelniania proxy lista proxy HTTP może dostarczyć kandydatów na punkty końcowe dla adresu URL proxy. Ten dedykowany opener urllib używa proxy HTTP dla celu HTTPS z normalną weryfikacją certyfikatu. Nie instaluje globalnego openera; uwierzytelnianie, jeśli jest potrzebne, wymaga jego obsługiwanej konfiguracji.
copyfileobj kopiuje w blokach. Wyjście z kontekstu pliku zamyka go i opróżnia buforowane zapisy, zanim os.replace ustawi ostateczną nazwę.
Jeśli żądanie lub kopiowanie zgłosi błąd, zmiana nazwy jest pomijana. Zgodnie z polityką czyszczenia może pozostać częściowy plik, a ten przepływ pozostawia istniejący plik końcowy nietknięty przy tej awarii. W razie sukcesu zamiana może nadpisać ten plik końcowy, więc wybierz politykę świadomie.
Używaj unikalnych nazw tymczasowych dla równoległych zadań. Osobne obiekty openera nie chronią zadań współdzielących tę samą ścieżkę .part.
Ustawienie 20 sekund ogranicza obsługiwane operacje gniazda, a nie całkowity czas pobierania. Termin dla całego zadania wymaga osobnej obsługi w aplikacji. Zakończenie transferu jest również oddzielone od weryfikacji pobranego pliku.