一、项目介绍

让 Agent 抓网页,最常见的方案是 Playwright 或 Puppeteer:功能全,但 Chromium 动辄几百 MB 内存,一开就是几秒启动;更麻烦的是 CDP 协议天然把整棵 DOM 树推给客户端,对上下文极不友好。

Moli 是为 AI Agent 重新设计的一套无头浏览器,用 Rust 写成。它的设计原则是"结构优先,像素按需"——完整保留浏览器运行时,但把布局与渲染做成按需触发:只需要结构时就不渲染像素,需要截图或 PDF 时才付出渲染代价。

它同时提供四种接入方式:CLI、CDP、WebDriver Classic 与 WebDriver BiDi,因此能无痛替换掉现有的浏览器自动化链路。输出格式也照顾模型:可以把页面渲染成 Markdown,或直接返回紧凑的语义树文本。它在 Product Hunt 上拿下当日产品第一,star 数约 2.16 万,Apache 2.0 协议。

Moli 的设计核心是一句话:结构优先,像素按需。传统无头浏览器启动 Chromium 时,布局与渲染是默认开启的——因为渲染引擎本身就在那,不算白费。但对 AI Agent 来说,很多时候它要的只是"这个页面有什么内容",根本不需要像素。渲染整棵页面再把 DOM 塞给客户端,是一种浪费。

Moli 保留了完整的浏览器运行时,但把布局与渲染做成可触发。用结构时不必付像素代价,需要截图或 PDF 时再渲染。这种"按需"的思路直接体现在它的输出格式上:可以把页面转成 Markdown,也可以直接返回紧凑的语义树文本——后者比原始 DOM 小得多,对模型友好度也高得多。

四种接入方式(CLI、CDP、WebDriver Classic、WebDriver BiDi)是另一个务实选择。前者便于手工调用与脚本集成,后三者让它能替换掉现有的 Playwright / Puppeteer 链路而不必重写整套测试代码——迁移成本因此低得多。

它还把 skills 目录直接放进仓库:让 Agent 按其中的说明自行完成安装并调用 moli-webfetch 等能力,而不是人去翻译文档。对已经在用 Agent 的团队,这条路径省掉了不少沟通成本。

资源占用是它反复强调的指标,仓库里直接给出了混合公开网页抓取基准、样例 Agent 工作负载与 WPT 测试结果,可以自己核对。

二、项目基本信息

信息项详情
项目名称Moli
GitHub地址https://github.com/lexmount/moli
项目描述Best headless browser for AI agents. Lite, Fast, High-Compatibility. Built in Rust
作者lexmount
开源协议Apache License 2.0
开源状态公开
LanguagesRust
支持平台Windows / macOS / Linux
最后更新2026-10-30

三、核心优势

  • 按需布局与渲染:只要结构不付像素代价,显著降低资源占用
  • Rust 编写,完整浏览器运行时之外保持轻量足迹
  • CLI、CDP、WebDriver Classic、WebDriver BiDi 四种接入方式,兼容现有自动化链路
  • 可输出 Markdown 或紧凑语义树,直接喂给模型而非原始 DOM
  • 支持截图、整页截图与分页 PDF 三种可视化产物
  • 官方提供 skills 目录,可让 Agent 自己完成安装与调用
  • 明确支持 Linux、macOS 与 Windows
  • Markdown 与语义树两种输出格式,体积远小于原始 DOM,对模型更友好
  • --eval 可在页面就绪后执行表达式并等待 Promise,配合 --dump 导出交互后的页面
  • 支持视口截图、整页截图与分页 PDF 三种可视化产物,按需取用
  • 内置成本控制机制,便于把抓取任务的开销控制在可预期范围内

四、适用场景

适合需要为 Agent 批量抓取网页、做搜索调研或网页自动化,但被 Chromium 资源占用拖累的团队;也适合想把现有 Playwright / Puppeteer 链路换成更省资源实现的场景。

