引言
「Not a Chromium fork. Not a WebKit patch.」
这是「一天一个开源项目」系列的第 252 篇。今天的项目是 Lightpanda,一个专门给 AI Agent 和自动化任务用的无头浏览器。
现在的网页大多靠 JavaScript 驱动,SPA、Ajax、React/Vue/Angular 随处可见,光发 HTTP 请求往往拿不到真正的内容。于是大家把 Headless Chrome 拉起来跑爬虫、跑 Agent。可 Chrome 本来是给人看页面设计的,带着一整套无头场景根本用不上的东西:渲染管线、GPU、各种面向用户的功能。规模一上去,内存、启动速度和部署成本都成了问题。
Lightpanda 的做法是干脆不改 Chrome,直接用 Zig 重写一个浏览器:保留 HTML 解析、DOM、V8 执行 JavaScript、网络请求这些「拿到页面内容」必须有的部分,砍掉图形渲染。代价是 Web 兼容性要自己一点点追,换来的是资源占用的数量级下降。
你将学到什么
- 为什么「不做渲染」能让无头浏览器的内存和速度差出一个数量级
- Lightpanda 的组件选型:Zig + V8 + libcurl + html5ever
fetch、serve、mcp、agent四种使用方式分别适合什么场景- PandaScript:把一次 Agent 会话固化成不耗 token 的确定性脚本
- 它目前的边界:兼容性、平台支持与许可证上需要注意什么
前置知识
- 了解无头浏览器(Headless Chrome、Puppeteer、Playwright)的基本用法
- 知道 CDP(Chrome DevTools Protocol)是什么
- 可选:了解 MCP(Model Context Protocol)
项目背景
项目简介
官方对自己的定位很直接:为 AI Agent 和自动化设计的无头浏览器,用 Zig 编写的全新浏览器。设计上有三个明确选择:
- 不基于 Chromium、Blink 或 WebKit
- 用 Zig,以便显式控制内存
- 没有图形渲染引擎
项目数据
- ⭐ GitHub Stars:约 40,700
- 🍴 Forks:约 1,990
- 💻 主要语言:Zig
- 📅 创建时间:2023-02-07
- 📄 许可证:AGPL-3.0(商用或集成进闭源产品前务必先看清楚)
- 💬 社区:Discord;贡献代码需要签署 CLA
主要功能
核心作用
用 Headless Chrome 跑 Agent / 爬虫:
一个完整的浏览器进程 → 内存大、启动慢、部署重
↑ 并发一高,成本主要花在「用不上的渲染能力」上
Lightpanda 的做法:
只保留 HTTP 加载 + HTML 解析 + DOM + V8 执行 JS
↓ 不渲染画面
↑ 同样的页面,内存和耗时都大幅下降官方基准测试
在 AWS EC2 m5.large 上请求 933 个真实页面:
| 指标 | Lightpanda | Headless Chrome | 差距 |
|---|---|---|---|
| 峰值内存(100 页) | 123MB | 2GB | 约少 16 倍 |
| 执行时间(100 页) | 5 秒 | 46 秒 | 约快 9 倍 |
这是项目方自己发布的数据,测的是「抓取页面内容」这类任务。需要截图级渲染、复杂交互的场景不能直接套用。
使用场景
- 大规模页面抓取:需要执行 JS 才能拿到内容,但不想为每个页面付一个 Chrome 的成本
- 给 AI Agent 提供浏览能力:通过 MCP Server 或 CDP 接入
- 替换现有 Puppeteer/Playwright 脚本的后端:只改连接端点,脚本基本不用动
- 把 Agent 探索出的流程固化:用 PandaScript 重放,不再消耗 token
快速开始
安装
# macOS / Linux (Homebrew)
brew install lightpanda-io/browser/lightpanda
# Arch Linux
yay -S lightpanda-nightly-bin
# Nix
nix run github:lightpanda-io/browser -- --help也可以下载 Linux、macOS(x86_64 与 aarch64)的 nightly 二进制,或使用官方 Docker 镜像 lightpanda/browser(amd64/arm64,CDP 端口 9222)。Windows 没有原生版本,需要用 WSL2。
抓取一个页面
# 输出为 html / markdown / png / pdf / structured_data 等
lightpanda fetch --dump markdown https://example.com可以用 --wait-until、--wait-ms、--wait-selector、--wait-script 控制等待时机,--obey-robots 遵守 robots.txt。structured_data 格式会提取 JSON-LD、OpenGraph 等结构化数据。
作为 CDP 服务器给 Puppeteer 用
lightpanda serve --host 127.0.0.1 --port 9222import puppeteer from 'puppeteer-core';
const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://127.0.0.1:9222',
});
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.disconnect();除了 CDP,serve 还支持 Unix socket 和 WebDriver BiDi(--protocol webdriver,或两种协议同时开启)。
核心特性
- 协议:CDP over WebSocket、WebDriver BiDi
- 网页能力:HTTP 加载(libcurl)、HTML 解析(html5ever)、DOM、JavaScript(V8)、XHR 与 Fetch、CORS、Cookie、自定义 Header、代理、网络拦截、点击与表单输入
- 其他:robots.txt 支持、广告拦截
- MCP Server:
lightpanda mcp,stdio 上跑 JSON-RPC 2.0,也可加--port以 HTTP 方式提供/mcp - 原生 Agent:
lightpanda agent,用自然语言或斜杠命令驱动,支持 Anthropic、OpenAI、Gemini、Vertex AI、Mistral、Hugging Face、OpenRouter、任意 OpenAI 兼容端点,以及 Ollama、llama.cpp 等本地模型
项目详细剖析
少一层渲染,到底省在哪
浏览器的大头开销往往在渲染:样式计算、布局、绘制、合成、GPU 进程。对一个只想要「执行完 JS 之后的 DOM」的 Agent 来说,这些都是白花的资源。Lightpanda 保留的是一条精简的流水线:
URL → libcurl 加载 → html5ever 解析 → DOM 树 → V8 执行脚本
→ 输出 HTML / Markdown / 结构化数据 / CDP 事件没有绘制这一步,也就不需要为它准备的内存结构。再加上 Zig 允许显式管理内存,这就是官方数据里 16 倍内存差距的由来。需要说明的是,fetch 命令列了 png 和 pdf 输出,具体效果以官方文档和你的实际页面为准;它的主要定位仍然是内容抓取而不是像素级渲染。
组件选型:不重造所有轮子
Lightpanda 自己写的是浏览器的骨架和 Web API 层,底层几个最重的部件直接用成熟库:
| 部分 | 选用 |
|---|---|
| 语言 | Zig |
| JavaScript 引擎 | V8 |
| 网络 | libcurl |
| HTML 解析 | html5ever(Rust) |
这是一个务实的选择:JS 引擎和 HTML5 解析规范都极其复杂,自己写既不现实也没必要。代价是构建依赖变重,需要 Zig 0.17.0、V8、libcurl,以及 Rust 工具链,自己编译的门槛不低。
四种入口,对应四类需求
| 命令 | 适合 |
|---|---|
fetch | 一次性抓取、脚本里直接调用、CI |
serve | 已有 Puppeteer/Playwright 代码,换后端 |
mcp | 让 Claude 等 MCP 客户端直接获得浏览能力 |
agent | 用自然语言交互式探索网页 |
MCP 模式里,会话默认相互隔离;共用同一个 Mcp-Session-Id 的客户端共享一个浏览上下文,并有 session_new、session_list、session_close 管理会话。run 工具用来执行 PandaScript,默认超时 60000 毫秒。
PandaScript:把 Agent 的探索变成确定性脚本
这是我觉得最有意思的设计。让 LLM 每次都去「看页面、决定点哪里」既慢又烧 token。Lightpanda 的 agent 会话可以用 /save 保存成一段带有浏览器原语的 JavaScript,之后用 lightpanda run script.js 重放,不需要模型、不消耗 token。
第一次:Agent 探索 → 找到可行路径 → /save 成脚本
之后:lightpanda run script.js → 确定性重放,零 token这等于把「LLM 当探路者,脚本当执行者」做进了工具本身。页面改版导致脚本失效时,再让 Agent 重新探索即可。
兼容性:用 WPT 说话
新浏览器最大的风险是「某个页面跑不起来」。项目方每天公开 Web Platform Tests 的结果(perf.lightpanda.io/wpt),所以覆盖率不靠宣传,可以自己查。落地前建议拿你要访问的目标站点实测一遍,别只看基准测试。
需要注意的边界
- 许可证是 AGPL-3.0:把它放进对外提供的服务或闭源产品前,要评估网络使用条款带来的义务
- 平台:没有 Windows 原生版本;Linux 二进制依赖 glibc(x86_64 需 2.35,arm64 需 2.38),Alpine/musl 不能用;没有 Android/Termux 版本
- 遥测默认开启:可通过环境变量
LIGHTPANDA_DISABLE_TELEMETRY=true关闭 - README 没有逐项列出尚未支持的 Web API:是否适配你的目标站点,要靠自己测试
项目地址与资源
- 🌟 GitHub:https://github.com/lightpanda-io/browser
- 📊 WPT 结果:perf.lightpanda.io/wpt
- 🐳 Docker 镜像:
lightpanda/browser - 🧩 Agent Skill:lightpanda-io/agent-skill
- 💬 社区:项目 README 中的 Discord 链接
总结与展望
核心要点回顾
- 思路:为「拿内容」而不是「给人看」设计浏览器,去掉渲染
- 数据:官方测试 100 页内存 123MB vs 2GB,耗时 5 秒 vs 46 秒
- 兼容:CDP 和 WebDriver BiDi,Puppeteer/Playwright 可直接连
- AI 原生:内置 MCP Server、多模型 Agent,以及零 token 重放的 PandaScript
- 边界:AGPL-3.0、平台限制、Web 兼容性要自行验证
适用人群
- 需要大规模抓取动态页面、被 Chrome 资源占用拖累的团队
- 给 AI Agent 搭建浏览能力的开发者
- 想把 Agent 探索流程固化、降低 token 成本的人
学习建议
先用 fetch 抓几个你自己关心的页面,对比 Chrome 的输出是否一致;再用 serve 把一小段现有 Puppeteer 脚本切过来跑,看兼容性和资源占用是否符合预期。确认没问题再考虑上规模。
欢迎访问 PrimeSkills —— 一个精心策划的 AI Agent 与技能市场,所有内容均经过真实企业级工作流验证。没有噱头,只有真正有效的东西。
更多实用知识和有趣产品,欢迎访问我的个人主页