Browser4 实战:一条 SQL 抽取网页数据,零 Token 成本
1. 为什么我放弃了让大模型读网页这条路做批量网页抽取的人迟早会撞上同一堵墙Token 账单。单页抽取时感觉不到一旦 URL 列表上到几百上千条成本就随页数线性放大。更麻烦的是模型读网页这件事本身不稳定——同一段 HTML换个提示词、换个模型版本抽出来的字段格式可能就不一样你还得再写一层校验代码去兜底。Browser4 走的是另一条路。它是一个 Rust CLI 加 Spring Boot 后端的浏览器引擎通过 CDP 直驱 Chrome把网页结构直接映射成可查询的数据表。核心能力叫 X-SQL把 CSS 选择器命中的元素集合当成数据库的行用一条 SQL 一次取出多个关联字段顺带完成清洗、类型转换和排序。整个过程在本地完成不经过任何 LLMToken 消耗为零。这篇文章适合谁手上有一批结构相似的列表页要抽字段、字段需要做类型转换、还想跑定时任务的人。如果你只是偶尔读一两个页面用模型对话就够了没必要上这套。但如果你已经在为批量抽取的账单发愁Browser4 的 X-SQL 值得花半小时跑通一次。我实际安装并跑通了完整链路包括一个 Intel Mac 用户必踩的安装坑——官方压根没出 darwin-x64 的预编译运行时包。下面从安装开始一步步给到可复制的命令、SQL 语句和结果校验方法。2. Browser4 是什么Rust CLI 加 CDP 直驱的本地抽取引擎先把架构讲清楚不然后面配置容易懵。Browser4 的链路很短browser4-cli (Rust) ──MCP over HTTP──▶ browser4-rest (Kotlin/Spring) ──▶ PulsarWebDriver (Kotlin/CDP)CLI 是 Rust 写的负责跟你交互后端是 Kotlin/Spring 服务默认监听 8182 端口最底层通过 CDP 协议直接驱动 Chrome。三者之间用 MCP over HTTP 通信。你敲的每一条browser4-cli命令本质是发给本地后端的一个请求。它有三个核心模块理解这三个就理解了它的定位模块作用X-SQL把 CSS 选择器命中的元素集合当作数据库的行用 SQL 一次取出多个关联字段支持清洗、类型转换、排序PowerCSS在标准 CSS 上扩展:expr()伪类用元素的计算视觉特征宽高、位置、内容密度做选择器抗前端改版WebMiner本地机器学习管线把结构未知、样式各异的批量页面自动聚类成结构化表格X-SQL 是这篇的主角。传统方案抽一个列表页要拆成三步先写 Playwright 抓原始文本再写 Python 或 Node.js 把£51.77这种带货币符号的字符串清洗成51.77最后导入数据库写排序逻辑。三步三份代码三套依赖。X-SQL 把这三步压进一条 SELECT清洗和类型转换由内置函数在查询时完成。项目是 Apache 2.0 开源GitHub 仓库platonai/Browser4npm 包名browser4-cli。我实测时间点仓库约 1114 star59 个 release最新版本 v4.13.11npm 已发 52 个版本。它不是要取代 Playwright——Playwright 在交互测试和复杂流程编排上依然是主力——而是在「批量抽取 零 Token」这个特定位置做差异化。一个关键设计区分理解了它才能用好这套工具交互用snapshot取数用htmlsnapshot。snapshot返回一次性的元素 ref比如 e15、e16DOM 一变 ref 就失效所以 20 个商品页就得做 20 次快照htmlsnapshot返回静态 DOM你用 CSS 选择器定位一个.price选择器能覆盖所有同类页面。前者适合点击填表后者才是零 Token 批量抽取的正确入口。3. 前置准备与可复制配置Intel Mac 的绕路方案官方 README 给的安装命令就两行npm install -g browser4-cli browser4-cli install第一步没问题。第二步在我这台 Intel Mac 上直接失败报错信息是这样的Mirror aliyun-oss speed test failed: HTTP 404 Not Found Mirror github speed test timed out after 30s ... Download from github failed: error sending request for url (https://github.com/platonai/Browser4/releases/latest/download/browser4-bundle-runtime-darwin-x64.tar.gz) Failed to download from all 2 mirror(s).我查了 v4.13.11 的 release assets一共 11 个文件运行时 bundle 只有三个平台browser4-bundle-runtime-darwin-arm64.tar.gz 115MB browser4-bundle-runtime-linux-x64.tar.gz 121MB browser4-bundle-runtime-windows-x64.zip 116MBdarwin-x64根本没有。官方镜像 aliyun-oss 的路径是 404GitHub 直连又超时两个原因叠加browser4-cli install在 Intel Mac 上目前跑不通。这不是网络问题是官方确实没出这个平台的包。绕路方案release 里有一个跨平台的 fat jar直接用它起后端。后端要求 JDK 17本机如果只有 JDK 8 需要先装一个。# 1) 建目录并拉跨平台 jar官方 release 里就叫 Browser4.jar约 89MB mkdir -p ~/browser4-runtime curl -sL -o ~/browser4-runtime/Browser4.jar \ https://gh-proxy.com/https://github.com/platonai/Browser4/releases/download/v4.13.11/Browser4.jar # 2) 装 JDK 21后端要求 17 brew install openjdk21 # 3) 设置 JAVA_HOME 并启动后端 export JAVA_HOME/usr/local/opt/openjdk21 export PATH$JAVA_HOME/bin:$PATH java -jar ~/browser4-runtime/Browser4.jar 后端起来后确认 CLI 和后端是否连通browser4-cli status正常输出Browser4 Status CLI version: 0.1.28 Server URL: http://localhost:8182 Server health: UPServer health: UP就表示链路通了。这时后端日志里会打印一批工具注册信息大约 40 个 MCP 工具navigate / reload / click / fill / snapshot / page_source 等全部加载成功。如果你用的是 Apple Silicon Mac 或 Linux x64直接走browser4-cli install就行不用这套绕路。只有 Intel Mac 需要手动起 jar。关于配置Browser4 的 CLI 配置走环境变量和命令行参数没有复杂的 TOML 文件。如果你要把它接到别的工具里需要记住三件套Base URL 是http://localhost:8182Key 在本地模式下不需要后端跑在本机Model ID 不适用——因为 X-SQL 路径根本不调模型。这一点和接大模型 API 完全不同别把两套配置混在一起。4. 一条 SQL 抽 8 本书完整执行与结果校验核心演示就是这条查询。我把它写进一个 SQL 文件注意SQL 文件不能带注释这是第一个坑后面会细说。新建query.sqlSELECT DOM_FIRST_TEXT(DOM, h3) AS title, DOM_FIRST_FLOAT(DOM, .price_color, 0.0) AS price, DOM_FIRST_ATTR(DOM, h3 a, href) AS path, DOM_FIRST_ATTR(DOM, .star-rating, class) AS rating FROM LOAD_AND_SELECT(https://books.toscrape.com/, .product_pod) ORDER BY price ASC LIMIT 8这条 SQL 里有几个关键点。LOAD_AND_SELECT(url, selector)是数据源函数第一个参数是目标 URL第二个参数是行选择器——.product_pod命中页面上每个商品卡片每个卡片就是结果集里的一行。DOM_FIRST_TEXT(DOM, h3)取每行内第一个 h3 的文本作为书名。DOM_FIRST_FLOAT(DOM, .price_color, 0.0)取价格文本并转成浮点数第三个参数是转换失败时的默认值。DOM_FIRST_ATTR取属性值用来拿链接和评分 class。执行分两步browser4-cli open https://books.toscrape.com/ browser4-cli htmlsnapshot query --sql query.sql真实返回截取部分{statusCode:200,pageStatusCode:200,pageContentBytes:63479,isDone:true, resultSet:[ {title:Starving Hearts (Triangular Trade ...,price:13.99,rating:star-rating Two}, {title:Set Me Free,price:17.46,rating:star-rating Five}, {title:The Coming Woman: A ...,price:17.93,rating:star-rating Three}, {title:Shakespeares Sonnets,price:20.66,rating:star-rating Four}, {title:The Boys in the ...,price:22.6,rating:star-rating Four}, {title:The Requiem Red,price:22.65,rating:star-rating One}, {title:Olio,price:23.88,rating:star-rating One}, {title:The Dirty Little Secrets ...,price:33.34,rating:star-rating Four} ]}校验结果看四个点。第一statusCode和pageStatusCode都是 200说明页面抓取成功。第二resultSet有 8 条LIMIT 8生效。第三价格是升序的13.99 到 33.34ORDER BY price ASC生效。第四价格字段是纯数字字符串£51.77里的货币符号已经被DOM_FIRST_FLOAT清洗掉了。这条查询一次完成了四件事取书名、取价格并把带货币符号的字符串转成浮点数、取链接路径、取评分 class然后按价格升序取前 8 条。全程没有调用任何 LLMToken 消耗为 0。一个容易忽略的细节官方文档示例的输出价格是 10.17 / 10.64 / 10.84我跑出的是 13.99 / 17.46。这不是 Bug——books.toscrape.com 每次访问都随机生成商品页这是站点本身的设计。所以你的结果和我的不一样是正常的只要字段结构对、排序对就说明查询正确。批量场景下把 URL 列表写进文件用 crawl 或 swarm 跑# 单机批量输出 CSV browser4-cli crawl --seed-file urls.txt --depth 0 --sql query.sql --format csv # Swarm 模式多浏览器上下文并发 browser4-cli swarm create --max-browser-contexts 8 browser4-cli swarm query --seed-file urls_10k.txt --sql query.sql browser4-cli swarm result task-id--depth 0表示只抽种子 URL 本身不跟进链接。--format csv直接输出 CSV省掉自己写导出代码。Swarm 模式的并发数由--max-browser-contexts控制8 表示同时开 8 个浏览器上下文。5. 常见报错排查从 401 到 SQL 500 的对照表这一节是我实际踩过的坑按报错现象对照解法。问题现象原因解法browser4-cli install报 asset not foundIntel Mac 无官方 runtime bundle用 release 里的 Browser4.jarjava -jar启动官方镜像 404aliyun-oss 路径返回 404走 gh-proxy 代理下载 jar后端启动失败JDK 版本低于 17brew install openjdk21并设置 JAVA_HOMESQL 返回 500Only select statements are supportedSQL 文件带--注释SQL 必须写成纯 SELECT不加注释Server health: DOWN后端没起来或端口被占检查 8182 端口重启 jarlocal proxy failed本地代理配置干扰了 CDP 连接清掉 HTTP_PROXY / HTTPS_PROXY 环境变量返回reading choices相关错误请求体格式不对确认--sql file.sql的 前缀没漏第四个是我一开始就栽进去的。照抄官方示例的注释头第一次执行直接 500{statusCode:500,message:Only select statements are supported}错误信息很明确但得知道原因才能绕过去——解析器把--注释当成了非 SELECT 语句。把注释删掉纯 SELECT 就正常了。关于local proxy failed如果你本机设了 HTTP_PROXY 之类的环境变量CDP 连接可能被劫持到代理上导致连不上 Chrome。跑 Browser4 前先unset HTTP_PROXY HTTPS_PROXY或者在一个干净的环境里跑。关于 401本地模式下后端不校验 Key正常不会出 401。如果你把后端暴露到局域网或改了配置加了鉴权才会遇到。这时检查 CLI 的请求头里有没有带上正确的凭证。但绝大多数本地使用场景不会碰到这个。还有一个隐蔽的坑browser4-cli open和htmlsnapshot query之间会话要保持。如果你用了命名会话-s work查询时也要带同样的-s work否则查的是另一个会话的页面结果为空。browser4-cli -s work open https://books.toscrape.com/ browser4-cli -s work htmlsnapshot query --sql query.sql会话隔离是个好设计多任务并行时互不干扰但前提是 open 和 query 用同一个会话名。6. 命令速查与场景判断把常用命令整理成速查表方便你复制。# 启动 java -jar ~/browser4-runtime/Browser4.jar browser4-cli status # 会话 browser4-cli open https://example.com browser4-cli open --headed https://example.com browser4-cli -s work open https://site.com browser4-cli list # 交互refs 来自 snapshot browser4-cli snapshot -i --boxes browser4-cli click e15 browser4-cli fill e16 text --submit # 静态抽取零 LLM Token browser4-cli htmlsnapshot browser4-cli htmlsnapshot get text h1 browser4-cli htmlsnapshot query --sql query.sql # 批量 browser4-cli crawl --seed-file urls.txt --depth 0 --sql q.sql --format csv browser4-cli swarm create --max-browser-contexts 8 browser4-cli swarm query --seed-file urls_10k.txt --sql q.sql browser4-cli swarm result task-id # 定时 browser4-cli loop -i 3600 -- eval document.querySelector(.price)?.textContentloop -i 3600表示每 3600 秒跑一次适合持续监控某类页面。eval后面跟一段 JS用来做轻量的自定义取值。场景判断我的实测结论适合用的场景——批量 URL 列表抽取、结构已知或半已知的列表页、字段需要清洗和类型转换、跑定时任务持续监控。这类任务重复度高、结构稳定本地 SQL 路径的收益远大于 LLM。不适合的场景——多步交互流程登录、填表、翻页点击、需要理解语义的开放式任务、单次性的页面理解。这些还是走 LLM 驱动的浏览器自动化框架更合适。需要说明的是Swarm 模式的「单机每天 10-20 万页」是项目方自述的初步性能测试结果官方也注明正式 benchmark 还在准备中我没有验证这个数字。WebMiner 和 PowerCSS 的:expr()我这次也没有实测——WebMiner 同样需要 JDK 17 全套环境PowerCSS 需要构造特定页面。如果你要长期跑批量抽取任务把 Browser4 的本地抽取和 TaoToken 的模型能力配合起来是个思路结构化的字段用 X-SQL 本地抽零 Token遇到需要语义判断的字段比如判断评论情感、归类商品类目再把那一小部分文本送去模型处理。这样 Token 只花在真正需要理解的地方而不是浪费在解析 HTML 结构上。模型对话入口在 https://taotoken.net/api 接入文档在 https://taotoken.net/doc 需要长期编码或 Agent 场景可以看 Coding Planhttps://taotoken.net/coding-plan 。回到 Browser4 本身。它的核心价值不是「又一个浏览器自动化框架」而是把「抽取 清洗 排序」这三步压进一条 SQL全程走本地数据库引擎不产生 Token 费用。我实测的 books.toscrape.com 示例确实跑通了四字段一查询、自动类型转换、ORDER BY 生效返回 HTTP 200 和 8 行结果。如果你的场景是批量结构化抽取值得一试。如果你的 Mac 是 Intel 芯片记住走 Browser4.jar 这条路别在browser4-cli install上浪费时间——目前官方确实没出 darwin-x64 的运行时包。跑通之后把query.sql换成你自己的选择器和字段就能直接复用到目标站点上。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →