kage:一行命令把任意网站存进硬盘,还能离线打开——无头浏览器本地快照工具完整上手指南
【免费下载链接】kageShadow any website for offline viewing, with the JavaScript stripped out项目地址: https://gitcode.com/gh_mirrors/kage6/kage
kage是一个开源的本地网站快照工具:用一行命令驱动无头浏览器渲染整个网站,剥掉全部 JavaScript,把页面、CSS、图片、字体全部下载到本地硬盘,得到一个可以离线打开、零代码执行的网站镜像。无论是坐飞机、断网、还是给十年后的自己存一份备份,这份完整指南带你快速上手。
为什么"另存为"总是失败?
你肯定遇到过:点"Save As"存下一页,六个月后打开是空白或永远转圈。原因很简单——现代网站不是一个文档,而是一段程序。服务器发出的 HTML 往往只是个空壳,你看到的页面是浏览器里的 JavaScript 现场拼出来的。"另存为"存到的是空壳,而不是页面。
kage 走了另一条路:
- 渲染:用真实的无头 Chrome 打开每个页面,等网络安静下来,抓取 JavaScript 执行完毕后的最终 DOM——和你打开"检查"看到的一模一样
- 剥离:删掉所有
<script>标签、onclick等事件处理器、javascript:链接,让页面彻底"失去行动能力" - 本地化:下载全部样式表、图片、字体,把引用改写成本地路径
结果就是:落盘的页面看起来和线上完全一样,但不运行任何代码、不发任何网络请求、不追踪任何东西。核心流程实现见 introduction.md。
一键安装步骤
kage 是单个二进制文件,安装方式任选其一:
# Go 用户 go install github.com/tamnd/kage/cmd/kage@latest # macOS brew install --cask tamnd/tap/kage # Windows scoop bucket add tamnd https://github.com/tamnd/scoop-bucket scoop install kage也提供apt/dnf包、.deb/.rpm/.apk安装包,以及自带 Chromium 的 Docker 镜像。安装细节见 installation.md。
⚠️唯一依赖:kage 需要一台装有 Chrome 或 Chromium 的电脑(容器镜像除外)。它会自动查找系统安装,也可以用
--chrome指定路径。找不到浏览器时,首次运行还会自动下载一份专用 Chromium。
快速上手:两行命令拿到离线镜像
以 Paul Graham 的随笔站为例,核心循环只有两步:
# 1. 克隆网站到 $HOME/data/kage/paulgraham.com/ kage clone paulgraham.com # 2. 用本地服务器离线读回 kage serve $HOME/data/kage/paulgraham.com # 然后打开 http://127.0.0.1:8800就这么简单。每篇文章、每张图片、每个样式表都被冻结在你的硬盘上,零网络即可完整浏览。爬取完成后的磁盘结构长这样:
paulgraham.com/ ├── index.html # 首页,脚本已剥离 ├── greatwork.html # 一篇文章 └── _kage/ # 本地化资源与爬取状态 ├── paulgraham.com/site.css # 本地样式表 └── state.json # 断点续爬状态直接双击index.html用浏览器打开也能离线渲染;而kage serve启动的是本地静态服务器,能保证站点内的相对链接像线上一样正常跳转。
控制爬取范围:常用参数速查
大站点别让它跑飞,这几个参数最常用(完整列表见 cli.md):
| 参数 | 作用 |
|---|---|
--max-pages 50 | 最多渲染 50 页,先"尝个鲜" |
--max-depth 2 | 只跟进 2 层链接 |
--scope-prefix /doc | 只爬某个路径及其子页面 |
--subdomains | 把子域名也纳入范围 |
--exclude /archive | 跳过某个路径(可重复使用) |
--scroll | 自动滚动页面,触发懒加载图片 |
--workers 4 | 并发渲染页面数 |
# 只抓文档区、最多 200 页、3 层深度 kage clone example.com --scope-prefix /docs --max-depth 3 --max-pages 200kage 天生"礼貌":默认遵守robots.txt、自动从sitemap.xml获取种子 URL,并且只留在种子主机内。相关策略见 robots.md。
断网了也不怕:中断后自动续爬
克隆大站经常被打断:按了 Ctrl-C、电脑休眠、网络掉线。kage 每次运行都会把进度写进镜像内的state.json,下次执行同一条命令时自动跳过已完成的页面,从断点继续:
kage clone example.com # ... 中途 Ctrl-C ... kage clone example.com # 输出:resume: 137 pages already done, picking up 412 pages失败的页面(超时、主机暂时宕机)不会被标记为完成,下一轮自动重试。想推倒重来则加--force,完整机制见 resuming-a-run.md。
把整个网站压成一个文件:kage pack
文件夹好浏览但不好携带——几千个小文件拷贝慢、发给别人也麻烦。kage pack能把整个镜像压成单个文件,三种形态任选:
ZIM 档案(默认)——开放标准格式,任何 ZIM 阅读器都能打开,文本经 zstd 压缩,同一镜像两次打包产出字节级一致的文件:
kage pack paulgraham.com # -> paulgraham.com.zim kage open paulgraham.com.zim # 本地 HTTP 服务读回自包含可执行文件——把档案粘在 kage 二进制上,对方什么都不用装,双击即开:
kage pack paulgraham.com --format binary -o paulgraham ./paulgraham # 自带服务器,离线展示网站双击桌面应用——加--app后,macOS 生成.app、Linux 生成 AppImage、Windows 生成无控制台窗口的.exe,图标自动取站点 favicon。详细说明见 packing-a-mirror.md。
像真应用一样打开:原生窗口模式
默认方式下,打包好的二进制会打开系统浏览器,网站出现在又一个标签页里。用webview标签构建 kage 后,它会调用操作系统原生的 WebView(macOS 的 WKWebView、Windows 的 WebView2、Linux 的 WebKitGTK),把离线站点装进独立窗口,观感上就是一个真正的桌面应用:
make build-webview # 需要 cgo kage pack paulgraham.com --format binary --base bin/kage -o paulgraham ./paulgraham # 弹出独立窗口,没有浏览器该模式实现位于 viewer/webview.go。
它是如何工作的(一张图看懂)
种子URL ─▶ 无头Chrome ─▶ 最终DOM ─▶ 剥离JS ─▶ 资源本地化 ─▶ 落盘 (渲染) (快照) (净化) (重写链接)页面由一组 Chrome 标签并发渲染,资源由另一组工作进程走普通 HTTP 下载;每个 URL 都确定性地映射到一个本地路径,所以链接在资源下载完成前就能被正确重写。代码按职责分模块组织:
| 模块 | 职责 |
|---|---|
| clone/ | 爬取主循环:任务队列、渲染工作进程、断点状态 |
| browser/ | 无头 Chrome 控制与 DOM 快照 |
| sanitize/ | 剥离脚本、事件处理器与javascript:链接 |
| asset/ | 下载并本地化 CSS、图片、字体 |
| zim/ | 纯 Go 的 ZIM 读写器 |
| pack/ | 打包成 ZIM 或自包含二进制 |
总结
kage 用最简单的方式解决了"保存网页"这个二十年老难题:
- ✅一行命令克隆整站,无头浏览器渲染真实页面
- ✅零 JavaScript:保存的页面不执行代码、不追踪、不发网络请求
- ✅断点续爬:Ctrl-C 随时中断,重跑即恢复
- ✅单文件交付:打包成 ZIM 或自包含可执行文件,发给谁都能离线打开
想从源码开始?
git clone https://gitcode.com/gh_mirrors/kage6/kage cd kage make build # -> bin/kage现在就把你担心有一天会消失的那个网站,存进硬盘吧。
【免费下载链接】kageShadow any website for offline viewing, with the JavaScript stripped out项目地址: https://gitcode.com/gh_mirrors/kage6/kage
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考