Proxy-n keresztüli letöltés streamelése fájlba Python urlliblel
Streamelje a proxy-n keresztüli letöltést egy ideiglenes fájlba, és csak a másolás befejezése után tegye közzé a végleges fájlnevet.
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)Cserélje ki az URL-eket és a fájlneveket az alkalmazás sajátjaira. Egy engedélyezett nyilvános fájl proxy-hitelesítés nélküli letöltéséhez a HTTP proxy lista jelölt végpontokat adhat a proxy URL-hez. Ez a dedikált urllib-megnyitó HTTP proxyt használ HTTPS célhoz, normál tanúsítvány-ellenőrzéssel. Nem telepít globális megnyitót; a hitelesítéshez, ha szükséges, annak támogatott beállítása kell.
copyfileobj darabokban másol. A fájlkontextus elhagyása bezárja a fájlt, és kiüríti a pufferelt írásokat, mielőtt os.replace beállítja a végleges nevet.
Ha a kérés vagy a másolás hibát dob, az átnevezés kimarad. A tisztítási szabályzat szerint maradhat részleges fájl, és ez a folyamat a meglévő végleges fájlt érintetlenül hagyja a hiba esetén. Siker esetén a csere felülírhatja azt a végleges fájlt, ezért tudatosan válassza meg a szabályzatot.
Használjon egyedi ideiglenes neveket a párhuzamos feladatokhoz. A külön megnyitó objektumok nem védik az ugyanazt a .part útvonalat megosztó feladatokat.
A 20 másodperces beállítás a támogatott socket-műveleteket korlátozza, nem a teljes letöltési időt. A teljes feladat határidejéhez külön alkalmazáskezelés kell. Az átvitel befejezése szintén elkülönül a letöltött fájl ellenőrzésétől.