结论先行
我上篇文章推荐过的 Lightpanda,被我删了。
不是它坏了,是我实测后发现:它省下的那点内存,换来的是静默丢内容。而我当时判断它"值"的依据——只有一张内存对比图。
删完之后我补测了两个同类新品,凑齐 8 个站点 × 3 次重复 = 72 次调用,得出一个反直觉的结论:Chrome 不是抓取最全的那个。
一、上篇我给 Lightpanda 发的牌,是错牌
上篇《四个浏览器爬虫实测分层用》里,我给四个工具各贴了一个"唯一"标签:
| 工具 | 我给的定位 |
|---|---|
| bb-browser | 唯一有登录态 |
| wigolo | 唯一自带搜索引擎 |
| Lightpanda | 唯一省内存 |
| Chrome | 唯一兜底 |
这套分层本身有个逻辑漏洞:“省内存"如果是唯一优点,那它就必须证明——省下的内存没有被内容质量吃掉。
我当时没验证这一步。后来补上,结果很难看:
| 站点 | Lightpanda | Chrome | 结果 |
|---|---|---|---|
| 百度正文 | 2,339 字符 | 258,326 字符 | 丢了 99.1% |
| 6 URL 并发 | 成功 1/6 | 成功 6/6 | 并发互相踩踏 |
| 深度爬 5 页 | 成功 2/5 | 成功 5/5 | 越爬越丢 |
内存确实只有 Chrome 的 1/6.7。但它抓 JS 重站时返回的是空壳,而且不报错——success=True,配一段几十字的正文。
这是最糟的失败方式:不是报错,是骗你。
所以容器、镜像、_lp.py、s lp 命令,全部删除,回收 348MB。
二、补测两个同类新品
删完我不甘心——“轻量无头浏览器"这个品类不该全是坑。于是测了两个新东西:
| 项目 | 语言 | 起家 |
|---|---|---|
| Moli | Rust(独立内核,非 Chromium 封装) | Lexmount 开源,2.1k stars |
| Obscura | Rust + V8 | h4ckf0r0day,官方称 Cloudflare Kitesurf 的灵感来源 |
两者都是单个二进制、无需 Chrome/Node 依赖。装 Obscura 时我犯了个错——机器上装的是 7 月的旧 build,我先升到最新的 v0.2.3,再开始测。
测法固定:
- 8 个站点,覆盖门户/政务/新闻/技术站/搜索/问答
- 每站每引擎重复 3 次,取中位数
- 统一
--dump markdown,比正文提取字符数 - 字符数 < 400 判为失败
三、数据
总表(24 次/引擎):
| 引擎 | 成功率 | 中位耗时 | P90 耗时 | 总字符 |
|---|---|---|---|---|
| Moli 1.1.11 | 24/24 | 2322ms | 5184ms | 2,023,238 |
| Obscura v0.2.3 | 18/24 | 3100ms | 32843ms | 401,016 |
| Chrome (crawl4ai) | 24/24 | 3069ms | 4902ms | 1,363,763 |
逐站拆分:
| 站点 | Moli | Obscura | Chrome | 谁赢 |
|---|---|---|---|---|
| example.com | 1342 | 1344 | 848 | Obscura |
| news.qq.com | 199,435 | 0 | 4,391 | Moli |
| news.sina.com.cn | 129,479 | 0 | 102,966 | Moli |
| baidu.com | 248,882 | 5,492 | 258,934 | Chrome |
| gov.cn | 16,559 | 23,644 | 14,623 | Obscura |
| ithome.com | 95,378 | 93,505 | 66,053 | Moli |
| rust-lang.org | 5,250 | 7,247 | 5,712 | Obscura |
| zhihu.com | 2,450 | 2,440 | 1,963 | Moli |
冠军统计:Moli 4 站、Obscura 3 站、Chrome 1 站。

