你是否遇到过这些问题?
收藏了一篇好文章,几个月后再打开——空白页、无限加载 spinner,或者一个已经不存在的 analytics 服务器请求导致整个页面卡死。这个页面从来就不属于你,它只是别人 JavaScript 的一个瘦客户端。
另一个场景:你需要在无网络环境下阅读某个文档站(飞机上、野外作业、或者某个机房),或者你想永久保存某个网站的内容以防它某天突然下线。
今天介绍的 kage(日语"影",读作 /ka-ge/),就是为了解决这些问题而生的。
kage 是什么?
kage 是一个用 Go 编写的开源命令行工具,它通过 headless Chrome 真实渲染页面,等待页面加载完成后截取 DOM 快照,然后自动删除所有 JavaScript,并将 CSS、图片、字体等静态资源下载到本地。最终你得到的是一个可以在磁盘上直接打开的 .html 文件集合,完全不依赖网络,不执行任何脚本。
- ⭐ GitHub Stars: 2600+(2026 年 6 月创建,增长迅猛)
- 🏷️ 语言: Go
- 📜 许可证: MIT
- 🧑💻 作者: tamnd
kage vs 传统"另存为"
| 特性 | 浏览器"另存为" | wget / curl | kage |
|---|---|---|---|
| JavaScript 渲染 | ❌ | ❌ | ✅ headless Chrome 完整渲染 |
| 自动剥离 JS | ❌ | ❌ | ✅ 彻底删除所有脚本 |
| SPA/动态内容支持 | ❌ | ❌ | ✅ 支持 Vue/React/Angular 页面 |
| 整站克隆 | ❌ | ⚠️ 有限 | ✅ 自动跟踪链接,广度优先爬取 |
| 打包为单文件 | ❌ | ❌ | ✅ ZIM / 自包含可执行文件 |
| 离线可用 | ⚠️ 经常失败 | ⚠️ 经常失败 | ✅ 完美离线 |
核心工作原理
访问 URL → headless Chrome 渲染 → 等待页面稳定 → 截取最终 DOM → 删除所有 <script> → 下载 CSS/图片/字体 → 保存到本地 → 继续跟踪链接
kage 不是简单下载 HTML 源码,而是像一个真正的浏览器那样渲染页面,确保最终保存的就是用户肉眼看到的完整页面。
安装 kage
kage 提供了多种安装方式,覆盖 Linux、macOS、Windows 三大平台。
方式一:通过 Go 安装
如果你已经安装了 Go(推荐 Go 1.21+):
go install github.com/tamnd/kage/cmd/kage@latest
方式二:通过 Homebrew(macOS)
brew install --cask tamnd/tap/kage
方式三:通过 Scoop(Windows)
scoop bucket add tamnd https://github.com/tamnd/scoop-bucket
scoop install kage
方式四:通过 apt(Ubuntu/Debian)
# 添加仓库密钥和源
curl -fsSL https://tamnd.github.io/linux-repo/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/tamnd.gpg
echo "deb [signed-by=/usr/share/keyrings/tamnd.gpg] https://tamnd.github.io/linux-repo/apt stable main" | sudo tee /etc/apt/sources.list.d/tamnd.list
sudo apt update && sudo apt install kage
方式五:通过 dnf(Fedora/RHEL)
sudo dnf config-manager --add-repo https://tamnd.github.io/linux-repo/dnf/tamnd.repo
sudo dnf install kage
方式六:通过 Docker(无需安装 Chrome)
Docker 镜像自带 Chromium,开箱即用:
docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com
安装后验证
kage --version
kage completion bash # 或 zsh / fish,开启 tab 补全
注意:kage 需要 Chrome 或 Chromium。除了 Docker 方式外,你需要在宿主机上安装一个 Chrome/Chromium。kage 会自动查找系统安装路径;也可以通过
--chrome参数或KAGE_CHROME环境变量指定。
快速上手:3 分钟克隆一个网站
以 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
这就完成了! 所有文章、所有图片、所有样式文件都冻结在你的磁盘上,零网络依赖即可运行。
限制克隆范围
如果你只需要快速体验,可以限制克隆深度:
# 只克隆前 50 页,最多跟踪 2 层链接
kage clone paulgraham.com --max-pages 50 --max-depth 2
# 只克隆网站的某个子目录
kage clone go.dev --scope-prefix /doc
# 跳过某些路径(排除广告或无关页面)
kage clone example.com --exclude /ads --exclude /track
实用参数速查
| 参数 | 默认值 | 说明 |
|---|---|---|
-o, --out |
$HOME/data/kage |
输出根目录 |
-p, --max-pages |
0(无限制) |
最多克隆 N 页 |
-d, --max-depth |
0(无限制) |
链接跟踪深度 |
--scope-prefix |
无 | 只克隆以该前缀开头的路径 |
--subdomains |
false |
包含子域名 |
--scroll |
false |
自动滚动页面(触发懒加载) |
--workers |
4 |
并发渲染页数 |
--no-robots |
false |
忽略 robots.txt |
--refresh |
false |
增量更新已有克隆 |
进阶功能
1. 自动滚动触发懒加载
很多现代网站使用图片懒加载(lazy loading),页面不滚动时图片不会加载。kage 支持自动滚动:
kage clone example.com --scroll
这会让 kage 自动滚动每个页面到底部,确保所有懒加载的图片、iframe 等内容都被完整渲染和保存。
2. 增量更新(--refresh)
一个月前克隆的博客更新了新文章?不需要重新从头克隆:
kage clone paulgraham.com --refresh
--refresh 会重新渲染已有页面,并抓取新增内容。kage 的克隆是幂等的:同一页面无论通过 http 还是 https 访问,都只保存一次。
3. 优雅中断与断点续传
克隆过程中按 Ctrl+C?没问题,kage 会自动保存当前进度:
# 按 Ctrl+C 中断,下次运行自动从断点继续
kage clone paulgraham.com
4. 包含子域名
kage clone example.com --subdomains
这会同时克隆 blog.example.com、docs.example.com 等子域名。
打包:从文件夹到单文件
克隆后的镜像是一个文件夹,包含数千个小文件。直接拷来拷去很慢。kage 支持将整个镜像压缩为单个文件。
方案一:打包为 ZIM 文件
ZIM 是 Kiwix 项目使用的开放离线格式,专为长期存档设计:
# 打包
kage pack paulgraham.com # 生成 paulgraham.com.zim
# 读取
kage open paulgraham.com.zim # 本地预览
# 也可以用 Kiwix 打开
kiwix-serve paulgraham.com.zim # HTTP 服务
为什么选 ZIM? ZIM 是一个公开的开放标准。你今天用 kage 创建的
.zim文件,十年后依然可以用 Kiwix 的任何阅读器打开。它支持 zstd 压缩,文本高度压缩、图片/媒体按原样存储。
方案二:打包为独立可执行文件
这是 kage 最酷的功能——一个可执行文件 = 整个网站:
# 打包为自包含的二进制文件
kage pack paulgraham.com --format binary -o paulgraham
# 直接运行,零依赖
./paulgraham
# 自动启动 HTTP 服务,浏览器访问即可
收到这个文件的人不需要安装任何东西:不需要 kage、不需要浏览器、不需要 ZIM 阅读器。直接运行就得到整个网站的离线版本。
二进制文件大约 13 MiB(kage 本体)+ 网站内容大小。
跨平台打包
你可以在 macOS 上为 Windows 打包:
# 在 Mac 上生成 Windows 可执行文件
kage pack paulgraham.com --format binary \
--base kage-windows-amd64.exe
# 输出 paulgraham.exe
只需从 releases 页面下载目标平台的 kage 二进制文件作为 --base 即可。
方案三:双击即用的桌面应用
加上 --app 参数,kage 会生成带图标的桌面应用:
# macOS → .app 包
kage pack paulgraham.com --app
open paulgraham.app
# Linux → AppImage
kage pack paulgraham.com --app --base kage-linux-amd64
# 输出 paulgraham.AppDir / paulgraham.AppImage
双击打开,没有终端窗口,直接进入网站。
实战场景
场景一:保存技术博客作为离线知识库
# 克隆 Paul Graham 全部文章
kage clone paulgraham.com --scroll -o ~/docs/paulgraham
# 打包为 ZIM,放进 Kindle/手机随时读
kage pack paulgraham.com
# 或者打包为单文件,发给朋友
kage pack paulgraham.com --format binary -o ~/share/paulgraham-essays
场景二:文档站离线版
# 克隆 Go 官方文档
kage clone go.dev --scope-prefix /doc --max-depth 3
# 出差飞机上没网络?本地 serve 即可
kage serve ~/data/kage/go.dev
场景三:长期归档
某些网站可能会关闭或迁移。用 kage 可以定期存档:
# 加入 cron,每月自动更新
# 0 2 1 * * kage clone example.com --refresh
注意事项
- robots.txt:kage 默认遵守
robots.txt规则。如果需要在开发/测试环境忽略它,加--no-robots。 - Chrome 依赖:除 Docker 外需要宿主机安装 Chrome/Chromium。
- 磁盘空间:大型网站克隆后可能占用数 GB 空间。
- 合法性:请尊重网站版权和 robots.txt,不要用于商业用途或侵犯版权的内容。
总结
kage 是目前最优雅的网站离线克隆工具。它用 headless Chrome 真实渲染页面,剥离所有 JavaScript,将动态网页变成真正的"属于你"的静态 HTML。ZIM 打包和自包含可执行文件让它成为长期存档和分发的完美方案。
- GitHub: tamnd/kage
- 官网: kage.tamnd.com
- 许可证: MIT
- 安装:
go install github.com/tamnd/kage/cmd/kage@latest
如果你经常需要在无网络环境下阅读文档,或者想永久保存某些网站的内容,kage 绝对值得加入你的工具箱。