判断 Moli 适不适合你,先看你的浏览器自动化在为什么发愁。如果是"抓页面给模型读",它几乎正中靶心;如果是"做完整的端到端 UI 测试",那 Moli 目前更适合做抓取与结构提取这一环,测试断言部分仍可能需要配合其他工具。

迁移评估建议做一次对照:拿现有 Playwright 脚本里最典型的抓取任务,用 Moli 的 fetch --dump markdown 与 --dump semantic_tree_text 各跑一遍,对比输出质量与耗时。这个对比通常几分钟就能做完,结论很明确。

语言与生态方面,Moli 支持 Linux、macOS 与 Windows,安装脚本覆盖三个平台;语言绑定方面提供了 CLI、CDP 与两套 WebDriver 协议接入,所以从任何语言调用都不别扭。

最后提醒一点:它输出的语义树是"紧凑"的,信息密度高于原始 DOM,但也意味着丢掉了一些原始 HTML 属性。如果你的下游逻辑依赖特定 class 或 id,需要先用 --eval 做交互并配合具体选择器,不能直接假设语义树里什么都有。

如果你正被同类问题反复绊住——要么是人肉重复劳动没完,要么是工具装不上跑不通、要么是产出的结果根本没法用——那这个项目值得先花十分钟装一遍试试。

五、安装教程

当前最新版本 v1.1.19。下面是可直接执行的安装方式:

# Linux / macOS
curl --proto '=https' --tlsv1.2 -fsSL \
  https://github.com/lexmount/moli/releases/latest/download/moli-installer.sh | sh

# Windows(PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://github.com/lexmount/moli/releases/latest/download/moli-installer.ps1 | iex" 

常见报错与处理:依赖缺失时先确认运行时版本(Node、Python、Rust、PHP 等)是否满足项目要求;网络超时多半是镜像或代理问题,可换源重试;权限类报错请检查当前账号是否已登录对应平台,以及脚本是否需要管理员权限执行。

六、使用示例

下面这段是可以直接参照的真实用法:

# 用默认策略把页面渲染成 Markdown
moli fetch \
  --dump markdown \
  --wait-until done \
  https://example.com

# 直接返回紧凑的、模型友好的语义树
moli fetch \
  --dump semantic_tree_text \
  --wait-selector body \
  https://example.com

# 开启按需布局,输出视口截图 / 整页截图 / PDF
moli fetch --layout --dump screenshot https://example.com > page.png
moli fetch --layout --dump screenshot_full https://example.com > full-page.png
moli fetch --layout --dump pdf https://example.com > page.pdf

七、常见问题

问:它和 Playwright 有什么区别?答:Moli 把布局与渲染做成按需触发,只要结构时不付像素代价;并且输出格式直接面向模型(Markdown、语义树),而不是原始 DOM。

问:能替换现有自动化链路吗?答:可以,它同时提供 CDP、WebDriver Classic 与 WebDriver BiDi 三种协议接入方式。

问:怎么让 Agent 自己会用?答:仓库里带 skills 目录,可让 Agent 按其中的说明完成安装并调用 moli-webfetch 等能力。

问:支持哪些平台?答:官方明确支持 Linux、macOS 与 Windows。

问:和 Playwright 能共存吗?答:可以共存,Moli 负责抓取与结构提取,Playwright 继续负责复杂交互测试。

问:输出语义树会丢信息吗?答:会比原始 DOM 精简,依赖特定属性时建议配合 --eval 与选择器使用。

以上是实际使用中最常被问到的几个问题。若遇到文档未覆盖的情况,可以先翻项目的 Issues 与 Discussions 区,那里有更多真实踩坑记录。

八、总结

Moli 在把高频动作压缩成一条命令这件事上做到了足够扎实的程度:它不追求大而全,而是把一个具体环节做透,让原本要靠人盯的流程变成可以交给工具执行的流程。

从上面的安装步骤和使用示例可以看出,它的接入成本并不高:一条命令装好,按提示完成配置,然后就能把它放进你原有的工作流里。如果你正在被同类问题困扰,不妨先在自己的一小块任务上试一轮,确认顺手了再推广到日常流程中。