资讯详情

Browser Use 实战:大语言模型驱动浏览器自动化,从零搭建 AI Agent

📅 2026/10/20 8:19:10 | 华诺云谱 👁 阅读
Browser Use 实战:大语言模型驱动浏览器自动化,从零搭建 AI Agent
大概每个玩过自动化的人都冒出过类似的念头能不能直接用大白话指挥浏览器干活Browser Use 这个开源项目就是冲着这个需求来的。它把大语言模型接到 Playwright 上让模型自己看页面、自己决定下一步点哪里、输入什么、翻到哪一页直到任务完成。说白点就是从人写死每一步脚本变成人描述目标AI 自己拆解执行。我花了两天时间从零搭建跑通下面把部署步骤、核心原理和实际使用中的坑一次性讲清楚。这篇文章适合想做自动化测试、数据采集、日报生成这类需求的朋友也适合第一次接触 AI Agent 的开发者拿来当入门参考。1. 这个项目到底在解决什么问题1.1 传统浏览器自动化的痛点在哪里传统的自动化测试、爬虫工具比如 Selenium、Puppeteer、Playwright其实已经很成熟了。但它们的核心工作模式是确定性脚本你要告诉浏览器先打开 A 页面等待某个元素出现点击那个按钮再读取某个表格。每一步的选择器、等待时间、异常处理都要人提前写好。问题也出在这里。页面结构改一次选择器失效脚本跟着报废遇到动态加载、弹窗、iframe、懒加载脚本的复杂度直接翻倍写一套完整流程要花大量时间调试尤其是登录态维护和反爬对抗这两件事能把人耗到没脾气。更麻烦的是传统脚本面对的页面环境稍有变化整个链路就断了而且断的方式千奇百怪经常是半夜跑任务的时候才暴露出来。说到底传统自动化的重心在执行而决策从来都靠人来做。人必须预判所有可能出现的页面状态把每一种情况都写进分支逻辑里。页面稍微改版决策链就断了。1.2 AI 控制浏览器把决策交给大模型Browser Use 的思路不一样。它不要求你写清楚每一步怎么操作只需要给一句任务描述。比如打开某新闻网站把首页前十篇文章的标题和链接整理成表格输出。剩下的步骤——判断在哪里点击、输入什么关键词、翻页到什么时候、数据提取到什么程度——全部由大模型实时决策。模型每做一个动作之前会拿到当前页面的状态压缩后的 DOM、可交互元素列表、必要时候还有整页截图然后生成下一步动作指令。Browser Use 再把这些指令翻译成真正的浏览器操作。这个观察-思考-行动-复检的循环不断重复直到模型认为任务已完成。我第一次跑通的时候看着模型自己在页面上一步一步把任务做完说实话还是有点震撼——它真的在看页面、想下一步、操作浏览器而不是按着写死的脚本机械执行。这个体验和传统自动化工具完全不同。1.3 它能做什么、不能做什么我实际用下来比较适合的场景有这么几类场景具体例子推荐程度信息检索与数据采集搜索关键词、翻页、提取结构化内容高表单填写与流程操作登录、提交、后台审批点击中高页面状态监控定时访问页面检查指标变动中自动生成报告采集完成后直接让模型做二次加工高但也要说清楚它的边界。遇到高强度反爬、需要浏览器指纹对抗、复杂滑块验证码的场景它并不比传统工具强多少反而因为每次页面快照都要过模型成本高得多。高并发大规模采集也不要首选它token 消耗扛不住。长时间无人值守跑任务必须有日志和告警机制兜底不能指望它永不犯错。2. 搭建部署全流程速通2.1 环境准备与依赖安装Python 版本建议用 3.11 或更高太低容易撞上依赖兼容问题。我习惯先用虚拟环境隔离开避免把系统环境搞乱。mkdir browser-use-demo cd browser-use-demo python3 -m venv venv source venv/bin/activate pip install browser-use安装时会把 Playwright、LangChain 生态的相关包一起带进来。这里有个坑browser-use 目前和 LangChain 版本的绑定比较紧如果你的项目里已经有其他版本的 LangChain建议放在干净环境里装否则容易跑着跑着突然报错。接下来要安装浏览器内核playwright install chromium这个过程要下载浏览器二进制文件网络不好时容易卡住。卡住的话可以配置 Playwright 的下载镜像源再重试具体配置方式网上搜一下就有。如果你是在纯净服务器上部署还要再跑一条命令安装系统依赖库playwright install-deps这一步在服务器上基本是必须的否则启动浏览器时会报缺少共享库比如 libnss3 之类。本地开发机一般没问题但服务器环境一定要记得跑。2.2 模型接入配置Browser Use 的大模型接入层是基于 LangChain 的 ChatModel所以只要 LangChain 能接的模型它基本都能用。官方支持 OpenAI 系模型、Claude、Gemini也支持本地的 Ollama 以及各类 OpenAI 兼容接口。配置有两种方式。第一种是环境变量export OPENAI_API_KEY你的key export OPENAI_BASE_URLhttps://api.example.com/v1注意OPENAI_BASE_URL是可选配置只有当你使用 OpenAI 兼容接口时才需要设置例子里的地址是占位符换成实际服务商的地址即可。第二种方式是我更推荐的做法直接在代码里把模型对象传给 Agentfrom langchain_openai import ChatOpenAI llm ChatOpenAI( modelgpt-4o, temperature0, max_tokens4096, )这样配置一目了然也不容易出现环境变量覆盖的问题。关于模型选择我的建议比较直接预算允许就优先用支持视觉的大模型。因为 Browser Use 在识别页面元素、判断哪些区域可点击时视觉能力非常关键。纯文本模型也能跑但遇到复杂页面时元素定位的准确率会明显下降任务失败率随之上升。2.3 跑通第一个 Agent一个最小可用的完整脚本长这样import asyncio from browser_use import Agent, Browser, BrowserConfig from langchain_openai import ChatOpenAI async def main(): browser Browser(configBrowserConfig(headlessFalse)) llm ChatOpenAI(modelgpt-4o, temperature0) agent Agent( task打开 example.com把页面主标题的文本内容返回给我, llmllm, browserbrowser, ) result await agent.run(max_steps10) print(最终结果) print(result) await browser.close() if __name__ __main__: asyncio.run(main())运行后控制台会逐步打印模型的思考过程和动作。我截取一段典型日志来说明thought模型解释它准备怎么做比如页面加载完成我看到了主标题元素直接提取文本action实际执行的操作比如 extract_text或者点击某个带编号的元素current_state每次操作后的页面状态摘要最终 result 对象里包含模型整理后的输出。这一个任务跑通说明整个链路已经没问题了后面再复杂的任务都是在这个基础上扩展。3. 核心机制与关键配置拆解3.1 Agent 的工作循环观察-思考-行动-复检Browser Use 的 Agent 运行机制非常像一个人操作浏览器的流程拆成四步来看第一步观察。浏览器控制器把当前页面转成 LLM 能理解的快照。页面 DOM 会被压缩成带索引的文本列表同时把可见区域的可点击元素、输入框、按钮标记出来。第二步思考。LLM 收到任务和快照后给出一个动作决策也就是要执行什么操作、参数是什么。这一步模型会参考任务目标判断当前状态距离目标还有多远。第三步行动。Agent 调用对应的工具比如点击、输入、滚动、切换标签页由 Playwright 真正执行。第四步复检。执行完操作后重新抓取页面状态判断任务是否完成。没完成就回到第二步继续循环。整个循环由max_steps参数控制限制最大步骤数。没有这个限制模型遇到复杂页面可能反复试错几十次token 消耗会非常难看。3.2 LLM 是如何看懂页面的这是 Browser Use 最核心的技术点之一。拿点击登录按钮这个操作举例模型并不知道登录按钮在屏幕上的像素坐标它看到的是浏览器提取出来的一份元素清单。清单里每个可交互元素都带一个索引编号。大致长这样12: 登录按钮文本登录标签button13: 用户名输入框placeholder请输入用户名模型根据这些文本信息决定点击索引 12 的元素Browser Use 再把索引映射回真实 DOM 节点执行点击。对于支持视觉的模型Browser Use 还会截取页面截图并在截图上的可交互元素外框画出标记。模型可以直接看到页面布局判断哪些元素该优先交互。这也是为什么视觉模型整体效果更好——很多页面布局信息在文本 DOM 里是体现不出来的比如某个按钮被遮挡、某个区域明显不可点击。3.3 关键参数与调优建议我整理了常用的配置参数附上实测建议参数作用建议值max_steps限制单次任务的最大步骤数简单任务 10复杂任务 30~50temperature模型随机性设为 0避免动作不稳定headless是否无头运行调试用 False生产用 Truemax_input_tokens限制每次发送给模型的最大 token 数默认足够超长页面再调wait_time页面加载等待时间动态页面适当加大浏览器配置项也值得注意browser Browser(configBrowserConfig( headlessTrue, keep_aliveFalse, disable_security_checksTrue, extra_chromium_args[--window-size1920,1080] ))窗口尺寸建议设大一点因为页面截图是按窗口大小裁剪的窗口小了会漏掉大量内容直接影响模型判断。disable_security_checksTrue可以关闭一些浏览器安全拦截减少误操作。3.4 模型选型与成本控制Token 消耗大头其实不是模型思考而是每次循环发送的页面快照。一个复杂页面的 DOM 压缩文本可能有几千 token再加上截图单步消耗可能达到 2k 到 5k token。一个 30 步的任务总消耗轻松突破十万 token。我的建议是先拿视觉模型验证任务链路确认可行后再考虑换轻量模型。如果任务页面结构固定、不需要视觉判断纯文本模型确实能省不少钱。本地 Ollama 我可以负责任地说简单任务能跑复杂页面基本带不动——上下文窗口太小模型推理能力也跟不上很容易陷入无意义的循环。4. 实操场景从任务到结果的完整流程4.1 任务描述的设计原则任务描述直接决定成功率。我踩过的第一个坑就是把任务写得太含糊。比如查一下最近有什么新闻模型不知道范围、不知道输出格式最后可能只返回一句话敷衍了事。好的任务描述应该包含三个要素明确的操作范围在哪个网站、搜索什么关键词、翻几页明确的数据对象要提取哪些字段、保存成什么格式明确的终止条件任务做到哪一步算完成我做个对比差帮我查一下某公司最近的产品动态好打开某科技资讯网站搜索AI 助手关键词把搜索结果第 1 页中标题包含AI的文章标题和发布时间提取出来以 JSON 格式输出看起来只是多了几个限定词实际运行效果差距非常大。模型需要边界边界越清楚它越不会跑偏也越少做无用功。4.2 一个带多步交互的完整任务以登录某模拟数据平台并导出当日数据为例。这里我用占位域名 example-dashboard.com 代替真实地址。import asyncio from browser_use import Agent, Browser, BrowserConfig from langchain_openai import ChatOpenAI task 1. 打开 https://example-dashboard.com/login 2. 输入用户名 demo_user 和密码 demo_password 3. 点击登录按钮等待跳转到数据概览页 4. 找到今日数据表格提取前 5 行数据 5. 将提取的数据按 Markdown 表格格式返回 async def main(): browser Browser(configBrowserConfig(headlessFalse)) llm ChatOpenAI(modelgpt-4o, temperature0) agent Agent(tasktask, llmllm, browserbrowser) result await agent.run(max_steps20) print(result) await browser.close() if __name__ __main__: asyncio.run(main())执行过程大致是第 1 到 3 步模型识别输入框和登录按钮依次填入并点击第 4 到 5 步模型读取页面上的表格内容转换为 Markdown。最终 result 里就是整理好的表格。这里有个注意点如果目标平台有登录验证码Agent 大概率处理不了。这时候要么在任务描述里明确告诉模型登录环节已经帮你完成要么在浏览器配置里准备好登录态跳过登录直接进系统。4.3 处理动态加载、iframe 和弹窗真实网页远比 demo 复杂我列几个高频场景的处理经验。动态加载数据需要等待。当模型点击加载更多后页面内容不会立即出现。Browser Use 会自动等待网络空闲和元素可见但碰到慢接口还是会失败。稳妥的办法是在任务描述里加一句点击后等待 2 秒再继续给模型一个明确的等待预期。iframe 中的元素容易漏掉。默认情况下 Agent 抓取的是主页面的 DOM如果目标元素在 iframe 里它可能根本看不到。目前比较有效的办法是在任务描述里直接告诉模型目标内容在一个嵌入的框架中部分情况下模型会先切换内容再操作但不敢说百分百成功。弹窗和新人引导也很烦。常见做法是让模型先关闭弹窗再继续主流程。也可以配合上一节说的disable_security_checksTrue减少不必要的浏览器拦截。4.4 查看执行过程与日志开发阶段强烈建议用有头模式也就是headlessFalse让浏览器窗口显示出来。同时开启日志import logging logging.basicConfig(levellogging.INFO)这样每一步的 thought 和 action 都会打印到控制台。出问题时看日志比瞎猜快得多。我调试的时候基本都是盯着日志看模型当时的思考逻辑很快就能定位是任务描述的问题、模型判断的问题还是页面本身的问题。5. 常见问题与避坑指南5.1 安装阶段的高频问题我实际遇到和身边朋友踩过的坑汇总成三条第一playwright install下载极慢。这个几乎人人会遇到解决办法就是配置下载镜像源让浏览器内核从镜像站下载。配置环境变量之后再跑playwright install即可。第二运行时报缺少共享库。典型报错是libnss3.so找不到。解决办法是执行playwright install-deps它会自动安装系统依赖。如果是容器环境注意基础镜像要选带完整依赖的版本。第三LangChain 版本冲突。browser-use 对 langchain 的版本有要求如果报错说找不到某个类多半是版本不对。建议在虚拟环境里全新安装不要和已有项目混在一起。5.2 Token 消耗为什么这么大、怎么控制Token 消耗大头是每次循环发送的页面快照。我跑一个中等复杂度的任务30 步左右总消耗在十万 token 级别这个量级是正常的。控制方法有几个优先选择结构简单的页面采集前先精简流程不打开无关标签页用max_steps限制步骤数避免模型反复试错在任务描述里明确失败终止条件比如如果第一步打开失败直接结束并报告错误能省下大量无意义重试简单固定任务用轻量模型复杂任务再用视觉模型5.3 稳定性和生产化建议连续跑十几个任务之后我总结出影响稳定性的几个因素。登录态是最容易断的生产环境建议使用持久化浏览器上下文把用户 profile 保存下来避免每个任务重新登录。同一站点的高频请求容易触发风控任务间隔要合理。长时间无人值守前一定要做日志和告警别指望机器人永远不出错。另外每个任务最好独立 Browser 实例不要多个任务共用一个浏览器。一旦某个任务把页面状态搞乱其他任务全都会跟着遭殃。5.4 快速排查速查表问题可能原因解决办法启动后白屏Playwright 浏览器启动失败执行 playwright install-deps模型返回空结果任务描述太模糊增加边界条件和输出格式要求点击无效页面元素未加载完成加大等待时间任务里明确等待动作Token 爆掉页面快照过大、步骤过多简化页面、减少步骤、换轻量模型任务中途断连网络链路不稳定或浏览器崩溃检查网络增加日志设置失败重试登录态丢失浏览器上下文不持久启用持久化 profile我在实际使用中感受最深的一点是Browser Use 最让人省心的地方是把人要从头盯到尾变成了人只负责定目标和收结果。但别把它想成万能遥控器——页面的复杂度、模型的能力、token 的成本三者互相牵制。先用简单任务把链路跑通再逐步加复杂场景是最靠谱的上手方式。后续如果再玩深一点我打算用 Browser Use 结合定时任务做一个每天早上自动汇总行业资讯的小流程再把结果推到内部机器人通知。你也可以顺着这个方向试试工业界那些AI 帮你巡检网页的需求本质上都是这条路。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