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 分块传输编码。

响应上下文管理器会在写入失败或应用提前停止时关闭响应。示例中的超时组合并不是整个传输的挂钟截止时间;如有需要,请另行设置下载的生命周期策略。

成功消费之后,在发布最终文件名之前,检查应用所期望的产物。若被中断,只有在刻意制定续传策略时才能保留部分文件,并附带能标识远端表示的元数据。非空的临时文件并不等于下载成功。

相关文章