中等难度,约20分钟,学会使用轻量级无头浏览器做AI数据采集,速度比Chrome快11倍,内存少9倍。
目标读者
- 需要大规模网页爬虫的工程师
- AI/LLM 数据采集开发者
- 自动化测试工程师
- 对高性能浏览器技术感兴趣的技术爱好者
核心依赖与环境
- Linux x86_64 或 macOS aarch64
- Windows 需要 WSL2
- Docker(可选,推荐用于生产环境)
- Node.js 18+(运行 Puppeteer/Playwright 脚本)
TIP
如果你用 Windows,直接在 WSL2 里安装 Lightpanda,然后在 Windows 主机上运行 Puppeteer。
完整项目结构
lightpanda-browser/
├── lightpanda # 主程序二进制文件
├── LICENSE # MIT 许可证
├── README.md # 项目说明
├── CONTRIBUTING.md # 贡献指南
├── CLA.md # 贡献者许可协议
├── docker/
│ └── Dockerfile # Docker 构建文件
├── src/ # Zig 源码(如果你想从源码编译)
└── docs/ # 文档目录
手把手教程
步骤1:下载并安装 Lightpanda
我们可以从 nightly builds 直接下载二进制文件。
Linux 安装:
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-x86_64-linux && \
chmod a+x ./lightpanda
macOS 安装:
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-aarch64-macos && \
chmod a+x ./lightpanda
验证安装:
./lightpanda --version
WARNING
目前只有 Linux x86_64 和 macOS aarch64 的官方二进制。Windows 用户需要用 WSL2。
步骤2:使用 Docker 启动(推荐)
如果你不想直接下载二进制,可以用 Docker 更快上手:
docker run -d --name lightpanda -p 9222:9222 lightpanda/browser:nightly
这样就直接启动了 CDP 服务器,监听在 9222 端口。
验证容器运行:
docker ps | grep lightpanda
步骤3:启动 CDP 服务器
如果我们不用 Docker,需要手动启动 CDP 服务器:
./lightpanda serve --obey_robots --log_format pretty --log_level info --host 127.0.0.1 --port 9222
输出类似:
INFO telemetry : telemetry status . . . . . . . . . . . . . [+0ms]
disabled = false
INFO app : server running . . . . . . . . . . . . . . . . [+0ms]
address = 127.0.0.1:9222
TIP
--obey_robots 参数会让 Lightpanda 遵守 robots.txt,这是礼貌爬虫的基本素养。
步骤4:编写 Puppeteer 脚本
现在我们来写第一个爬虫脚本。假设你已经在项目目录安装了 puppeteer-core:
npm install puppeteer-core
创建一个 crawler.js 文件:
'use strict'
import puppeteer from 'puppeteer-core';
// 通过 WebSocket 连接到 Lightpanda 的 CDP 服务器
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(() => {
return Array.from(document.querySelectorAll('a')).map(row => {
return row.getAttribute('href');
});
});
console.log('抓取的链接:');
links.forEach(link => console.log(link));
// 统计页面加载时间
const metrics = await page.metrics();
console.log('\n页面指标:');
console.log('脚本执行时间:', metrics.ScriptDuration, 'ms');
console.log('DOM 节点数:', metrics.Nodes);
// 清理资源
await page.close();
await context.close();
await browser.disconnect();
运行脚本:
node crawler.js
TIP
如果你是用 Docker 启动的 Lightpanda,脚本里的 browserWSEndpoint 改成 ws://localhost:9222。
步骤5:体验极速抓取
Lightpanda 官方数据显示:
- 速度: 比 Chrome 快 11 倍
- 内存: 比 Chrome 少 9 倍
- 启动: 即时启动(无头 Chrome 启动要好几秒)
我们来跑一个简单对比测试。首先确保 Lightpanda 在运行:
./lightpanda serve --host 127.0.0.1 --port 9222
然后写一个批量抓取脚本:
'use strict'
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();
// 批量抓取多个页面
const urls = [
'https://demo-browser.lightpanda.io/amiibo/',
'https://demo-browser.lightpanda.io/campfire-commerce/',
'https://demo-browser.lightpanda.io/hacker-news-top-stories/',
];
const startTime = Date.now();
for (const url of urls) {
console.log(`\n抓取: ${url}`);
const pageStart = Date.now();
await page.goto(url, {waitUntil: "networkidle0"});
const title = await page.title();
console.log(`标题: ${title}`);
console.log(`耗时: ${Date.now() - pageStart}ms`);
}
console.log(`\n总耗时: ${Date.now() - startTime}ms`);
await browser.disconnect();
运行:
node batch-crawler.js
你会发现即使是批量抓取,Lightpanda 的响应也非常快。
步骤6:高级功能 - 页面截图
Lightpanda 也支持截图功能:
'use strict'
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.setViewport({ width: 1280, height: 720 });
await page.goto('https://demo-browser.lightpanda.io/campfire-commerce/', {waitUntil: "networkidle0"});
// 截图保存
await page.screenshot({ path: 'screenshot.png', fullPage: true });
console.log('截图已保存到 screenshot.png');
await browser.disconnect();
常见问题排查
Q1: 端口 9222 被占用
症状:启动时报错 "Address already in use"
解决:
# 查看谁在用这个端口
lsof -i :9222
# 或者换个端口
./lightpanda serve --port 9223
# 然后脚本里改成 ws://127.0.0.1:9223
Q2: Web API 不支持报错
症状:运行脚本时报错 "XXX is not defined"
解决:Lightpanda 目前还在 Beta 阶段,Web API 覆盖不完整。去 GitHub 提 issue,通常团队会很快响应。
Q3: Docker 容器启动失败
症状:docker run 报错或容器立即退出
解决:
# 查看容器日志
docker logs lightpanda
# 如果端口冲突,改一下
docker run -d --name lightpanda -p 9322:9222 lightpanda/browser:nightly
Q4: Puppeteer 连接不上
症状:Error: Protocol error (Target.attachToTarget): No target with given id
解决:确认 Lightpanda CDP 服务器已启动,并且版本与 Puppeteer 兼容。尝试重启:
# 杀掉旧进程
pkill lightpanda
# 重新启动
./lightpanda serve --port 9222
Q5: 页面加载超时
症状:TimeoutError: Navigation timeout
解决:
# 增加超时时间
await page.goto(url, { timeout: 60000 });
# 或者不用 networkidle0,改用 domcontentloaded
await page.goto(url, { waitUntil: "domcontentloaded" });
Q6: 想用 Playwright 而不是 Puppeteer
症状:不知道如何集成
解决:Playwright 的连接方式和 Puppeteer 类似:
import { chromium } from 'playwright';
const browser = await chromium.connectOverCDP('ws://127.0.0.1:9222');
// 后续用法一样
扩展阅读 / 进阶方向
1. 从源码编译
如果你想深入研究 Lightpanda 的内部实现,或者给它贡献代码,可以从源码编译:
# 安装 Zig 0.15.2
curl -L https://ziglang.org/download/0.15.2/zig-linux-x86_64-0.15.2.tar.xz | tar xJ
# 克隆项目
git clone https://github.com/lightpanda-io/browser.git
cd browser
# 编译
zig build run
2. Playwright 集成
Lightpanda 官方支持 Playwright。用法:
npm install playwright
import { firefox } from 'playwright';
const browser = await firefox.connectOverCDP('ws://127.0.0.1:9222');
// 后续用法和普通 Playwright 一样
WARNING
Playwright 支持有局限——因为 Lightpanda 会不断添加新的 Web API,Playwright 可能会选择不同的执行路径,导致某些脚本不工作。
3. 代理和网络拦截
Lightpanda 支持代理和网络请求拦截:
# 启动时指定代理
./lightpanda serve --proxy http://proxy:8080
4. 自定义 HTTP 头
await page.setExtraHTTPHeaders({
'X-Custom-Header': 'value'
});
5. Web Platform Tests
Lightpanda 团队在持续推进 Web API 兼容性测试。你可以在 wpt.live 上测试特定 API 的支持情况。