能,但需正确处理编码和状态码;应优先用response.content手动解码或设response.encoding,调用raise_for_status()检查错误,且requests无法获取JS渲染内容。

requests.get() 能直接拿到HTML源码吗
能,但必须注意响应编码和状态码。很多新手拿到 response.text 发现中文是乱码,其实是服务器没返回 Content-Type 中的 charset,requests 默认用 ISO-8859-1 解码导致的。
正确做法是优先用 response.content(原始字节)手动解码,或显式设置 response.encoding:
import requests
r = requests.get('https://example.com')
r.raise_for_status() # 检查4xx/5xx错误
r.encoding = r.apparent_encoding # 或指定 'utf-8'
html = r.text- 永远调用
r.raise_for_status(),否则 404、503 会被静默忽略 - 不要依赖
r.text自动推断编码,apparent_encoding更靠谱但仍有误判可能 - 若页面明确声明
<meta charset="gb2312">,应优先按该值解码
保存HTML时文件编码和换行符怎么处理
用 open(... , encoding='utf-8') 写入即可,但要注意 Windows 默认记事本对 UTF-8 BOM 敏感 —— 不加 BOM 可能显示乱码,加了又可能被某些解析器报错。
推荐无 BOM 的 UTF-8,并统一用 \n 换行(Python 默认):
立即学习“Python免费学习笔记(深入)”;
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
with open('page.html', 'w', encoding='utf-8') as f:
f.write(html)- 避免用
encoding='gbk'等本地编码,跨平台会出问题 - 不要用
open(..., 'wb')直接写response.content,除非你确定字节流就是最终要存的内容(比如含图片的二进制响应) - 文件名含中文时,在 Windows 上用
sys.stdout.reconfigure(encoding='utf-8')(Python 3.7+)可避免控制台报错,但不影响文件写入
遇到反爬时 headers 设置哪些字段最关键
多数静态页面只校验 User-Agent,但有些站点还会检查 Accept、Accept-Language 甚至 Sec-Ch-Ua。最简有效组合是模拟主流浏览器请求头:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 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',
}-
User-Agent必须设,空值或默认值(python-requests/2.x)极易被拦截 - 加
Accept和Accept-Language能绕过部分基于 header 的初级过滤 - 不要盲目复制完整 Chrome 请求头,
Sec-*类字段在 requests 里无法真实生成,硬加反而暴露异常
为什么有时保存的HTML和浏览器看到的不一样
因为页面大量内容由 JavaScript 渲染,requests 只拿原始 HTML,不执行 JS。这是最常被忽略的根本原因。
判断方法:禁用浏览器 JS 后刷新,如果内容消失或变少,说明依赖 JS 渲染。
- 纯
requests无法解决这类问题,得换selenium或playwright - 部分站点提供 API 或 JSON 接口,比渲染后 HTML 更稳定,建议先抓包看 network 面板
- 即使用了浏览器自动化,也要等关键元素出现再取
page.content(),不能立即获取,否则还是空的
JS 渲染、动态 token、滚动加载这些,已经超出「保存 HTML 源码」的范畴,属于前端逆向或自动化操作了。


















