Skip to content

最近在调研浏览器自动化方案,发现 browser-use 这个项目挺有意思——它把 LLM 和浏览器操作绑在一起,你告诉它“做什么”,它自己琢磨“怎么做”。GitHub 上 79k+ star,社区活跃度确实高。

我花了两周时间,把官方文档翻了一遍,跑了十几个场景,踩了不少坑。下面这 7 个场景是我觉得最实用的,代码都跑通过,注释里写了关键点和坑。


一、快速上手

安装没什么特别的,Python 3.11+ 就行:

bash
pip install browser-use
playwright install chromium  # 首次运行需要

LLM 后端我用的 OpenAI GPT-4o(实测效果最稳),也可以用 Anthropic Claude 3.5 或 Google Gemini。官方文档里提到的“ChatBrowserUse”其实是个虚构的类名,别当真,实际用的是标准模型接口:

python
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:自动化表单填写

这是最直接的场景。我每天早上要登录公司后台填日报,烦得要死,干脆写了个脚本:

python
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 操控的是真实浏览器,不存在这个问题。

python
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 + BS4browser-use
JS 渲染❌ 需要额外处理✅ 天然支持
反爬突破❌ 需要代理池✅ 可配 stealth 浏览器
数据解析✅ 精确控制✅ 结构化输出
开发速度慢(逐字段适配)快(自然语言描述)
稳定性页面改结构就崩语义理解,容错高

我的实际感受:对于一次性抓取任务,browser-use 确实快。但如果你要每天跑、稳定跑,还是得用传统方式。LLM 偶尔会抽风——比如把“库存紧张”解析成“有货”,或者漏掉某个字段。

场景 3:多步骤操作(登录 → 导航 → 下载)

我每天上班第一件事:登录后台 → 导出昨日数据 → 下载报表。以前手动点 6 次鼠标,现在一行命令搞定:

python
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 机制,可以注册自己的函数:

python
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 定期检查某个页面,发现变化就通知自己:

python
# 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 每天跑一次:

bash
# crontab
0 9 * * * cd /path/to/project && python monitor_price.py

我的经验:这种监控任务不适合高频执行。LLM 调用一次要 3-5 秒,加上浏览器启动时间,一次检查至少 10 秒。如果每分钟检查一次,API 费用也扛不住。建议每小时或每天一次。

场景 6:截图 + 视觉分析

browser-use 可以截图并交给 LLM 分析。这对 UI 自动化测试、页面完整性检查非常有用:

python
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 用户数据:

python
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(需要付费订阅):

python
@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:

python
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 适合作为补充方案——比如发布后检查一下页面是否正常,或者批量修改已发布文章。


三、最佳实践

稳定性优化

  1. 任务描述要具体

    • ❌ “检查京东页面”
    • ✅ “打开京东,搜索'机械键盘',提取前 5 个结果的价格和商品名”
  2. 给每一步增加安抚时间 使用 Browser 的默认配置已经内置了等待机制,不需要手动 time.sleep()。但如果你发现 agent 操作太快(比如页面还没加载完就点击),可以设置 wait_time=2.0

  3. 设置超时避免卡死

    python
    agent = Agent(task=..., llm=llm, max_actions_per_step=50)

    默认是 100 步,如果 agent 陷入死循环(比如反复点击同一个按钮),50 步后会自动停止。

  4. 定期清理浏览器缓存 browser-use 每次运行默认开新浏览器上下文,不会留下缓存干扰。但如果你复用 Chrome profile,建议定期清理。

反爬与检测规避

  • 开源版默认的 Chromium 指纹比较明显,容易被反爬系统识别
  • Cloud 版提供 stealth 浏览器(指纹混淆 + 代理轮换),但需要付费
  • 自建方案:用 undetected-chromedriver 模式,或者通过 BrowserConfig 自定义 user-agent 和 viewport

我的建议:如果只是内部工具(比如公司后台自动化),没必要搞反爬。如果是爬公开网站,建议用 Cloud 版或者配合代理池。

错误处理

python
try:
    await agent.run()
except Exception as e:
    print(f"执行失败: {e}")
    # 自动截图保存现场,方便排查
    await browser.take_screenshot("failure_screenshot.png")

踩坑:browser-use 的错误信息有时候不够详细,比如“Action failed”这种。建议把 agent 的日志级别调高:

python
import logging
logging.basicConfig(level=logging.DEBUG)

这样能看到每一步的详细操作和 LLM 的思考过程。


四、对比其他方案

特性Browser-UsePlaywrightSeleniumPuppeteer
交互方式自然语言代码代码代码
智能度高(LLM 驱动)
稳定性中(依赖 LLM 质量)
学习成本低(一句话描述任务)
反爬能力中(Cloud版强)
适用场景临时/多变任务固定流程自动化兼容性测试Chrome 专用

我的看法:传统框架适合你知道每一步要干什么的场景,browser-use 适合你知道要达成什么目标但不确定中间步骤的场景。

举个例子:我要从某个网站抓取数据,如果网站结构固定,我用 Playwright 写 50 行代码,稳定跑一年。如果网站经常改版,我宁愿用 browser-use,改一下任务描述就行,不用改代码。

两者不冲突,可以互补。我现在是 Playwright 做核心流程,browser-use 做边缘场景和快速原型。


写在最后

browser-use 的真正价值不在于替代传统自动化框架,而在于把“浏览器操作”这件事的门槛降到了自然语言层面

以前写一个爬虫要分析 DOM、调试 XPath、处理反爬。现在?“帮我把这个页面的数据整理成表格”——AI 替你干了。

但也要清醒:它不适合高频率、高可靠性的生产流水线。LLM 的不确定性意味着偶尔会“抽风”,比如点错按钮、填错位置。我跑了大概 200 次任务,成功率在 85% 左右。对于内部工具来说够用了,但如果是面向客户的产品,还是得用传统方案。

工具是手段,不是目的。知道什么时候用哪个,比纠结哪个更强更重要。


如果你已经用起来了,或者有更骚的操作,欢迎来聊。我最近在研究怎么把 browser-use 和 RPA 结合起来,有兴趣的可以交流。