Přenos stahování přes proxy do souboru pomocí Python urllib
Přenášejte stahování přes proxy do dočasného souboru a konečný název souboru zveřejněte až po dokončení kopírování.
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)Nahraďte adresy URL a názvy souborů podle aplikace. Pro povolené stahování veřejného souboru bez autentizace proxy může seznam HTTP proxy poskytnout kandidáty na koncové body pro URL proxy. Tento vyhrazený opener urllib používá HTTP proxy pro cíl HTTPS s běžným ověřením certifikátu. Neinstaluje globální opener; autentizace, pokud je potřeba, vyžaduje jeho podporované nastavení.
copyfileobj kopíruje po částech. Opuštění kontextu souboru jej zavře a vyprázdní bufferované zápisy, než os.replace nastaví konečný název.
Pokud požadavek nebo kopírování vyvolá výjimku, přejmenování se přeskočí. Podle zásady čištění může zůstat částečný soubor a tento tok při takovém selhání ponechá existující konečný soubor nedotčený. Při úspěchu může nahrazení tento konečný soubor přepsat, proto zásadu zvolte vědomě.
Pro souběžné úlohy používejte jedinečné dočasné názvy. Samostatné objekty opener nechrání úlohy, které sdílejí stejnou cestu .part.
Nastavení 20 sekund omezuje podporované operace socketu, nikoli celkovou dobu stahování. Pro celou úlohu je potřeba samostatný termín v aplikaci. Dokončení přenosu je také oddělené od ověření staženého souboru.