Lightpanda Browser

Lightpanda 是一个 为无头(headless)使用场景设计的开源浏览器。 ([GitHub][1])

主要能力:

  • JavaScript 执行
  • Web API 支持(部分实现,仍在开发中)
  • 通过 CDP(Chrome DevTools Protocol) 兼容

    • Playwright
    • Puppeteer
    • chromedp

该浏览器面向以下场景提供 高速 Web 自动化能力

  • AI Agent
  • LLM 训练
  • Web 数据抓取(scraping)
  • 自动化测试

性能特点:

  • 极低内存占用(比 Chrome 少约 9 倍)
  • 执行速度极快(约比 Chrome 快 11 倍)
  • 几乎瞬时启动 ([GitHub][1])

基准测试

示例:

AWS EC2 m5.large 实例上, 使用 Puppeteer 请求本地网站 100 个页面

详细 benchmark 数据见项目说明。


快速开始(Quick start)

安装

从 nightly 构建版本安装。

可以下载最新的二进制文件:

支持平台:

  • Linux x86_64
  • macOS aarch64

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

Windows + WSL2

Lightpanda 可以在 Windows 上通过 WSL 运行。

安装方式:

在 WSL 终端中按照 Linux 安装步骤执行。

建议:

在 Windows 主机安装 Puppeteer 等客户端工具。


Docker 安装

Lightpanda 提供官方 Docker 镜像:

支持:

  • Linux amd64
  • Linux arm64

运行命令:

docker run -d --name lightpanda -p 9222:9222 lightpanda/browser:nightly

该命令会启动一个容器,并在端口:

9222

暴露 Lightpanda 的 CDP server


获取网页内容(Dump URL)

示例:

./lightpanda fetch --dump https://lightpanda.io

示例输出:

info(browser): GET https://lightpanda.io/ http.Status.ok
info(browser): fetch script https://api.website.lightpanda.io/js/script.js: http.Status.ok
info(browser): eval remote https://api.website.lightpanda.io/js/script.js: TypeError: Cannot read properties of undefined (reading 'pushState')
<!DOCTYPE html>

启动 CDP Server

./lightpanda serve --host 127.0.0.1 --port 9222

输出示例:

info(websocket): starting blocking worker to listen on 127.0.0.1:9222
info(server): accepting new conn...

启动 CDP server 后,可以通过 Puppeteer 连接。


Puppeteer 示例

'use strict'

import puppeteer from 'puppeteer-core';

// 使用 browserWSEndpoint 指定 Lightpanda CDP 地址
const browser = await puppeteer.connect({
  browserWSEndpoint: "ws://127.0.0.1:9222",
});

// 后续脚本与普通 Puppeteer 使用方式相同
const context = await browser.createBrowserContext();
const page = await context.newPage();

await page.goto('https://wikipedia.com/');

const links = await page.evaluate(() => {
  return Array.from(document.querySelectorAll('a')).map(row => {
    return row.getAttribute('href');
  });
});

console.log(links);

await page.close();
await context.close();
await browser.disconnect();

Telemetry(遥测)

默认情况下,Lightpanda 会收集并发送 使用遥测数据

可以通过设置环境变量禁用:

LIGHTPANDA_DISABLE_TELEMETRY=true

隐私政策见:

https://lightpanda.io/privacy-policy

项目状态(Status)

Lightpanda 目前处于:

Beta

仍在持续开发中。

稳定性和功能覆盖正在逐步提升。 部分网站仍可能出现错误或崩溃。

如果遇到问题,请提交 GitHub Issue。


当前已实现功能

核心实现包括:

  • HTTP loader(基于 Libcurl
  • HTML 解析器与 DOM 树(基于 Netsurf libs
  • JavaScript 支持(V8 引擎
  • DOM API
  • Ajax

    • XHR API
    • Fetch API(polyfill)
  • DOM dump
  • CDP / WebSocket server
  • 点击(Click)
  • 表单输入(Input form)
  • Cookies
  • 自定义 HTTP headers
  • 代理支持
  • 网络拦截

说明:

Web API 数量非常多。 即使只是实现 headless 浏览器 也非常复杂。

未来将逐步增加支持。


从源码构建(Build from sources)

前置要求

Lightpanda 使用:

Zig 0.15.2

依赖组件:

  • zig-js-runtime(包含 V8)
  • Libcurl
  • Netsurf libs
  • Mimalloc

Debian / Ubuntu 依赖

sudo apt install xz-utils \
    python3 ca-certificates git \
    pkg-config libglib2.0-dev \
    gperf libexpat1-dev unzip rsync \
    cmake clang

Nix 系统

nix develop

macOS

需要:

  • Xcode
  • Homebrew

安装依赖:

brew install cmake pkgconf

构建依赖

一键构建

make install

开发版本:

make install-dev

注意:

该过程非常耗时, 因为会从源码编译所有依赖(包括 V8)。


分步骤构建

初始化 submodules:

make install-submodule

iconv

国际化库,用于 Netsurf。

make install-libiconv

Netsurf libs

用于:

  • HTML 解析
  • DOM 树构建
make install-netsurf

开发版本:

make install-netsurf-dev

Mimalloc

C 语言内存分配器。

make install-mimalloc

开发版本:

make install-mimalloc-dev

V8

下载 V8 源码:

make get-v8

编译:

make build-v8

开发版本:

make build-v8-dev

测试(Test)

单元测试

make test

端到端测试

需要:

  • 克隆 demo 仓库到 ../demo
  • 安装 Node 依赖
  • 安装 Go > 1.24

运行:

make end2end

Web Platform Tests

Lightpanda 使用标准 WPT(Web Platform Tests) 进行测试。

测试文件位于:

tests/wpt

运行全部测试:

make wpt

运行指定测试:

make wpt Node-childNodes.html

贡献(Contributing)

项目接受 GitHub Pull Request。

提交 PR 时需要签署:

CLA

否则无法接受贡献。


为什么要做 Lightpanda?

现代 Web 必须执行 JavaScript

过去抓取网页只需要:

HTTP request

现在不再如此。

原因:

  • Ajax
  • Single Page Application
  • 无限加载
  • 点击加载内容
  • 即时搜索

以及各种 JS 框架:

  • React
  • Vue
  • Angular

Chrome 不是合适的工具

如果需要 JavaScript, 为什么不用真正浏览器?

例如:

运行大量 headless Chrome 实例

但这带来问题:

  • RAM 和 CPU 消耗巨大
  • 部署和维护复杂
  • 包含大量无用功能

Lightpanda 的设计目标

如果既要 JavaScript 执行能力,又要 高性能

就必须重新设计浏览器。

Lightpanda 的设计:

  • 不基于 Chromium / Blink / WebKit
  • 使用系统级语言 Zig
  • 专注性能优化
  • 不包含图形渲染

Footnotes

Playwright 兼容性说明

由于 Playwright 的实现方式:

未来 Lightpanda 新增 Web API 后, Playwright 可能选择不同执行路径。

这可能导致:

  • 某些脚本在未来版本出现不兼容。

如果遇到问题,请提交 Issue 并附带:

  • 脚本
  • 最后可运行的版本

License

该项目使用:

AGPL-3.0

参考资料