使用Python requests下载大文件多字节范围时返回完整文件问题咨询
限制来源判定
该限制既不来自requests库,也不属于HTTP协议的强制约束,是你访问的NOAA站点所用Apache服务器的默认配置导致:
- Apache服务器默认有
MaxRanges配置项,默认值为20,当请求携带的字节范围数量超过该阈值时,服务器会直接忽略Range请求头,返回完整文件,和你测试得到的阈值完全吻合。 - HTTP协议本身没有对单请求的Range数量做上限规定,requests库也不会修改或截断你构造的Range头内容,可排除这两者的影响。
稳妥高效的实现方案
你可以按照以下逻辑改造代码,既不会下载多余数据,也不会给公共服务器造成过大压力:
1. 字节范围预处理
- 按单批最多15~18个范围的阈值拆分所有待请求区间,不要卡20的上限,预留冗余应对不同服务器的配置波动。
- 优先将位置临近的小范围合并为连续的大区间,即使多下载极少量无关字节,开销也远低于多发起一次HTTP请求,你可以根据自身业务的流量容忍度调整合并阈值。
2. 请求规则优化
- 每批请求间隔设置为1~2秒,避免短时间请求量过高触发服务器限流规则。
- 首次请求拿到文件ETag后,后续所有请求都携带
If-Match头,值为该ETag,避免下载过程中源文件更新导致字节范围错位。 - 每次收到响应后先校验
Content-Type是否为multipart/byteranges,如果不是则重试当前批次,避免误下载完整文件浪费流量。
3. 本地文件拼接
- 解析每批返回的multipart响应后,直接按字节偏移量将各个片段写入本地文件的对应位置,无需等待所有请求完成再处理,降低内存占用。
内容的提问来源于stack exchange,提问作者Karl Schneider
相关产品推荐
相关产品推荐

