Prenos preuzimanja preko proxyja u datoteku pomoću Python urllib
Prenosite preuzimanje preko proxyja u privremenu datoteku i objavite konačno ime datoteke tek nakon što kopiranje završi.
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)Zamijenite URL-ove i nazive datoteka za aplikaciju. Za dozvoljeno preuzimanje javne datoteke bez autentifikacije proxyja, lista HTTP proxyja može dati kandidate za krajnje točke za URL proxyja. Ovaj namjenski urllib opener koristi HTTP proxy za HTTPS odredište uz normalnu provjeru certifikata. Ne instalira globalni opener; autentifikacija, ako je potrebna, zahtijeva njegovo podržano postavljanje.
copyfileobj kopira u dijelovima. Izlazak iz konteksta datoteke je zatvara i ispisuje međuspremljene zapise prije nego os.replace postavi konačno ime.
Ako zahtjev ili kopiranje izazove grešku, preimenovanje se preskače. Djelimična datoteka može ostati prema politici čišćenja, a ovaj tok ostavlja postojeću konačnu datoteku netaknutom pri tom neuspjehu. U slučaju uspjeha zamjena može prepisati tu konačnu datoteku, pa politiku odaberite svjesno.
Koristite jedinstvena privremena imena za paralelne poslove. Odvojeni opener objekti ne štite poslove koji dijele istu .part putanju.
Postavka od 20 sekundi ograničava podržane socket operacije, a ne ukupno vrijeme preuzimanja. Za cijeli posao potreban je poseban rok u aplikaciji. Završetak prijenosa također je odvojen od provjere preuzete datoteke.