requests.get()响应体保存为HTML文件应优先用response.content配合显式解码,或设response.encoding='utf-8'后用response.text写入,并指定encoding='utf-8'和errors='replace';空白或乱码常因JS动态渲染、User-Agent被拒或编码不匹配所致。

requests.get() 返回的响应体怎么保存成 .html 文件
直接用 response.text 写入文件最常用,但要注意编码是否匹配网页声明。很多网页在 <meta charset="utf-8"> 或 HTTP Content-Type 头里指定了编码,requests 通常能自动识别,但偶尔会误判为 ISO-8859-1,导致中文乱码。
实操建议:
- 优先用
response.content(原始字节)配合显式解码写入,更可控 - 若用
response.text,务必检查response.encoding是否正确;不放心就手动设为response.encoding = 'utf-8'再读 - 写文件时统一用
encoding='utf-8',并加errors='replace'防止个别异常字符中断
import requests
<p>url = "<a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>"
response = requests.get(url)
response.encoding = response.apparent_encoding or 'utf-8' # 比仅靠 headers 更稳妥</p><p>with open("page.html", "w", encoding="utf-8", errors="replace") as f:
f.write(response.text)为什么保存后打开是空白或乱码
常见错误现象:浏览器双击打开 HTML 文件显示空白、方块、问号,或控制台报 Failed to load resource: net::ERR_INSECURE_RESPONSE(其实和这个无关,是本地文件协议限制)。
根本原因往往不是代码逻辑错,而是:
立即学习“Python免费学习笔记(深入)”;
- 网页用了动态渲染(如 React/Vue),
requests只拿到初始 HTML 骨架,真实内容由 JS 注入 —— 这时必须换selenium或playwright - 服务器校验
User-Agent,返回空内容或重定向到错误页;加个合法头就能解决 - 响应实际是 gzip 压缩但未自动解压(极少见),可检查
response.headers.get('content-encoding')
快速验证方式:打印 len(response.text) 和 response.status_code,200 但长度
需要保留图片/CSS/JS 等静态资源吗
单纯用 requests.get().text 保存,只存了 HTML 源码,所有 <img src="...">、<link href="..."> 引用的外部资源仍需联网加载。离线查看会显示“找不到图像”或样式丢失。
如果真要完整保存(含内联或下载资源),得额外处理:
- 解析 HTML(用
BeautifulSoup),提取src/href属性,对每个相对路径补全为绝对 URL - 逐个
requests.get()下载,并按路径结构存为本地文件(如assets/img/logo.png) - 改写原 HTML 中的链接指向本地路径 —— 注意别漏掉
background-image、@import等隐式引用
这不是几行代码能搞定的事,webcopy 或 HTTrack 这类专用工具更可靠。Python 里硬做容易漏边缘 case(比如 base64 图片、data URLs、CSS 中的 url())。
遇到反爬时 requests 报 403 或跳转到验证码页怎么办
requests 默认请求头非常简陋,很多网站直接拒绝。最轻量的修复就是补全基础字段:
- 必加
User-Agent:模仿主流浏览器,例如"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" - 可选加
Accept、Accept-Language、Referer(尤其当目标页是跳转来的) - 某些站还校验
Sec-Fetch-*头,这时 requests 就力不从心了,得切到无头浏览器
示例:
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8",
}
response = requests.get(url, headers=headers)如果加了头还是 403,大概率该站点做了行为分析(如请求频率、TLS 指纹、鼠标轨迹等),这时候 Python + requests 已经不是合适工具了。



















