十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Lightpanda:一个用 Zig 从零写成的无头浏览器,100 页只吃 123MB

Lightpanda:一个用 Zig 从零写成的无头浏览器,100 页只吃 123MB 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 页LightpandaHeadless Chrome差异内存峰值123MB2GB约 16×执行耗时5s46s约 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 ax ./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 APIElement、Node、Document... │ ├── parser/ # HTML 解析html5ever │ └── Browser.zig # 浏览器实例持有 session、page_pool、JS 环境 ├── network/ # Libcurl HTTP 客户端、robots、拦截 ├── cdp/ │ └── domains/ # 21 个 CDP 协议域 ├── mcp/ # 原生 MCPstdio / 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_TELEMETRYtrue关闭一句话它是够用且极省的内核不是 Chrome 的替代。如果你的任务以 JS 驱动的抓取和数据提取为主、又对内存敏感它值得一试如果你依赖浏览器级的完整兼容性和渲染先掂量一下。现状与参与Lightpanda 目前处于 Beta稳定性和 API 覆盖在持续提升README 的待办清单HTTP loader、HTML 解析、DOM 树、JS、XHR/Fetch、CDP、点击、表单、Cookie、代理、网络拦截均已勾选能反映当前进度。团队把测试做成两层make test跑单元测试其中自定义 runner 会在 debug 构建下检测内存泄漏——一个分配了不释放的测试会直接判失败而不只是 lint 提醒端到端测试和 Web Platform TestsWPT则校验真实网页兼容性。想参与先看 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),仅供参考
返回列表