上周五下班前运营同事扔过来一个需求帮我从20个网站上把竞品价格抓下来每天一次。我看了一眼那些网站有的要登录有的价格藏在弹窗里有的还有验证码。写 Selenium 脚本光处理登录态就得搞半天。写 Playwright动态渲染页面调试到头秃。后来我试了 browser-use。一个 Python 库8万多 GitHub stars干的事情简单粗暴你用自然语言告诉 AI 要做什么它自己去操作浏览器。不用写 CSS 选择器不用处理页面加载等待AI 自己看页面、点按钮、填表单。花了一个多小时搞定记录一下过程。安装和环境配置browser-use 需要 Python 3.11 或更高版本。用 uv 管理环境最省事# 创建虚拟环境 pip install uv uv venv --python 3.12 source .venv/bin/activate # 安装 browser-use 和浏览器内核 uv pip install browser-use uvx browser-use installuvx browser-use install会自动下载 Chromium不用自己折腾浏览器驱动。接下来配置 API Key。browser-use 支持多家 LLM我用的是 Gemini免费额度够用# 创建 .env 文件 touch .env echo GOOGLE_API_KEY你的key .env也可以用 OpenAI 或 Anthropic换个环境变量就行# OpenAI OPENAI_API_KEY你的key # Anthropic ANTHROPIC_API_KEY你的key第一个例子让 AI 去搜东西先跑个最简单的确认环境没问题from browser_use import Agent, ChatGoogle from dotenv import load_dotenv import asyncio load_dotenv() async def main(): llm ChatGoogle(modelgemini-flash-latest) agent Agent( task打开百度搜索browser-use github告诉我第一个结果的标题, llmllm ) result await agent.run() print(result) if __name__ __main__: asyncio.run(main())运行后会弹出一个 Chrome 窗口你能看到 AI 在操作打开百度、输入搜索词、点搜索、读取结果。整个过程大概15秒。第一次跑的时候我盯着屏幕看了好几遍——它真的在自己打字、自己点按钮。跟之前写的那些脚本完全是两回事。真实场景自动填写表单搜索太简单了。来个实际的自动登录一个后台系统填写表单提交数据。from browser_use import Agent, Browser, BrowserConfig, ChatGoogle from dotenv import load_dotenv import asyncio load_dotenv() async def main(): # 配置浏览器用自己本地的 Chrome保留登录态 browser Browser(configBrowserConfig( chrome_instance_path/Applications/Google Chrome.app/Contents/MacOS/Google Chrome, disable_securityTrue )) llm ChatGoogle(modelgemini-flash-latest) agent Agent( task 1. 打开 http://internal.example.com/admin 2. 如果需要登录用户名填 admin密码填 test123 3. 点击左侧菜单的数据录入 4. 在表单里填写名称测试产品价格99.9分类选择电子产品 5. 点提交按钮 6. 确认提交成功 , llmllm, browserbrowser ) result await agent.run() print(result) if __name__ __main__: asyncio.run(main())这里有几个值得说的配置chrome_instance_path指定用本地 Chrome 而不是内置 Chromium。好处是能复用你已有的登录状态和 Cookie不用每次重新登录。disable_security关掉一些安全限制。测试环境可以开生产环境别开。task 用自然语言写不用写 XPath 或 CSS 选择器。AI 自己看页面结构找到对应的元素。你说点击左侧菜单的数据录入它就能找到那个菜单项。踩坑记录跑了一周遇到几个问题记下来供参考。坑1页面加载慢AI 太着急有些内部系统加载要三四秒AI 还没等页面渲染完就开始点了结果点到空白处。解决办法是在 Agent 初始化时加个等待参数agent Agent( task..., llmllm, browserbrowser, max_actions_per_step3, # 每步最多执行3个动作防止操作太快 )另外可以在 task 里直接写等页面加载完再操作AI 会自己判断。坑2下拉菜单选不中有些前端框架的下拉菜单比如 Ant Design 的 Select实际的选项列表是动态插入到 body 下面的不在原来的位置。AI 有时候找不到。我的做法是把 task 写得更具体点击分类下拉框等弹出选项列表后在列表中找到并点击电子产品。描述越细成功率越高。坑3Token 消耗比预想大每一步操作browser-use 都会把当前页面的可交互元素列表发给 LLM。一个复杂页面可能有上百个按钮、链接、输入框一次就消耗几千 token。20个网站跑一轮Gemini Flash 模型大概花 $0.3。用 GPT-4 的话要贵好几倍。建议简单任务用 Gemini Flash 或 GPT-4.1-mini复杂页面登录验证码多步操作用 Claude Sonnet 或 GPT-4.1别用太贵的模型跑日常重复任务坑4偶尔会死循环AI 操作失败后会自动重试但有时候它不知道自己在重复同一个错误动作。加个 max_steps 限制agent Agent( task..., llmllm, max_steps20, # 最多20步超了就停 )批量任务用循环跑多个网站回到开头的需求批量抓竞品价格。我写了个循环每个网站一个 taskimport asyncio import json from browser_use import Agent, ChatGoogle from dotenv import load_dotenv load_dotenv() SITES [ { url: https://shop-a.example.com/product/123, task: 打开这个页面找到商品价格只返回数字价格 }, { url: https://shop-b.example.com/item/456, task: 打开这个页面找到标价只返回数字 }, # ... 更多网站 ] async def scrape_price(site): llm ChatGoogle(modelgemini-flash-latest) agent Agent( taskf访问 {site[url]}{site[task]}, llmllm, max_steps10 ) result await agent.run() return {url: site[url], price: str(result)} async def main(): results [] for site in SITES: try: r await scrape_price(site) results.append(r) print(f完成: {r[url]} - {r[price]}) except Exception as e: print(f失败: {site[url]} - {e}) results.append({url: site[url], price: 获取失败}) await asyncio.sleep(5) # 每个网站之间等5秒 with open(prices.json, w) as f: json.dump(results, f, ensure_asciiFalse, indent2) if __name__ __main__: asyncio.run(main())这里没用 asyncio.gather 并发跑是因为多个浏览器窗口同时操作会互相干扰。老老实实串行稳定性好很多。跟传统方案的对比我之前用 Playwright 写过类似的抓取脚本。对比一下Playwright 脚本browser-use开发时间每个网站1-2小时每个网站5-10分钟维护成本页面改版就得改代码改 task 描述就行处理动态页面要手动等待判断AI 自动处理成功率稳定但僵硬灵活但偶尔犯傻运行成本0本地跑API 调用费用适合场景固定流程、高频任务多变页面、低频任务结论高频固定任务还是 Playwright 好写死的脚本又快又稳。browser-use 适合那种20个不同网站各抓一次的场景省的是开发时间。生产环境部署如果要定时跑browser-use 提供了 sandbox 模式可以在云端运行from browser_use import Browser, sandbox, ChatBrowserUse from browser_use.agent.service import Agent import asyncio sandbox(cloud_profile_idyour-profile-id) async def daily_task(browser: Browser): agent Agent( task你的任务描述, browserbrowser, llmChatBrowserUse(), ) await agent.run() if __name__ __main__: asyncio.run(daily_task())不过 sandbox 模式需要付费。我自己是用 crontab 本地 Chrome 跑的每天早上9点执行一次结果写到 JSON 文件里再用另一个脚本推送到飞书群。browser-use 的 GitHub 仓库https://github.com/browser-use/browser-use文档https://docs.browser-use.com需要 Python 3.11建议用 uv 管理环境。Gemini Flash 是性价比最高的模型选择新手可以先用这个试。