Потоково изтегляне през прокси във файл с Python urllib
Предавайте потоково изтегляне през прокси във временен файл и обявявайте крайното име на файла само след като копирането приключи.
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)Заменете URL адресите и имената на файловете за приложението. За разрешено изтегляне на публичен файл без удостоверяване на прокси списъкът с HTTP прокси сървъри може да предостави кандидати за крайни точки за URL адреса на проксито. Този специализиран opener на urllib използва HTTP прокси за HTTPS дестинация с нормална проверка на сертификата. Той не инсталира глобален opener; удостоверяването, ако е нужно, изисква неговата поддържана настройка.
copyfileobj копира на части. Излизането от контекста на файла го затваря и изчиства буферираните записи, преди os.replace да зададе крайното име.
Ако заявката или копирането предизвика изключение, преименуването се пропуска. Може да остане частичен файл според политиката за почистване и този поток оставя съществуващ краен файл непокътнат при такъв провал. При успех замяната може да презапише този краен файл, затова изберете политиката съзнателно.
Използвайте уникални временни имена за паралелни задачи. Отделните opener обекти не защитават задачи, които споделят един и същ път .part.
Настройката от 20 секунди ограничава поддържаните сокет операции, а не общото време за изтегляне. За целия процес е нужен отделен срок в приложението. Завършването на трансфера също е отделно от проверката на изтегления файл.