分块下载可解决大文件下载失败问题,核心是用http range请求头配合流式读写;先head获取总大小,再按块get指定字节段,支持断点续传与异常重试。

大文件下载容易因网络中断、内存不足或超时失败,Python中用分块下载能有效解决这些问题。核心是利用HTTP的Range请求头,配合流式读写,避免一次性加载整个文件到内存。
使用requests实现带Range的分块下载
requests支持流式响应和自定义请求头,可手动设置Range下载指定字节段:
- 先发HEAD请求获取文件总大小(
Content-Length) - 按固定块大小(如1MB)切分区间,循环发送GET +
Range: bytes=start-end - 每次响应用
response.iter_content(chunk_size)流式写入文件,不缓存全文
断点续传的关键:检查本地文件已下载长度
若中途失败,下次下载前应检查目标文件是否存在及当前大小,从该偏移量继续:
- 用
os.path.getsize(filename)获取已写入字节数 - 若大于0,说明已有部分数据,设置
Range: bytes=already_downloaded-(末尾不指定end即下载到结尾) - 以
'ab'模式打开文件,确保追加写入而非覆盖
处理常见异常与增强健壮性
网络不稳定时需重试、超时、状态码校验等防护措施:
iWebShop基于iWebSI框架开发,在获得iWebSI技术平台库支持的条件下,iWebShop可以轻松满足用户量级百万至千万级的大型电子商务网站的性能要求。站点的集群与分布式技术(分布式计算与存储/高可用性/负载均衡)被屏蔽在SI 平台之内,基于iWebShop并且按照SI平台库扩展规范开发的新增功能模块,也将同时获得这种超级计算与处理的能力。作为开源的LAMP电子商务系统,iWebShop
立即学习“Python免费学习笔记(深入)”;
- 对每个分块请求设置
timeout=(3, 30)(连接3秒,读取30秒) - 捕获
requests.exceptions.RequestException,失败后等待1–3秒再重试(最多3次) - 检查响应状态码是否为206(Partial Content)或200(全量),非预期码时抛错或跳过
- 下载完成后用
response.headers.get('Content-Range')核对实际返回范围是否匹配预期
简单示例:支持断点续传的下载函数
以下是一个轻量实用版本,不含第三方依赖,仅用标准库+requests:
(注意:需提前安装 requests:pip install requests)
逻辑清晰、易修改块大小与重试策略,适合集成进爬虫或工具脚本中。不复杂但容易忽略细节,比如文件打开模式、Range格式、边界判断等,写对就能稳定跑完几个GB的文件。









