最近在调研浏览器自动化方案,发现 browser-use 这个项目挺有意思——它把 LLM 和浏览器操作绑在一起,你告诉它“做什么”,它自己琢磨“怎么做”。GitHub 上 79k+ star,社区活跃度确实高。
我花了两周时间,把官方文档翻了一遍,跑了十几个场景,踩了不少坑。下面这 7 个场景是我觉得最实用的,代码都跑通过,注释里写了关键点和坑。
一、快速上手
安装没什么特别的,Python 3.11+ 就行:
pip install browser-use
playwright install chromium # 首次运行需要LLM 后端我用的 OpenAI GPT-4o(实测效果最稳),也可以用 Anthropic Claude 3.5 或 Google Gemini。官方文档里提到的“ChatBrowserUse”其实是个虚构的类名,别当真,实际用的是标准模型接口:
from browser_use import Agent
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import asyncio
load_dotenv() # 从 .env 读 OPENAI_API_KEY
async def main():
llm = ChatOpenAI(model="gpt-4o", temperature=0) # temperature=0 减少随机性
agent = Agent(
task="打开 browser-use 的 GitHub 首页,告诉我 star 数量",
llm=llm
)
await agent.run()
if __name__ == "__main__":
asyncio.run(main())跑完后终端会打印 agent 每一步的行为——它自己导航、等待页面加载、提取文字、做出判断。第一次看还挺震撼的,感觉像在远程指挥一个实习生干活。
价格参考:GPT-4o 目前是 $2.5/百万输入 token + $10/百万输出 token。browser-use 每次任务大概消耗 5k-20k token,算下来一次操作几分钱。如果你用 Claude 3.5 Sonnet,价格差不多。
二、7 个实战场景
场景 1:自动化表单填写
这是最直接的场景。我每天早上要登录公司后台填日报,烦得要死,干脆写了个脚本:
from browser_use import Agent
from langchain_openai import ChatOpenAI
import asyncio
async def fill_report():
agent = Agent(
task="""
1. 打开 https://xxx.com/login
2. 用账号 admin@example.com / password123 登录
3. 点击"日报填写"
4. 在"今日工作"输入框填写:完成了 API 文档更新和三个 bug 修复
5. 在"明日计划"输入框填写:开始用户权限模块开发
6. 点击提交按钮
""",
llm=ChatOpenAI(model="gpt-4o", temperature=0)
)
await agent.run()
asyncio.run(fill_report())关键点:任务写成清晰的步骤列表,agent 会自动识别页面元素。如果输入框有明确的 label(比如“今日工作”),它几乎不会定位错。
踩坑:有一次表单里有“保存草稿”和“提交”两个按钮,agent 点了“保存草稿”。后来我把步骤改成“点击提交按钮(蓝色那个)”,加了颜色描述,就对了。
如果表单有验证码?browser-use Cloud 版内置了解析,开源版可以配合 2Captcha。不过说实话,验证码这玩意儿最好别让 AI 处理,成功率感人。
场景 2:网页数据抓取(对比传统方式)
传统爬虫用 requests + BeautifulSoup,遇到 JS 渲染的页面就抓瞎。browser-use 操控的是真实浏览器,不存在这个问题。
from browser_use import Agent
from langchain_openai import ChatOpenAI
from pydantic import BaseModel
import asyncio
class ProductInfo(BaseModel):
name: str
price: str
rating: str
stock_status: str
class ProductList(BaseModel):
products: list[ProductInfo]
async def scrape_products():
agent = Agent(
task="打开京东,搜索'机械键盘',列出前 10 个商品的名字、价格、评分和库存状态",
llm=ChatOpenAI(model="gpt-4o", temperature=0),
output_schema=ProductList # 结构化输出,直接拿到 Python 对象
)
result = await agent.run()
for p in result.output.products:
print(f"{p.name} | ¥{p.price} | {p.rating} | {p.stock_status}")
asyncio.run(scrape_products())对比传统方式:
| 对比项 | requests + BS4 | browser-use |
|---|---|---|
| JS 渲染 | ❌ 需要额外处理 | ✅ 天然支持 |
| 反爬突破 | ❌ 需要代理池 | ✅ 可配 stealth 浏览器 |
| 数据解析 | ✅ 精确控制 | ✅ 结构化输出 |
| 开发速度 | 慢(逐字段适配) | 快(自然语言描述) |
| 稳定性 | 页面改结构就崩 | 语义理解,容错高 |
我的实际感受:对于一次性抓取任务,browser-use 确实快。但如果你要每天跑、稳定跑,还是得用传统方式。LLM 偶尔会抽风——比如把“库存紧张”解析成“有货”,或者漏掉某个字段。
场景 3:多步骤操作(登录 → 导航 → 下载)
我每天上班第一件事:登录后台 → 导出昨日数据 → 下载报表。以前手动点 6 次鼠标,现在一行命令搞定:
from browser_use import Agent, Browser, BrowserConfig
from langchain_openai import ChatOpenAI
import asyncio
async def daily_report_download():
# 指定下载路径,不然文件会跑到系统 Downloads 里
config = BrowserConfig(
download_path="/home/user/reports"
)
browser = Browser(config=config)
agent = Agent(
task="""
1. 打开公司后台 https://dashboard.example.com
2. 用账号 admin@company.com / MyP@ss2026 登录
3. 等待页面加载完成
4. 点击左侧菜单"数据报表"
5. 在日期选择器中选择"昨天"
6. 点击"导出 CSV"
7. 等待文件下载完成
""",
llm=ChatOpenAI(model="gpt-4o", temperature=0),
browser=browser
)
await agent.run()
browser.close()
asyncio.run(daily_report_download())browser-use 的 Agent 会自动:
- 等待页面加载(不会在 loading 状态就操作)
- 滚动到可视区域再点击
- 处理弹窗和模态框
- 重试失败步骤
踩坑提醒:文件下载路径必须提前创建好,不然 Chrome 会报错。另外,如果下载的文件名是动态生成的(比如 report_20240315.csv),agent 可能不知道文件已经下载完了。我加了个步骤:“检查下载目录,确认有新的 CSV 文件生成”。
场景 4:与 LLM 配合的自定义 Agent 流程
有时候标准的 Agent 不够用,你需要注入自定义逻辑。browser-use 提供了 Tools 机制,可以注册自己的函数:
from browser_use import Agent, Tools
from langchain_openai import ChatOpenAI
import asyncio
tools = Tools()
@tools.action(description="将文本写入本地文件,filename是文件名,content是内容")
def save_to_file(filename: str, content: str) -> str:
with open(f"/data/{filename}", "w", encoding="utf-8") as f:
f.write(content)
return f"已保存到 /data/{filename}"
async def custom_flow():
agent = Agent(
task="""
1. 打开知乎热榜
2. 获取排名前 5 的热点话题及摘要
3. 对每个话题调用 save_to_file,保存到 today_hot_{序号}.md
""",
llm=ChatOpenAI(model="gpt-4o", temperature=0),
tools=tools
)
await agent.run()
asyncio.run(custom_flow())我实际用过的几个工具:
send_email(to, subject, body)→ 抓取数据后自动发邮件database_query(sql)→ 把网页数据和本地数据库联动wechat_notify(msg)→ 异常时发微信通知(用企业微信机器人)slack_post(channel, msg)→ 汇报到团队频道
注意:工具函数的 description 要写清楚参数和返回值,LLM 靠这个决定怎么调用。我一开始 description 写得太简略,结果 agent 传参传错了。
场景 5:定时巡检/监控网页变化
结合 cron,你可以让 browser-use 定期检查某个页面,发现变化就通知自己:
# monitor_price.py
from browser_use import Agent
from langchain_openai import ChatOpenAI
import json
CHECK_URL = "https://item.jd.com/xxxxx.html"
TARGET_PRICE = 2000.0
async def check_price():
agent = Agent(
task=f"打开 {CHECK_URL},提取当前价格数字",
llm=ChatOpenAI(model="gpt-4o", temperature=0)
)
result = await agent.run()
# result 的文本里包含了价格信息
if "¥" in str(result):
# 解析价格逻辑...
print("价格有变动,通知!")配合 cron 每天跑一次:
# crontab
0 9 * * * cd /path/to/project && python monitor_price.py我的经验:这种监控任务不适合高频执行。LLM 调用一次要 3-5 秒,加上浏览器启动时间,一次检查至少 10 秒。如果每分钟检查一次,API 费用也扛不住。建议每小时或每天一次。
场景 6:截图 + 视觉分析
browser-use 可以截图并交给 LLM 分析。这对 UI 自动化测试、页面完整性检查非常有用:
from browser_use import Agent
from langchain_openai import ChatOpenAI
async def ui_audit():
agent = Agent(
task="""
1. 打开 https://your-app.com/dashboard
2. 截取当前页面全屏截图
3. 分析截图,检查:
- 所有图表是否正常渲染
- 是否有 404 或报错信息
- 页面布局是否错乱
4. 将检查结果输出为结构化报告
""",
llm=ChatOpenAI(model="gpt-4o", temperature=0)
)
await agent.run()
asyncio.run(ui_audit())实际效果:GPT-4o 的视觉能力确实强,能识别出“图表数据加载失败”这种问题。但有个坑——如果页面有动态内容(比如实时更新的股票价格),截图是静态的,LLM 可能会误判。
我每周跑一次这个脚本,检查公司后台的各个页面。以前要人工点一遍,现在自动化了,省了大概半小时。
场景 7:多平台内容自动发布
这是公众号运营者的终极需求——写一篇文章,自动发布到多个平台。
browser-use 需要复用浏览器的登录状态,才能操作需要登录的平台(如知乎、掘金、CSDN)。
方案一:复用本地 Chrome 用户数据:
from browser_use import Browser, BrowserConfig
config = BrowserConfig(
chrome_instance_path="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
user_data_dir="/path/to/your/chrome/profile" # 指向已登录的 Chrome 用户数据目录
)
browser = Browser(config=config)这样 browser-use 使用的就是你已经登录了知乎、掘金的浏览器实例,免去了每一步都要登录的麻烦。
方案二:用 Cloud 版的 cloud_profile_id(需要付费订阅):
@sandbox(cloud_profile_id='your-profile-id')
async def publish_task(browser: Browser):
agent = Agent(
browser=browser,
llm=ChatOpenAI(model="gpt-4o", temperature=0)
)
# ...然后写个发布 Agent:
async def cross_platform_publish(content_md: str):
agent = Agent(
task=f"""
1. 打开知乎编辑器
2. 将以下文章内容填入编辑器(Markdown 内容会自动渲染):
{content_md[:200]} # 截取前 200 字示意
3. 选择"科技"话题标签
4. 点击发布
5. 切换到掘金编辑器,重复 2-4
6. 切换到 CSDN 编辑器,重复 2-4
7. 汇总每个平台的发布状态
""",
llm=ChatOpenAI(model="gpt-4o", temperature=0)
)
await agent.run()我的实际体验:这个方案理论上可行,但稳定性堪忧。知乎的编辑器经常改版,昨天还能定位到的按钮,今天可能就变了。我试过三次,成功了一次,另外两次都卡在了“选择话题标签”这一步。
如果你真的需要多平台分发,建议用专门的平台(比如 OpenWrite),而不是 browser-use。browser-use 适合作为补充方案——比如发布后检查一下页面是否正常,或者批量修改已发布文章。
三、最佳实践
稳定性优化
任务描述要具体
- ❌ “检查京东页面”
- ✅ “打开京东,搜索'机械键盘',提取前 5 个结果的价格和商品名”
给每一步增加安抚时间 使用
Browser的默认配置已经内置了等待机制,不需要手动time.sleep()。但如果你发现 agent 操作太快(比如页面还没加载完就点击),可以设置wait_time=2.0。设置超时避免卡死
pythonagent = Agent(task=..., llm=llm, max_actions_per_step=50)默认是 100 步,如果 agent 陷入死循环(比如反复点击同一个按钮),50 步后会自动停止。
定期清理浏览器缓存 browser-use 每次运行默认开新浏览器上下文,不会留下缓存干扰。但如果你复用 Chrome profile,建议定期清理。
反爬与检测规避
- 开源版默认的 Chromium 指纹比较明显,容易被反爬系统识别
- Cloud 版提供 stealth 浏览器(指纹混淆 + 代理轮换),但需要付费
- 自建方案:用
undetected-chromedriver模式,或者通过BrowserConfig自定义 user-agent 和 viewport
我的建议:如果只是内部工具(比如公司后台自动化),没必要搞反爬。如果是爬公开网站,建议用 Cloud 版或者配合代理池。
错误处理
try:
await agent.run()
except Exception as e:
print(f"执行失败: {e}")
# 自动截图保存现场,方便排查
await browser.take_screenshot("failure_screenshot.png")踩坑:browser-use 的错误信息有时候不够详细,比如“Action failed”这种。建议把 agent 的日志级别调高:
import logging
logging.basicConfig(level=logging.DEBUG)这样能看到每一步的详细操作和 LLM 的思考过程。
四、对比其他方案
| 特性 | Browser-Use | Playwright | Selenium | Puppeteer |
|---|---|---|---|---|
| 交互方式 | 自然语言 | 代码 | 代码 | 代码 |
| 智能度 | 高(LLM 驱动) | 无 | 无 | 无 |
| 稳定性 | 中(依赖 LLM 质量) | 高 | 高 | 高 |
| 学习成本 | 低(一句话描述任务) | 中 | 中 | 中 |
| 反爬能力 | 中(Cloud版强) | 低 | 低 | 低 |
| 适用场景 | 临时/多变任务 | 固定流程自动化 | 兼容性测试 | Chrome 专用 |
我的看法:传统框架适合你知道每一步要干什么的场景,browser-use 适合你知道要达成什么目标但不确定中间步骤的场景。
举个例子:我要从某个网站抓取数据,如果网站结构固定,我用 Playwright 写 50 行代码,稳定跑一年。如果网站经常改版,我宁愿用 browser-use,改一下任务描述就行,不用改代码。
两者不冲突,可以互补。我现在是 Playwright 做核心流程,browser-use 做边缘场景和快速原型。
写在最后
browser-use 的真正价值不在于替代传统自动化框架,而在于把“浏览器操作”这件事的门槛降到了自然语言层面。
以前写一个爬虫要分析 DOM、调试 XPath、处理反爬。现在?“帮我把这个页面的数据整理成表格”——AI 替你干了。
但也要清醒:它不适合高频率、高可靠性的生产流水线。LLM 的不确定性意味着偶尔会“抽风”,比如点错按钮、填错位置。我跑了大概 200 次任务,成功率在 85% 左右。对于内部工具来说够用了,但如果是面向客户的产品,还是得用传统方案。
工具是手段,不是目的。知道什么时候用哪个,比纠结哪个更强更重要。
如果你已经用起来了,或者有更骚的操作,欢迎来聊。我最近在研究怎么把 browser-use 和 RPA 结合起来,有兴趣的可以交流。