browser-use 是目前 GitHub 上增长极快的开源项目(由 Gregor Zunic 等人发起),它旨在让大模型(LLM)能够像人类一样自主操作浏览器。
之所以在开发者社区“爆火”,是因为它极大地简化了构建 Web Agent 的复杂度。以前你需要自己处理 DOM 解析、元素定位、错误重试等繁琐工程问题,而 browser-use 将这些封装成了简洁的 API,并针对 LLM 的特性做了深度优化。
以下是对 browser-use 项目的架构原理、核心特性、代码示例及落地建议的详细拆解。
1. 核心架构设计
browser-use 的设计哲学是 “LLM 作为大脑,Playwright 作为手脚”。其工作流如下:
A. 状态提取器 (State Extractor)
这是该项目的核心创新点之一。它不直接把原始 HTML 扔给 LLM,而是通过以下步骤生成“LLM 友好”的上下文:
-
DOM 修剪:移除
<script>,<style>, 隐藏元素、广告节点。 - 交互元素识别:只保留按钮、输入框、链接、下拉菜单等可操作元素。
-
视觉标注 (Visual Marking):
- 它在页面上为每个可交互元素生成一个唯一的数字索引(Index),例如
[1],[2]。 - 同时,它会提取这些元素的文本内容、类型(button/input)、位置信息。
- 它在页面上为每个可交互元素生成一个唯一的数字索引(Index),例如
- 结构化输出:将上述信息序列化为紧凑的 JSON 或文本描述,发送给 LLM。
关键点:LLM 不需要理解复杂的 XPath 或 CSS Selector,只需要说 “点击索引为 5 的元素”。这大幅降低了 LLM 的认知负荷和 Token 消耗。
B. 动作执行器 (Action Executor)
基于 Playwright(微软开发的自动化测试工具,比 Selenium 更快、更稳定)。
- 接收 LLM 输出的标准化动作指令(如
click,type,scroll)。 - 通过索引映射回真实的 DOM 元素。
- 执行操作,并处理常见的异常(如元素被遮挡、页面跳转超时)。
C. 记忆与规划 (Memory & Planning)
- 短期记忆:保存最近几步的操作历史和页面状态,帮助 LLM 理解上下文(例如:“我刚才点击了搜索框,现在应该输入关键词”)。
- 任务分解:对于复杂任务,LLM 会先生成高层计划,再逐步执行子步骤。
2. 为什么它比传统方案更好?
| 特性 | 传统 RPA / Selenium 脚本 | 普通 LLM + Playwright | browser-use |
|---|---|---|---|
| 开发成本 | 高(需硬编码选择器) | 中(需自行处理 DOM 解析) | 低(几行代码即可启动) |
| 鲁棒性 | 低(UI 微调即崩溃) | 中(LLM 易幻觉,选错元素) | 高(内置重试、自我修正机制) |
| 通用性 | 差(仅限特定网站) | 一般 | 强(适用于任何网页) |
| Token 效率 | N/A | 低(常发送完整 HTML) | 高(智能裁剪 DOM) |
| 多模态支持 | 无 | 需自行集成 | 原生支持截图辅助(可选) |
3. 快速上手代码示例
安装:
pip install browser-use
基础用法(以搜索为例):
import asyncio
from browser_use import Browser, Controller
from langchain_openai import ChatOpenAI
# 1. 初始化浏览器和控制器
browser = Browser()
controller = Controller()
# 2. 定义任务
@controller.action('Search for a query on Google')
async def search_google(query: str):
await browser.goto('https://www.google.com')
await browser.type('input[name="q"]', query)
await browser.press('Enter')
return f"Searched for: {query}"
# 3. 配置 LLM (支持 OpenAI, Anthropic, Azure, Ollama 等)
llm = ChatOpenAI(model="gpt-4o")
# 4. 创建 Agent 并运行
agent = Agent(
task="Find the latest news about AI agents and summarize the top article.",
llm=llm,
browser=browser,
controller=controller
)
async def main():
result = await agent.run()
print(result)
await browser.close()
if __name__ == "__main__":
asyncio.run(main())
注:实际使用中,你通常不需要写具体的 search_google 函数,而是直接让 Agent 自主探索。上面的例子展示了如何注入自定义动作。更常见的用法是直接给自然语言任务:
agent = Agent(
task="Go to Hacker News, find the top post, and tell me its title and number of comments.",
llm=llm,
browser=browser
)
4. 高级特性与技术细节
A. 敏感信息保护
-
browser-use允许你标记某些输入框为“敏感”(如密码框),LLM 可以看到这里有输入框,但不会读取或泄露其中的内容,适合企业级安全需求。
B. 自定义动作注册
- 你可以注册特定的业务逻辑动作。例如,在你的本地生活场景中,可以注册一个
login_to_merchant_platform()动作,封装复杂的登录验证码处理逻辑,然后让 LLM 在需要时调用它。
C. 视觉增强 (Vision Mode)
- 当 DOM 结构混乱或无法准确描述 UI 时(如 Canvas 游戏、复杂图表),可以开启视觉模式。Agent 会截取屏幕截图,结合 VLM(如 GPT-4o-Vision)进行定位。
D. 并发与多标签页
- 支持同时打开多个标签页,Agent 可以在不同标签页之间切换、对比信息(例如:比价场景,同时打开京东和淘宝)。
5. 在您业务场景中的落地建议
browser-use 可以用于以下具体场景:
场景一:竞品数据自动化采集(非侵入式)
- 痛点:美团/抖音等平台 API 限制多、费用高,且数据更新有延迟。
-
方案:部署
browser-useAgent,定期模拟用户搜索“附近火锅”,抓取排名前三的商家价格、套餐详情、最新评价。 - 优势:无需逆向 APP 协议,维护成本低,UI 变动时 Agent 能自适应。
场景二:商家运营自动化助手
- 痛点:商家需要在多个平台(大众点评、饿了么、微信小店)后台重复上架商品、回复评论。
-
方案:
- 商家上传 Excel 商品表。
- Agent 自动登录各平台后台。
- 根据页面表单结构,自动填充商品信息、上传图片、发布。
-
技术点:利用
browser-use的表单自动填充能力,结合 OCR 处理图片上传。
场景三:内部系统智能测试与监控
- 痛点:公司内部的 SaaS 平台功能迭代快,回归测试人力成本高。
- 方案:编写自然语言测试用例(如“创建一个新订单并完成支付流程”),让 Agent 每晚自动执行,发现 UI 报错或流程阻断立即报警。
6. 潜在挑战与应对
-
稳定性问题:
- 挑战:网页加载慢、弹窗广告、验证码可能导致 Agent 卡死。
- 应对:设置合理的超时时间;集成第三方验证码解决服务(如 2Captcha);在关键步骤增加人工确认环节(Human-in-the-loop)。
-
成本问题:
- 挑战:每次操作都调用 LLM,Token 消耗大。
- 应对:使用小模型(如 Qwen-72B, Llama-3-70B)处理简单导航,仅在大决策点使用 GPT-4o;缓存常见的 DOM 结构映射。
-
合规与伦理:
- 挑战:高频爬取可能触发目标网站的风控。
-
应对:控制请求频率;使用代理 IP 池;遵守
robots.txt协议;仅用于合法的商业数据采集或内部自动化。
总结
browser-use 不是一个简单的爬虫库,而是一个浏览器操作系统的抽象层。它将“操作网页”这一行为变成了 LLM 可以理解的“语言”。