Потоковая загрузка через прокси в файл с помощью 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 прокси. Этот специализированный открыватель urllib использует HTTP-прокси для HTTPS-назначения с обычной проверкой сертификата. Он не устанавливает глобальный открыватель; аутентификация, если она нужна, требует его поддерживаемой настройки.
copyfileobj копирует частями. Выход из контекста файла закрывает его и сбрасывает буферизованные записи до того, как os.replace установит окончательное имя.
Если запрос или копирование вызывает ошибку, переименование пропускается. Частичный файл может остаться для политики очистки, и этот поток оставляет существующий конечный файл нетронутым при таком сбое. При успехе замена может перезаписать этот конечный файл, поэтому выбирайте политику осознанно.
Используйте уникальные временные имена для параллельных задач. Отдельные объекты-открыватели не защищают задачи, использующие один и тот же путь .part.
Настройка в 20 секунд ограничивает поддерживаемые операции с сокетами, а не общее время загрузки. Для всего задания нужен отдельный срок в приложении. Завершение передачи также отделено от проверки загруженного файла.