判断服务器是否支持断点续传需先发HEAD请求检查Accept-Ranges: bytes响应头,若存在则大概率支持;下载时必须校验响应状态码为206、正确设置Range头、以'ab'模式精准写入,并处理重定向导致Range丢失问题。

断线不是脚本的问题,而是 HTTP 协议和网络环境的常态;真正决定能否续传的,是服务器是否返回 206 Partial Content,以及你有没有正确处理 Range 头、'ab' 模式写入和重定向丢失这三件事。
怎么判断服务器支不支持断点续传?
别猜,直接发 HEAD 请求看响应头:
- 检查
Accept-Ranges: bytes—— 有这个头,大概率支持 - 用
requests.head(url, allow_redirects=True)获取真实目标的头(注意:allow_redirects=True是为了穿透 302,但后续续传时必须关掉) - 如果
Content-Length存在且稳定,说明文件没被动态生成或改名;若每次请求都变,续传基本不可靠 - 遇到 CDN 或 GitHub Releases 等服务,即使返回
200而非206,也别硬续——它可能压根不认Range
为什么用了 'ab' 还会覆盖或错位写入?
因为 'ab' 只保证“追加”,不保证“位置精准”。常见误操作:
- 本地文件被手动截断过(比如用文本编辑器打开又保存),
os.path.getsize()返回值,但代码没校验就直接发Range: bytes=1000-,结果写入位置漂移 - 没检查响应里的
Content-Range,比如服务器返回bytes 500-999/1000,但你本地文件已有 600 字节,那后 100 字节就重复了 - 用
open(..., 'ab')没问题,但写入前没做os.truncate()或清空逻辑,残留脏数据导致文件损坏
重定向会让 Range 失效,怎么手动修复?
requests.get(..., allow_redirects=True) 会丢掉原始请求的 Range 头,导致跳转后变成全量请求。必须自己接管重定向链:
Python 环境工具专业版功能概述Python 环境工具专业版是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。执行完成后建议检查结果是否符合预期,并保留必要记录。使用与执行同时注意输入完整性、执行条件和输出可用性。从功能定位来看,该技能
- 首次请求设
allow_redirects=False - 若响应是
301或302,从r.headers['Location']提取新 URL,并把原Range头带上重发 - 认证场景下(如带
Authorization: Bearer xxx),每次重定向后的请求都得重新塞凭证,不能只靠 session 复用 - 遇到
307 Temporary Redirect更要小心——它要求方法和 body 不变,GET+Range必须原样带上
什么时候该放弃续传,直接清空重下?
不是所有 4xx 都能重试。最危险的是 416 Requested Range Not Satisfiable:
- 出现
416,基本意味着服务端文件已变更(ETag 不同、内容被覆盖、CDN 缓存刷新),继续续传会导致文件结构错乱 -
200 OK响应却带完整内容(而非206),说明服务器忽略Range,此时应删掉本地文件再下 - 连续两次
ConnectionError后,别急着重试——先HEAD检查Content-Length是否与上次一致,不一致就别续了
真正的难点不在写几行 Range,而在于识别哪些信号是在告诉你:“这个断点已经失效了”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










