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 を取得してから 2 つ目のフルサイズのオブジェクトを書き出すのではなく、本文を段階的に消費します。

ダウンロード全体でその性質を保ってください。stream=True は本文を遅延させますが、その後に response.content へアクセスすると全体をメモリに集めてしまいます。iter_content のチャンクサイズは読み取りの好みであり、Web サイトやプロキシに対する HTTP チャンク転送エンコーディングの要求ではありません。

レスポンスのコンテキストマネージャは、書き込みが失敗してもアプリケーションが途中で止まってもレスポンスを閉じます。例示したタイムアウトの組は転送全体の実時間の期限ではありません。必要に応じてダウンロードの寿命の方針を別途設定してください。

正常に消費した後、最終的な名前を公開する前にアプリケーションが期待する成果物を確認してください。中断した場合、部分ファイルは意図的な再開方針の下でのみ保持し、遠隔の表現を識別するメタデータを添えます。空でない一時ファイルは成功したダウンロードではありません。

関連記事