在为 AI Agent 构建自主抓取或网页交互流水线时,开发者最常遭遇的基础设施瓶颈往往不是大模型的推理速率,而是底层无头浏览器(Headless Browser)的资源开销。传统基于 Chromium 封装的自动化工具(如 Playwright 和 Puppeteer)为了保证页面渲染一致性,需要拉起完整的排版引擎与渲染管线。当并发数量上升或单任务运行在低规格云实例(例如 1 核 1G 内存容器)中时,Chrome 进程极易触发 OOM(内存溢出)崩溃。

近期开源的 moli(由 lexmount 开发)尝试从底层重构这一逻辑。该项目采用 Rust 编写,定位为面向 AI Agent 的轻量级无头浏览器。其核心设计理念是“结构优先,像素按需”(Structure first. Pixels on demand),通过跳过传统浏览器默认的持续排版与像素绘制阶段,为自动化任务提供了极低的资源消耗方案。
核心设计理念:按需渲染与低资源开销
常规浏览器在加载网页时,会解析 HTML/CSS,构建 DOM 树与 CSSOM,并实时计算布局排版(Layout),随后将页面光栅化为像素(Painting/Composite)。然而,AI Agent 在执行大部分网络信息收集与任务路由时,主要诉求是解析页面结构树、获取可交互的文本内容或定位核心元素节点,并不需要实时的像素渲染画面。
moli 针对这一行为模式重构了生命周期:
- 结构优先解析:在默认状态下,moli 会拉起轻量运行时并执行 DOM 构建与必要脚本,但不维持实时的排版状态树。
- 按需冻结布局(FrozenLayoutTree):当 Agent 确实需要元素坐标或物理边界以模拟点击时,moli 会根据当前 DOM/Style 状态进行一次冷启动计算,并将几何信息冻结为一个独立的不可变对象
FrozenLayoutTree。后续读取可直接复用该快照,大幅减少 CPU 开销。 - 按需绘制:只有在 Agent 明确请求页面截图或截屏流时,才会触发真正的页面绘制操作。
官方公开测试对比显示,处理常见网页任务时,传统无头 Chrome 实例的中位数内存占用常在 700 MiB 以上(如 773 MiB),而 moli 的中位数内存占用可压缩至约 73 MiB,几乎降低了一个数量级。对于需要在单台宿主机上并发调度数十个 Agent 实例的架构而言,这种内存降幅能显著降低服务器运维成本。
性能表现与多协议兼容性
在无头浏览器的选型中,迁移成本是工程团队的首要考量。如果一个新型浏览器引擎需要开发者完全重构已有的调用链路,落地阻力将成倍增加。moli 在接口适配层面提供了广泛的协议支持:
- Chrome DevTools Protocol (CDP):支持作为 Chromium 的替代运行端接入现有的 CDP 工具链。
- WebDriver 标准:同时覆盖 WebDriver Classic 与较新的 WebDriver BiDi 规范。
- 跨平台系统支持:开箱支持 Linux、macOS 与 Windows。
| 评估维度 | 传统 Chromium (Puppeteer/Playwright) | moli (Rust 架构) |
|---|---|---|
| 内存基线 | 较高(单实例常见 500MB – 1GB 左右) | 极低(官方中位数测试约 70 余 MB) |
| 启动延迟 | 需初始化完整排版与绘图上下文,耗时较长 | 进程体量轻量化,冷启动更快 |
| 反爬兼容表现 | 伪装生态完备(已有 mature stealth 插件支持) | 依赖自定义运行时伪装,仍需生态沉淀 |
| 视觉高保真度 | 原生 100% 还原商业浏览器像素表现 | 按需生成布局快照,复杂极端 CSS 容错度待验证 |
在反爬对抗方面,由于 moli 并非原生的完整 Chromium 二进制发行版,在处理高级指纹检测(如 Canvas 指纹、WebGL 探针或复杂的底层系统调用签名)时,其行为特征可能与主流桌面浏览器产生差异。在遭遇强对抗反爬网关(如 Cloudflare Turnstile 或 Akamai 深度指纹对抗)的场景下,仍需针对其 CDP 上报特征进行专门的规避配置。

流水线集成与验证示例
在部署层面,moli 提供了 CLI 模式与服务监听模式。为了将其融入现有的自动化或 Agent 运行时,可以通过暴露标准 CDP 端口的方式,将其作为底层替代服务。
1. 启动 moli 无头服务
通过命令行指定远程调试端口启动服务(具体参数依本地发行包配置):
# 以无头调试模式监听本地 9222 端口
moli --headless --remote-debugging-port=9222
2. 在自动化脚本中复用 CDP 链路
由于 moli 支持 CDP,现有的 Node.js/Python 自动化链路无需全盘废弃。以下以 Node.js 调用为例,展示如何直接复用常规的自动化思路接管页面采集:
import puppeteer from 'puppeteer-core';
async function fetchPageWithMoli() {
// 连接至已在 9222 端口运行的 moli 实例
const browser = await puppeteer.connect({
browserURL: 'http://127.0.0.1:9222',
});
const page = await browser.newPage();
// 访问目标页面,moli 将优先执行结构拉取与基础脚本
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
// 提取 Agent 需要的纯文本或 DOM 结构
const content = await page.evaluate(() => {
return {
title: document.title,
bodyText: document.body.innerText,
};
});
console.log('获取到的页面摘要:', content);
await browser.disconnect();
}
fetchPageWithMoli();
对于以 Python 生态为主的 LangChain、AutoGPT 或自建 Agent 流程,同样可以通过 WebSocket 连接串无缝接入,充当抓取工具的轻量执行后端。
适用场景与生态成熟度限制
尽管 moli 在内存表现和轻量化方面展现出明显的架构优势,但在选型落地时,技术团队仍需结合实际业务场景权衡:
适合采用的场景:
- 高并发页面阅读与内容抽取:Agent 需要批量打开数十个搜索结果或知识库页面,仅需读取正文用于 RAG(检索增强生成)推理。
- 边缘或低规格服务器:在 1GB 或 2GB 内存的小型 VPS/容器内常驻运行爬虫或交互代理。
- 基于简单 DOM 交互的表单自动化:点击常规按钮、输入文本等不依赖复杂微像素对齐的操作。
当前限制与谨慎采用的场景:
- 强对抗反爬页面:若采集目标部署了极其严苛的商业反爬规则,基于 Chromium 开发的成熟 stealth 工具链仍是更稳妥的选择。
- 视觉驱动型(Vision-based)操作:如果 Agent 完全依赖高分辨率页面截图送入多模态模型来判断物理点击点,moli 的“按需渲染”将被迫频繁重建
FrozenLayoutTree并绘制像素,其性能优势会被一定程度抵消。 - 新兴生态成熟度:作为一个相对年轻的开源项目,遇到边缘 CSS 布局解析异常或特定 JavaScript API 未完全对齐时,排错与社区修复周期可能长于历史悠久的 Chromium 社区。
对于正在规划多代理并发集群、并受困于 Chrome 内存黑洞的工程师团队而言,moli 给出了一种跳出全量浏览器渲染思路的工程实现。建议可以先在内网爬虫任务或只读型 Agent 采集节点上进行试点验证,根据抓取成功率与资源监控数据,逐步扩大其在整个 AI 自动化流水线中的承载比例。

评论列表 (1条):
加载更多评论 Loading...