Monolith 单文件保存网页详解:把整个网页存进一个 HTML,5 条命令上手
【免费下载链接】monolith⬛️ CLI tool and library for saving complete web pages as a single HTML file项目地址: https://gitcode.com/GitHub_Trending/mo/monolith
用浏览器"另存为网页",多半存下一个 HTML 加一堆散落的资源文件,换台机器打开就图片缺失、排版错乱;wget虽然能递归抓取,却留下一整个目录树,分发和归档都很麻烦。Monolith是一个 Rust 编写的命令行工具,把网页连同 CSS、图片、JavaScript 一起嵌入,输出一个可离线打开的单文件 HTML——断网双击,页面和线上一模一样。
_____ _____________ __________ ___________________ ___ | \ / \ | | | | | | | \/ __ \| __ \| | ___ ___ |__| | | | | \ | | | | ___ ___ | | | | |\ /| |__| \__| \___| \___ \___ |__|/ | | | \__/ | |\ | | | | | | | |___| |__________| \___________________|___|___|___|___|_/_|安装 Monolith:跨平台任选其一
各平台都有官方安装渠道:macOS 用 Homebrew,Arch、Alpine、Void 等 Linux 发行版各有包管理器,Windows 可选 Chocolatey 或 Scoop,通用方案是 Cargo:
cargo install monolith从源码构建需要先装libssl和 Rust 工具链,仓库提供 Makefile,执行make install即可;发布版本还附带 Windows 与 ARM 架构的预编译二进制。
基础用法:一条命令保存完整网页
核心用法就是给一个 URL 加一个输出文件名:
monolith https://example.com -o example.html输出文件名还支持%title%和%timestamp%占位符,批量保存同一网站时能自动按页面标题加时间戳命名,不会互相覆盖:
monolith https://news.ycombinator.com -o %title%.%timestamp%.htmlMonolith 常用参数速查表
高频参数集中在几类"取舍"上,按需组合:
| 参数 | 作用 |
|---|---|
-I | 隔离文档:移除外部链接与脚本,页面只依赖自己携带的资源 |
-e | 忽略网络错误,部分资源下载失败也继续保存 |
-B/-d | 配合域名列表做黑名单 / 白名单,控制从哪些域名抓资源 |
-i/-c/-j | 分别去掉图片、CSS、JavaScript,换更小的文件 |
-f/-F/-a/-v | 去掉框架、Web 字体、音频、视频 |
-n | 展开 NOSCRIPT 元素内容,保留不执行 JS 时显示的替代文字 |
-m | 输出 MHTML 格式(不支持内嵌 JS),适合邮件附件 |
-C | 从 Netscape 格式 cookie 文件读取登录态 |
-b | 指定 base URL,处理相对链接(配合标准输入时使用) |
-u/-t | 自定义 User-Agent / 单个资源的网络超时(默认 120 秒) |
其中-I和-e最常用:前者让归档文件彻底不请求外网,后者容忍个别 404 资源,保证整页流程不被打断。
实战场景:批量、动态页与登录页
批量归档可以写成几行脚本,按 URL 哈希命名,避免文件名冲突:
while read url; do monolith -I -e "$url" -o saved/$(echo "$url" | md5sum | cut -d' ' -f1).html done < urls.txtMonolith 不带 JS 引擎,内容靠接口异步渲染的页面需要无头浏览器先把 DOM 跑完,再交给它整理资源:
chromium --headless --dump-dom https://example.com | monolith - -I -b https://example.com -o example.html-b在这里不能省:管道传进来的 HTML 没有原始上下文,相对路径的资源全靠它解析出完整 URL。
需要登录的页面有两条路。HTTP Basic 认证直接写在 URL 里;SPA 式的会话登录则导出浏览器 cookies(Netscape 格式)用-C传入:
monolith https://username:password@example.com -o auth.html monolith https://private.example.com -C cookies.txt -o page.html另外两个实用细节:-m可输出 MHTML(会强制去掉 JS),适合发邮件附件;遇到字符集识别异常时,用-E UTF-8强制指定编码再保存。
它是怎么做到"一个文件"的
Monolith 的工作流程可以概括为:解析 DOM → 遍历每个资源引用点 → 抓取资源 → 改写为 data URL 回填。图片、音视频经 base64 转成 data URL 写回对应属性;JS、JSON 等文本类资源直接内联进文档;<style>和外部样式表里的url()、@import会被递归展开,字体文件同样内联。重复资源走磁盘缓存避免重复下载。
实现是 Rust 的:src/core.rs 编排整个流程,src/html.rs 负责 DOM 遍历与属性改写,src/css.rs 展开样式中的资源引用,src/url.rs 处理 URL 解析与 data URL 生成,src/session.rs 管网络请求,src/cache.rs 管磁盘缓存。tests/目录下的集成测试覆盖了 CSS 嵌入、数据 URL、SRI 校验、GBK/ISO-8859-1 编码等边界场景,可以当作行为参考。
一句话总结:monolith 把"一个页面"压成"一个文件"。无论是归档论文网页、保存临时公告,还是给同事发离线可开的页面,它都比重复开十几个标签页再逐个截图靠谱得多。
【免费下载链接】monolith⬛️ CLI tool and library for saving complete web pages as a single HTML file项目地址: https://gitcode.com/GitHub_Trending/mo/monolith
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考