curl和requests.get()是最可靠的原始HTML获取方式,它们模拟HTTP客户端直连服务器,不执行JS,直接返回服务端原始响应体。

不能直接“不打开网页”却拿到服务端原始HTML——关键在“谁发起请求”:浏览器打开是前端行为,而后台抓取必须由命令行或脚本主动向服务器发HTTP请求。 所有真正离线、不依赖人工点击的操作,本质都是模拟一次干净的 GET 请求并保存响应体。
curl 抓取原始 HTML 最简方式
这是最轻量、最可控的后台抓取手段,适合单页、静态内容、无登录态场景。
- 运行
curl https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635 > page.html即可把响应正文写入本地文件 - 若网站校验
User-Agent或拒绝空头请求,加-H "User-Agent: Mozilla/5.0" - 遇到重定向(如 HTTP → HTTPS),加
-L参数自动跟随 - 中文乱码?不是编码问题,而是服务器没返回
Content-Type: text/html; charset=utf-8——此时需手动用文本编辑器以 UTF-8 重新打开并另存,curl本身不转码
wget 获取 HTML + 关联资源(离线可用)
当你要双击 page.html 就能正常显示样式和图片,wget 比 curl 更合适,但它抓的是“渲染前”的原始 HTML,不是 DOM。
- 基础命令:
wget -O page.html https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635(只存 HTML) - 要带 CSS/JS/图片:
wget --page-requisites --convert-links --no-parent https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635 -
--page-requisites是核心,它会下载<link>、<script>、<img>中的资源 -
--convert-links把绝对路径(如https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635/style.css)改成相对路径(style.css),否则本地双击打不开 - 注意:
wget默认不进子目录,加--no-parent防止爬到站外或无限递归
requests + Python 脚本灵活控制响应
需要处理 Cookie 登录、表单提交、动态参数或批量抓取时,Python 的 requests 库更可靠。
立即学习“前端免费学习笔记(深入)”;
- 先确保安装:
pip install requests - 基础脚本示例:
import requests
<p>url = "<a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>"
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
resp.raise_for_status() # 抛出 4xx/5xx 错误
with open("page.html", "wb") as f:
f.write(resp.content) # 用 .content 而非 .text,避免编码二次处理- 若页面需登录,先用
session = requests.Session(),再post登录接口,后续get自动携带 Cookie - 不要用
resp.text写文件——它已按推测编码解码过一次,可能损坏二进制或特殊字符;resp.content是原始字节流,更安全 - 超时必须设:
requests.get(..., timeout=10),否则卡死无提示
为什么 Puppeteer / Selenium 不算“后台抓取原始 HTML”
它们启动真实浏览器,执行 JS、等待动态渲染,最终拿到的是 document.documentElement.outerHTML ——也就是 DOM 快照,不是服务器返回的原始 HTML。
- 你看到的
<div id="app"></div>被 Vue 填充后的内容,curl和wget都拿不到 - 这类工具适合 React/Vue/Angular 页面,但开销大、启动慢、需维护浏览器驱动
- 如果目标只是“保存源码”,而非“保存最终渲染结果”,就别用它们——徒增复杂度,还容易被反爬识别为自动化行为
真正容易被忽略的一点:所有后台抓取都绕不开服务端响应头里的 Content-Encoding: gzip。如果网站开了 Gzip 压缩,curl 和 wget 默认自动解压,但自己写脚本时若用 urllib 等低层库,得手动处理解压逻辑,否则写出来的 page.html 是乱码二进制。



