最值得看的是 news.qq 那一格:Chrome 只拿到 4,391 字符,Moli 拿到 199,435——差 45 倍。
也就是说我上篇里"Chrome 唯一兜底"这个判断,也要修正:Chrome 是兜底,但不是最全。 本地 Playwright 的 chromium 在腾讯新闻这种重度前端页面上,正文提取反而不如专用内核。
四、两个必须记的坑
坑一:Moli 的 --layout 会破坏 innerText
这个坑阴险,因为它伪装成"页面是空壳”。
我起 CDP server 时加了 --layout(想着截图用),然后用 Playwright 取 innerText,拿到这样:
| 站点 | 默认模式 | 加 --layout |
|---|---|---|
| gov.cn | 1317 | 12 |
| news.qq | 3556 | 0 |
| baidu | 538 | 45 |
看着像整站抓失败了。但同一时刻 document.body.textContent 是完好的(gov.cn 27,037 字符)。
根因:--layout 下 Moli 改用按需布局策略,innerText 依赖真实布局,于是被破坏;textContent 只读 DOM,不受影响。
正解两条:常驻 CDP server 不要加 --layout;取文本一律用 textContent。
坑二:Obscura 升版是回退
我原以为升级总归更好。实测打脸:
| 站点 | v0.1.10 | v0.2.3 |
|---|---|---|
| example.com 启动 | 6750ms | 1334ms ✅ |
| zhihu.com | 28 | 2440 ✅ |
| news.sina.com.cn | 111,589 | 0 ❌ |
新浪从 11 万字变成 0,3 次复现全部为 0。
控制台实录报错,全是 JS 引擎的缺口:
TypeError: targetTable.insertRow is not a function
ReferenceError: Option is not defined
Uncaught SyntaxError: Invalid hexadecimal escape sequence
缺 DOM API、缺构造函数、还有解析器 bug。不是网络问题,不是反爬,是引擎没实现。
所以我保留了旧版二进制(obscura.exe.bak.v0110),随时能回切。
五、差点写错的一个数
必须交代一件事。
首轮我单跑一次百度,Obscura 返回 283,318 字符——比 Moli 和 Chrome 都高,看着像碾压。
要是当时就据此写稿,结论会完全反过来。
后来重复测 3 次,全是 5,492。那次 283,318 是离群值。
这就是为什么我给每个站点都跑 3 次:单次测量在抓取这件事上不可信。JS 渲染、网络抖动、站点 AB 测试,任何一个都能让数字翻几倍。

六、为什么没测 Cloudflare 那个
上篇有人提 Cloudflare 的无头浏览器。我查了,叫 Kitesurf,2026 年 8 月发布,Rust 编译成 WASM 跑在 Workers 的 V8 隔离里,思路挺激进。
但我测不了,原因两条:
- 必须有 Cloudflare 账号 + Browser Run API Token,我没有
kitesurf.cloudflare.app从我这台机器网络不可达——DNS 能解析到 Cloudflare 的 IP,但 HTTPS 直连 15 秒超时
所以下面这组数字是官方公布的,不是我实测的,只能当参考:
| 指标 | Kitesurf | Chromium | 对比 |
|---|---|---|---|
| CPU:HTML 抽取 | 229ms | 877ms | 少 3.8× |
| 内存:HTML 抽取 | 39.4MiB | 273.7MiB | 少 7.0× |
| 挂钟:HTML 抽取 | 820ms | 472ms | 慢 1.7× |
有个有意思的细节:Cloudflare 官方博客说 Kitesurf 的灵感来自 obscura。而 obscura 现在连新浪都拿不下。
七、选型结论
| 场景 | 用什么 | 理由 |
|---|---|---|
| 抓正文、JS 重站 | Moli | 24/24 全成功、最快、内容最多 |
| 像素级截图、复杂交互 | Chrome | Moli 的 --layout 截图多语言段落会叠印 |
| 特定站文本更全 | Obscura | gov.cn/rust-lang 略优,但整站可能失败 |
| 要缓存/引用溯源 | wigolo | 独占能力 |
| 登录态站点 | bb-browser | 独占能力 |
综合第一是 Moli,它也是唯一同时做到"全成功 + 最快 + 内容最多"的。
八、三条别
- 别把"省内存"当独立优点。 它必须和"内容没丢"一起验证。省内存却静默丢内容,是负价值。
- 别信单次测量。 我差点被一个离群值带偏结论。抓取类测试,至少 3 次取中位。
- 别默认升级更好。 Obscura v0.2.3 修了两个问题,搞坏了一个整站。升版前留旧二进制。
上篇我给 Lightpanda 发错了一张牌。这篇是补票。
如果觉得有帮助,点个「赞」和「在看」支持一下 👇