Загрузка через прокси с Requests и iter_content
Потребляйте ответ Requests постепенно, сохраняя обычные проверки статуса, очистку и осознанную политику для частичного вывода.
with session.get(url, stream=True, proxies=routes,
timeout=(5, 30)) as response:
response.raise_for_status()
with open(part_path, 'wb') as output:
for chunk in response.iter_content(chunk_size=64 * 1024):
if chunk:
output.write(chunk)
Используйте этот шаблон с существующей сессией Requests приложения, маршрутами прокси, URL и временным путём вывода. Для публичного маршрута HTTP список HTTP-прокси предоставляет адреса-кандидаты для вашего сопоставления прокси. Шаблон потоковой передачи потребляет тело постепенно вместо получения response.content и последующей записи второго объекта полного размера.
Сохраняйте это свойство на протяжении всей загрузки: stream=True откладывает тело, но последующее обращение к response.content всё равно может собрать его целиком в памяти. Размер фрагмента у iter_content — это предпочтение чтения, а не запрос на чанковую передачу HTTP на сайте или прокси.
Контекстный менеджер ответа закрывает ответ, даже если запись не удалась или приложение остановилось раньше. Показанная пара тайм-аутов не является реальным крайним сроком для всей передачи; задайте политику времени жизни загрузки отдельно по мере необходимости.
После успешного потребления проверьте артефакт, ожидаемый приложением, прежде чем публиковать его окончательное имя. При прерывании сохраняйте частичный файл только в рамках осознанной политики возобновления, с метаданными, идентифицирующими удалённое представление. Непустой временный файл не является успешной загрузкой.