我把上篇推荐的浏览器删了

结论先行

我上篇文章推荐过的 Lightpanda,被我删了。

不是它坏了,是我实测后发现:它省下的那点内存,换来的是静默丢内容。而我当时判断它"值"的依据——只有一张内存对比图。

删完之后我补测了两个同类新品,凑齐 8 个站点 × 3 次重复 = 72 次调用,得出一个反直觉的结论:Chrome 不是抓取最全的那个。


一、上篇我给 Lightpanda 发的牌,是错牌

上篇《四个浏览器爬虫实测分层用》里,我给四个工具各贴了一个"唯一"标签:

工具我给的定位
bb-browser唯一有登录态
wigolo唯一自带搜索引擎
Lightpanda唯一省内存
Chrome唯一兜底

这套分层本身有个逻辑漏洞:“省内存"如果是唯一优点,那它就必须证明——省下的内存没有被内容质量吃掉。

我当时没验证这一步。后来补上,结果很难看:

站点LightpandaChrome结果
百度正文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。


二、补测两个同类新品

删完我不甘心——“轻量无头浏览器"这个品类不该全是坑。于是测了两个新东西:

项目语言起家
MoliRust(独立内核,非 Chromium 封装)Lexmount 开源,2.1k stars
ObscuraRust + V8h4ckf0r0day,官方称 Cloudflare Kitesurf 的灵感来源

两者都是单个二进制、无需 Chrome/Node 依赖。装 Obscura 时我犯了个错——机器上装的是 7 月的旧 build,我先升到最新的 v0.2.3,再开始测。

测法固定:

  • 8 个站点,覆盖门户/政务/新闻/技术站/搜索/问答
  • 每站每引擎重复 3 次,取中位数
  • 统一 --dump markdown,比正文提取字符数
  • 字符数 < 400 判为失败

三、数据

总表(24 次/引擎):

引擎成功率中位耗时P90 耗时总字符
Moli 1.1.1124/242322ms5184ms2,023,238
Obscura v0.2.318/243100ms32843ms401,016
Chrome (crawl4ai)24/243069ms4902ms1,363,763

逐站拆分:

站点MoliObscuraChrome谁赢
example.com13421344848Obscura
news.qq.com199,43504,391Moli
news.sina.com.cn129,4790102,966Moli
baidu.com248,8825,492258,934Chrome
gov.cn16,55923,64414,623Obscura
ithome.com95,37893,50566,053Moli
rust-lang.org5,2507,2475,712Obscura
zhihu.com2,4502,4401,963Moli

冠军统计: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.cn131712
news.qq35560
baidu53845

看着像整站抓失败了。但同一时刻 document.body.textContent 是完好的(gov.cn 27,037 字符)。

根因:--layout 下 Moli 改用按需布局策略,innerText 依赖真实布局,于是被破坏;textContent 只读 DOM,不受影响。

正解两条:常驻 CDP server 不要加 --layout;取文本一律用 textContent。

坑二:Obscura 升版是回退

我原以为升级总归更好。实测打脸:

站点v0.1.10v0.2.3
example.com 启动6750ms1334ms ✅
zhihu.com282440 ✅
news.sina.com.cn111,5890 ❌

新浪从 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 隔离里,思路挺激进。

但我测不了,原因两条:

  1. 必须有 Cloudflare 账号 + Browser Run API Token,我没有
  2. kitesurf.cloudflare.app 从我这台机器网络不可达——DNS 能解析到 Cloudflare 的 IP,但 HTTPS 直连 15 秒超时

所以下面这组数字是官方公布的,不是我实测的,只能当参考:

指标KitesurfChromium对比
CPU:HTML 抽取229ms877ms少 3.8×
内存:HTML 抽取39.4MiB273.7MiB少 7.0×
挂钟:HTML 抽取820ms472ms慢 1.7×

有个有意思的细节:Cloudflare 官方博客说 Kitesurf 的灵感来自 obscura。而 obscura 现在连新浪都拿不下。


七、选型结论

场景用什么理由
抓正文、JS 重站Moli24/24 全成功、最快、内容最多
像素级截图、复杂交互ChromeMoli 的 --layout 截图多语言段落会叠印
特定站文本更全Obscuragov.cn/rust-lang 略优,但整站可能失败
要缓存/引用溯源wigolo独占能力
登录态站点bb-browser独占能力

综合第一是 Moli,它也是唯一同时做到"全成功 + 最快 + 内容最多"的。


八、三条别

  1. 别把"省内存"当独立优点。 它必须和"内容没丢"一起验证。省内存却静默丢内容,是负价值。
  2. 别信单次测量。 我差点被一个离群值带偏结论。抓取类测试,至少 3 次取中位。
  3. 别默认升级更好。 Obscura v0.2.3 修了两个问题,搞坏了一个整站。升版前留旧二进制。

上篇我给 Lightpanda 发错了一张牌。这篇是补票。


如果觉得有帮助,点个「赞」和「在看」支持一下 👇

← 返回文章列表