Lightpanda:一个用 Zig 从零写成的无头浏览器,100 页只吃 123MB
【免费下载链接】browserLightpanda: the headless browser designed for AI and automation项目地址: https://gitcode.com/GitHub_Trending/browser32/browser
在 AWS EC2 m5.large 上并发加载 100 个真实网页,Lightpanda 无头浏览器 的峰值内存停在 123MB,而 Headless Chrome 需要 2GB。同一个任务,它的执行耗时是 5 秒,对照的 Chrome 是 46 秒。这不是渲染加速,而是干脆没有渲染——它是一个为 AI Agent 和自动化场景重新设计、用 Zig 编写的无头浏览器。
它到底省在哪
Lightpanda 不基于 Chromium、Blink 或 WebKit,也不带图形渲染引擎。它只保留自动化真正需要的部分:DOM 树、JavaScript 执行、网络请求和一套 CDP 接口,把桌面浏览器里那些服务器上用不到的东西全部裁掉。对要在同一台机器上拉起成百上千个抓取实例的人,省下的内存意味着能塞下的并发数量级不同。官方基准测试给出两个硬指标:
| 指标(100 页) | Lightpanda | Headless Chrome | 差异 |
|---|---|---|---|
| 内存峰值 | 123MB | 2GB | 约 16× |
| 执行耗时 | 5s | 46s | 约 9× |
测试条件是请求 933 个真实网页、跑在 AWS EC2 m5.large 实例上,数据来自 README 的官方基准,并非估算。
把浏览器拆成四块
JS 运行时是 V8,不是自研解释器
设计思路:现代网页几乎全由 JavaScript 驱动,Ajax、单页应用、无限加载都绕不开它,所以"执行 JS"是硬需求。Lightpanda 的选择是直接嵌入 V8 引擎,而不是写一个兼容性有限的轻量解释器。
实际表现:页面脚本按原生 V8 执行,React、Vue 这类框架驱动的页面可以跑通,这也是它和"只发 HTTP 请求"的抓取器拉开差距的地方。
源码佐证:JS 环境、Isolate、HandleScope、Promise 这些运行时概念都集中在 src/browser/js/js.zig,通过pub const v8 = @import("v8").c;直接绑定 V8 的 C 接口。
网络层交给 Libcurl,但包了一层
设计思路:HTTP 加载用成熟的 Libcurl 打底,避免自己造轮子踩坑;但它在外面包了一层,把页面里所有<script>加载、XHR 请求、模块导入统一收口到同一个客户端里。
实际表现:支持自定义请求头、代理、网络拦截,还可以用--obey-robots遵守 robots.txt,对抓取场景是刚需。
源码佐证:src/network/HttpClient.zig 在文件头注释里写得很直接——"加载所有<scripts>、发起 XHR、加载 import 都从这里走",并集成了 src/network/RobotsGate.zig 做 robots 校验。
CDP 接口让现成工具直接接管
设计思路:光有内核没用,得能接进 Puppeteer、Playwright 这些现成生态。Lightpanda 暴露的是 Chrome DevTools Protocol,客户端只需要把连接地址换掉。
实际表现:./lightpanda serve --host 127.0.0.1 --port 9222起一个 CDP 服务,Puppeteer 用browserWSEndpoint连上即可,后续脚本基本不用改。
源码佐证:src/cdp/CDP.zig 是协议主体,src/cdp/domains/ 下实现了 21 个 CDP 域(page、network、fetch、runtime、input 等),覆盖了自动化最常用的控制面。
从安装到第一条命令
先装二进制。Linux x86_64 上最快的一条命令:
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-x86_64-linux && chmod a+x ./lightpanda装完先验证一下:
./lightpanda version这一步只是确认二进制可执行,不会真的打开任何页面。⚠️ 注意 Linux 二进制依赖 glibc,在 Alpine 这类 musl 发行版上会直接报"required file not found",要么换 debian/ubuntu 基础镜像,要么从源码构建。
接着跑第一条真正的命令,抓取一个页面并导出处理后的 HTML:
./lightpanda fetch --dump html --log-level info https://demo-browser.lightpanda.io/campfire-commerce/这一步会发生的事:它请求页面、执行 JS,然后把执行后的 DOM 打印出来。想拿别的格式,把--dump html换成--dump markdown、--dump png > page.png或--dump pdf > page.pdf即可;页面是异步加载的话,加--wait-until、--wait-selector之类参数控制等待。
最后是最小可用的集成——起 CDP 服务,让 Puppeteer 接进来:
./lightpanda serve --host 127.0.0.1 --port 9222在 Node 脚本里,只需要改连接地址,其余逻辑照搬你写 Chrome 的那套:
import puppeteer from 'puppeteer-core'; const browser = await puppeteer.connect({ browserWSEndpoint: "ws://127.0.0.1:9222", }); const context = await browser.createBrowserContext(); const page = await context.newPage(); await page.goto('https://demo-browser.lightpanda.io/amiibo/', { waitUntil: 'networkidle0' }); const links = await page.evaluate(() => Array.from(document.querySelectorAll('a')).map(a => a.getAttribute('href'))); console.log(links); await page.close(); await context.close(); await browser.disconnect();为什么这样设计
选 Zig 是关键决策。它是低层语言、内存控制明确,没有隐藏的运行时期,正好适合要手动管内存、追求极致开销的浏览器内核。围绕这个内核,代码是这样组织的:
src/ ├── browser/ # 浏览器核心 │ ├── js/ # V8 集成与 JS 运行时 │ ├── webapi/ # DOM 与各 Web API(Element、Node、Document...) │ ├── parser/ # HTML 解析(html5ever) │ └── Browser.zig # 浏览器实例:持有 session、page_pool、JS 环境 ├── network/ # Libcurl HTTP 客户端、robots、拦截 ├── cdp/ │ └── domains/ # 21 个 CDP 协议域 ├── mcp/ # 原生 MCP(stdio / HTTP) ├── agent/ # 内置 agent 模式 └── main.zig # 入口顶层的 src/browser/Browser.zig 是浏览器实例的边界,持有 JS 环境(env: js.Env)、页面池和 HTTP 客户端;DOM 的具体实现在 src/browser/webapi/Element.zig 等文件里。构建依赖 V8、Libcurl、html5ever,其中 V8 可以make download-v8拉预编译库,否则要从源码编译(10 分钟以上)。
选型建议
适合
- 服务器端大批量并发抓取、数据提取,内存是硬约束
- 已经用 Puppeteer / Playwright、想换个更省的内核
- 需要执行 JS 的现代化页面(SPA、Ajax),而不只是静态 HTML
暂不适合
- 需要真实像素渲染、复杂布局截图的场景——它没有图形渲染引擎
- 依赖完整 Web API 覆盖的网页;数百个 API 仍在补齐中
已知限制
- 项目是 Beta,官方明确写着"可能遇到错误或崩溃"
- CORS 尚未实现(README 待办里勾着)
- 默认开启遥测,需用
LIGHTPANDA_DISABLE_TELEMETRY=true关闭
一句话:它是"够用且极省"的内核,不是 Chrome 的替代。如果你的任务以 JS 驱动的抓取和数据提取为主、又对内存敏感,它值得一试;如果你依赖浏览器级的完整兼容性和渲染,先掂量一下。
现状与参与
Lightpanda 目前处于 Beta,稳定性和 API 覆盖在持续提升,README 的待办清单(HTTP loader、HTML 解析、DOM 树、JS、XHR/Fetch、CDP、点击、表单、Cookie、代理、网络拦截均已勾选)能反映当前进度。团队把测试做成两层:make test跑单元测试,其中自定义 runner 会在 debug 构建下检测内存泄漏——一个"分配了不释放"的测试会直接判失败,而不只是 lint 提醒;端到端测试和 Web Platform Tests(WPT)则校验真实网页兼容性。
想参与,先看 CONTRIBUTING.md:流程要求make test通过、zig fmt --check干净、并签署 CLA。仓库在 https://gitcode.com/GitHub_Trending/browser32/browser ,clone 下来从make test开始熟悉这套代码,是从贡献入手最稳的一条路。
【免费下载链接】browserLightpanda: the headless browser designed for AI and automation项目地址: https://gitcode.com/GitHub_Trending/browser32/browser
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考