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 на сайте или прокси.

Контекстный менеджер ответа закрывает ответ, даже если запись не удалась или приложение остановилось раньше. Показанная пара тайм-аутов не является реальным крайним сроком для всей передачи; задайте политику времени жизни загрузки отдельно по мере необходимости.

После успешного потребления проверьте артефакт, ожидаемый приложением, прежде чем публиковать его окончательное имя. При прерывании сохраняйте частичный файл только в рамках осознанной политики возобновления, с метаданными, идентифицирующими удалённое представление. Непустой временный файл не является успешной загрузкой.

Похожие статьи