应优先用 response.content 写文件,因其为原始字节,避免 response.text 因 encoding 错误导致中文乱码;需检查 status_code 和 content-type 是否为 text/html,再验证 HTML 结构。

直接用 requests.get() 获取响应体再写入文件即可,不需要框架或额外解析——多数人卡在编码识别和反爬响应处理上。
为什么 response.text 保存后中文乱码?
因为 requests 默认按 response.encoding 解码,但该值常为空或错误(比如服务器没发 Content-Type 头),导致 .text 解码失准。真正可靠的源码是 response.content(原始字节)。
- 始终优先用
response.content写文件,而非response.text - 若需检查编码,可调用
response.apparent_encoding(基于 chardet 推断,仅作参考) - 写文件时显式指定
encoding='utf-8'仅适用于你已确认内容为 UTF-8;否则直接二进制写入最安全
保存前要检查哪些 HTTP 响应状态?
不是所有 200 都返回真实 HTML:有些网站返回登录页、跳转提示或空模板,而 403/404 却可能混着有效内容(如单页应用的 fallback HTML)。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 必须检查
response.status_code,但别只拦!= 200—— 加上response.headers.get('content-type', '').startswith('text/html') - 简单验证 HTML 结构:用
b' 快速筛掉明显非 HTML 响应(如 JSON、图片、重定向 meta) - 遇到
503或频繁429,说明被限流,需加headers={'User-Agent': '...'}和合理time.sleep()
如何避免保存成空文件或截断?
常见原因是未正确关闭文件句柄,或异常中断导致写入不全。用 with open(...) 是底线,但还要防网络层提前断连。
立即学习“Python免费学习笔记(深入)”;
- 务必用
with open(filename, 'wb') as f:——'wb'模式对应response.content的 bytes - 添加超时:
requests.get(url, timeout=(3.05, 27))(连接 3.05s,读取 27s),避免挂死 - 捕获
requests.exceptions.RequestException,失败时记录 URL 和错误类型,不要静默跳过 - 小技巧:保存前先
os.makedirs(os.path.dirname(filename), exist_ok=True),避免路径不存在报错
真正难的不是“怎么存”,而是判断“该不该存”——服务器返回的 HTML 可能是渲染后的 SPA 页面、含动态加载的骨架屏,或带时间戳的防采集标记。这时候存下来的只是表象,得结合 requests-html 或 selenium 才能抓到真实 DOM。


















