
Monolith一页一文件4 条命令把完整网页保存为单文件 HTML【免费下载链接】monolith⬛️ CLI tool and library for saving complete web pages as a single HTML file项目地址: https://gitcode.com/GitHub_Trending/mo/monolith浏览器的另存为离线基本没法看页面壳子存下来了CSS、图片、脚本全留在服务器上断网打开就是一副骨架。Monolith 是一个 Rust 写的 CLI 工具把 CSS、JavaScript、图片、字体一次抓完内联进一个 HTML 文件里——一个页面就是一个文件离线网页归档到这一步就该停了。它到底帮你省了什么写调研时会遇到一堆只出现一次的引用页论文落地页、项目的 release notes、某版本文档的存档。浏览器另存为会生成一个二十来个小文件的文件夹半年后分不清哪个是入口也没法直接发给同事。用 monolith 存成单 HTML 文件离线渲染出来就是浏览器里的样子连 JS 画出来的图表都在。竞品落地页想反复看文案和结构但对方站点不方便一直挂着。存一份单文件到本地离线慢慢分析文件也能直接丢给团队评审不用解释截图可能不全。设计师的案例站经常是单页配几十张大图加 CSS 背景图浏览器保存会漏掉背景图页面直接散架。Monolith 会把背景图、srcset 里的各尺寸图一起拉下来内联离线打开时和线上一致。装好它跑第一条命令平台命令已有 Rust 环境跨平台cargo install monolithmacOS / GNU/Linuxbrew install monolithWindowschoco install monolith或scoop install main/monolith、winget install --idY2Z.Monolith -eGNU/Linux (Snap)snap install monolithArch Linuxpacman -S monolithAlpine Linuxapk add monolithVoid Linuxxbps-install -S monolithFreeBSDpkg install monolithNixOSnix-env -iA nixpkgs.monolith从源码构建git clone https://gitcode.com/GitHub_Trending/mo/monolith然后cd monolith make install依赖 libssl 和 cargo第一次保存一个页面monolith https://example.com -o example.html终端会逐条打印它抓取的每个资源 URL跑完后 example.html 就是包含全部资源的单文件加-q可静默输出。参数速查参数作用典型组合示例-o FILE指定输出文件传-表示写到 STDOUT-o saved.html-I隔离文档保存过程中切断与页面的网络联系-I -o page.html-e忽略网络错误某个资源 404 也不中断整体保存-e -o page.html-d DOMAIN只允许列表内域名提供资源可多次使用-I -d example.com -d cdn.example.com-B把-d列表反过来当黑名单适合屏蔽广告域-I -B -d .google.com-C FILE从 Netscape 格式的 cookie 文件读取会话-C cookies.txt-b URL指定基础 URL配合-读 STDIN 时解析相对路径- -b https://example.com-E ENCODING强制输出编码-E UTF-8一条组合起来的实战命令monolith -I -e -B -d .google.com https://example.com -o example-no-ads.html意思是隔离模式 出错继续 屏蔽 google.com 域名的资源产出一个不加载任何 Google 系资源的单文件。几个值得试的玩法批量保存脚本urls.txt 里一行一个地址md5 当文件名避免重复while read -r url; do monolith -I -q $url -o saved/$(echo $url | md5sum | cut -d -f1).html done urls.txt带 Cookie 保存登录页用浏览器插件把 cookie 导出成 Netscape 格式文件然后monolith -C cookies.txt -I https://example.com/account -o account.html文件里的 cookie 会逐条校验域名和过期时间失效的不会发出去。JS 渲染页怎么处理Monolith 没有 JS 引擎内容靠脚本加载后才出现的页面先让 Chromium 把渲染完的 DOM 倒出来再喂给它chromium --headless --virtual-time-budget9000 --dump-dom https://example.com \ | monolith - -b https://example.com -o example-dynamic.html-表示从 STDIN 读-b告诉它相对路径资源该按哪个基础 URL 去解析。它内部在做什么Monolith 拿到目标文档——可以是 URL、本地文件也可以是管道里的 STDIN——先交给 html5ever 解析成 DOM如果页面声明了 GB2312 这类非 UTF-8 编码它会按声明重新解析一遍。接下来一个自定义遍历器扫过整棵 DOM把 img 的 src 和 srcset、link、script以及 CSS 里url()引用的资源全部摘出来CSS 部分由 cssparser 拆开。每个资源都通过 reqwest 的阻塞客户端去取默认 User-Agent 是一个 Firefox 字符串每个请求 120 秒超时10KB 以上的大资源会先进一个基于 redb 的临时缓存避免同一资源被重复下载。取回来的数据按类型内联进文档——图片这类二进制走 base64 的 data URLJS、CSS、SVG 这类文本直接嵌入。资源抓取在 src/session.rs整体流水线的调度在 src/core.rs有兴趣可以顺着看。最后 DOM 被序列化回一个 HTML 文件默认附带标题和时间戳元信息加-m则输出 MHTML 格式。所有外部引用都换成了 data URL所以这个文件断网打开也能原样渲染。踩过的坑与对策CDN 资源 403页面缺图现象保存完打开部分图片缺失终端里一串网络报错。原因很多第三方 CDN 会拦非浏览器 UA 或防盗链默认 UA 被拒。对策换 UA 重试或者直接吞掉错误继续保存monolith -e -u Mozilla/5.0 (Windows NT 10.0; Win64; x64) https://example.com -o page.html中文乱码现象页面里的中文部分变成方块或问号。原因原页面声明了 GB2312/ISO-8859-1或者压根没声明编码导致检测失败。Monolith 会自动读 HTML 里的 charset 声明并按其重新解析仍然不对就强制指定输出编码monolith -E UTF-8 https://example.com -o page.html单文件体积爆炸现象一个页面存出来几百 MB。原因页面里的大视频、音频默认也会被完整内联。对策把不需要的媒体类型去掉-a去音频、-v去视频-i/-j/-c还能分别去图片、JS、CSSmonolith -a -v https://example.com -o page-slim.html收藏列表里那个存了三年一直没归档的长文页面拿它试一条命令就够了。存成单 HTML 文件之后断网打开也照样完整。【免费下载链接】monolith⬛️ CLI tool and library for saving complete web pages as a single HTML file项目地址: https://gitcode.com/GitHub_Trending/mo/monolith创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考