自动化、批量地把“浏览器 Network 面板里看到的所有请求(HTML、JS、CSS、图片、字体等)”保存下来,通常有三种思路,按“最接近 F12 体验 → 最自动化 → 最轻量”排序如下:
------------------------------------------------
1. 浏览器插件方案(最接近 F12、零代码)
1. 装 Chrome/Edge 扩展 SingleFile
- 一键把当前页面连同所有静态资源打成 1 个 HTML(内嵌 base64)
- 支持“保存所有标签页”“自动保存”等批量模式,无需自己写脚本
- 可配置保留/去掉 JS、CSS、视频等
- 离线打开时与在线版几乎 1:1 还原,包括懒加载图片
- 适合“非程序员”或“临时一次性”批量归档
- 示例:打开 20 个页面 → 右键插件图标 → “保存选中的标签”即可一次性得到 20 个完整离线文件
2. 如要“纯原生”调试包,可在 DevTools → Network → 右键“Save all as HAR with content”,然后用
`chrome-har-capturer` 或 `har-export` 把 HAR 里每个 URL 重新拉取一遍;缺点是多一步解析,且不会自动改写路径。------------------------------------------------
2. 无头浏览器 + 拦截请求(最自动化、可编程)
用 Playwright/Puppeteer 启动 Chromium,监听 `page.on('request')` / `page.on('response')`,在内存或本地直接写文件:
```python
from playwright.sync_api import sync_playwright
import pathlib, hashlib, urllib.parse
def save_all_responses(url, out_dir='site'):
pathlib.Path(out_dir).mkdir(exist_ok=True)
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
# 拦截所有响应
def handle(res):
if res.headers.get('content-type', '').startswith(('text/', 'application/javascript', 'image/', 'font/')):
body = res.body() # bytes
u = urllib.parse.urlparse(res.url)
name = hashlib.md5(res.url.encode()).hexdigest() + pathlib.Path(u.path or '/index').suffix
(pathlib.Path(out_dir)/name).write_bytes(body)
print('saved', res.url, '->', name)
page.on("response", handle)
page.goto(url, wait_until='networkidle')
page.context.close()
```
优点
- 完全程序化,可批量循环 N 个页面
- 能拿到“真实”请求顺序、响应头、Cookie 等,与 Network 面板 100% 对齐
- 可把 URL 自动改写为本地相对路径,离线直接双击 index.html 浏览
缺点
- 对视频/流式大文件要额外处理。
------------------------------------------------
3. 命令行一次性镜像(最轻量、无需写代码)
如果目标站没有 heavy JS 渲染,用 wget 或 httrack 即可:
```bash
# 下载 example.com 全站(含 CDN 资源),本地可浏览
wget --mirror \
--convert-links \
--adjust-extension \
--page-requisites \
--span-hosts \
--no-parent \
-e robots=off \
-P ./example_mirror \
https://example.com
```
解释
--mirror 递归抓取
--convert-links 把外链改成相对路径,离线可点
--span-hosts 允许跨域(CDN)
--page-requisites 拉取 JS/CSS/图片等“渲染必需品”
--no-parent 不跑到上级目录
适合“整站克隆”;缺点是单页应用(SPA)或需要登录/点击才能触发的 XHR 会抓不到,这时回到方案 2 用无头浏览器才行
------------------------------------------------
结论速选
- “我就想点几下完事”→ 装 SingleFile,批量保存标签页。
- “每天要定时跑 100 个页面”→ Playwright/Puppeteer 监听 request/response,自动落盘。
- “整站静态备份,无登录无 JS 动态”→ wget --mirror --span-hosts --convert-links 一条命令解决。

251

被折叠的 条评论
为什么被折叠?



