找回密码
 立即注册
首页 业界区 业界 Browser-use:基于 Python 的智能浏览器自动化 AI 工具 ...

Browser-use:基于 Python 的智能浏览器自动化 AI 工具调研与实战

钦娅芬 2025-6-2 22:55:55
Browser-use:基于 Python 的智能浏览器自动化 AI 工具调研与实战

一、概述

Browser-use 是一个旨在将 AI “智能体”(Agents)与真实浏览器进行交互的 Python 库,可以轻松实现浏览器自动化。在配合 LLM(如 GPT 系列)使用时,浏览器-use 能够让你的智能体发起对网页的访问、操作页面元素、收集信息、执行脚本等,从而扩展 AI 应用的落地场景。

  • GitHub: browser-use/browser-use
  • 官网: browser-use.com
  • 文档: docs.browser-use.com
目前 Browser-use 最低需要 Python 3.11 及以上,才能正常使用其封装的 Playwright 功能。
1. 技术栈:


  • LangChain(AI Agent框架)
  • Playwright(浏览器自动化)
  • dotenv(环境变量 key)
  • 异步I/O架构
2. 流程图

1.png

browser-use:语言模型 -> 决策/控制 -> 浏览器执行 -> 数据回传 -> 模型后处理
二、核心特性

1. 简单的 Agent 接口

通过 Agent 类即可快速创建带浏览器交互能力的智能体,赋能 LLM 与网页之间的复杂操作。
  1. agent = Agent(
  2.         task="打开 https://cn.vuejs.org/guide/essentials/computed,获取页面里所有的 h2 标签文本及所有的 a 标签文本(以及它的 href)",
  3.         llm=llm,
  4.     )
  5. result = await agent.run()
复制代码
2. 多语言模型支持

可轻松集成 LangChain 提供的各类 LLM(如 OpenAI、Anthropic、Cohere 等)进行高级任务管理。
模型所属/类型GPT-4oOpenAIClaudeAnthropicAzureAzure OpenAIGeminiGoogle Generative AIDeepSeek-V3DeepSeekDeepSeek-R1DeepSeekOllama本地模型 (需安装 Ollama)3. 基于 Playwright

默认使用 Playwright 进行浏览器的无头启动、页面操作和渲染控制;对常见网页交互场景提供友好的抽象。
4. 云端版 & 本地版

除了本地安装运行外,Browser-use 也提供托管版本,可以直接在云端执行,无需配置本地环境。
三、安装与环境配置

1. Python 版本


  • 需要 Python 3.11 或更高版本。
  • 推荐在独立虚拟环境(venv)或管理工具(如 uv)中配置环境。
1.1. 推荐使用 pyenv 管理 python

Github:https://github.com/pyenv/pyenv
  1. brew install pyenv
  2. pyenv install 3.11.9
复制代码
  1. # pyenv 根目录
  2. export PYENV_ROOT="$HOME/.pyenv"
  3. export PATH="$PYENV_ROOT/bin:$PATH"
  4. # 初始化
  5. eval "$(pyenv init -)"
复制代码

2. 安装方法

2.1. 安装 browser-use
  1. pip3 install browser-use
复制代码
2.2. 安装 Playwright
  1. playwright install
复制代码

  • 此操作会自动下载 Chromium 无头浏览器,用于后续的浏览器自动化。
2.3. 配置 LLM API Keys(可选)


  • 在 .env 文件中填写相应的 OPENAI_API_KEY=、ANTHROPIC_API_KEY= 等 Key。
  1. OPENAI_API_KEY=sk-xxxxxxx
复制代码

  • 如果使用其他 LLM,需要参考 LangChain 文档或对应服务提供的说明进行配置。
四、基础配置

1. Agent

1.1. Agent 参数

参数名称类型默认值说明taskstr代理需要执行的任务描述。(必传)llmBaseChatModel (LangChain Model)主语言模型,执行对话和工具调用。(必传)controllerController 实例默认
Controller自定义函数/工具调用的注册表use_visionboolTrue是否启用视觉能力(截图+分析)。如模型支持图像输入,可显著提高网页理解;也会产生额外 token 成本。
Deepseek 需要设置为 Falsesave_conversation_pathstr若指定,则会将对话历史保存在该路径下,用于调试或审计。system_prompt_classtype (自定义 System Prompt 类)默认Prompt自定义系统提示词逻辑browserBrowser (Browser-use 实例)重用已创建的 Browser 实例;若不提供,则 Agent 每次 run() 时会自动创建并关闭新的浏览器。browser_contextBrowserContext (Playwright 实例)使用已有的浏览器上下文 (Context)。适合需要维护持久会话 (cookies/localStorage) 的场景。max_stepsint100允许 Agent 执行的最大步骤数,防止死循环或无限操作。planner_llmBaseChatModel__规划用语言模型,与主 LLM 分开;可用较小/便宜模型处理高层策略。use_vision_for_plannerboolTruePlanner 是否能使用视觉功能(若主 LLM 已开启视觉,这里可独立关闭以节省资源)。planner_intervalint1Planner 模型执行间隔。即每多少步调用一次 Planner 作重新规划。message_contextstr额外的任务/上下文信息,辅助 LLM 更好理解或执行任务。
+ 03/28 文档已删除字段initial_actionslist[dict]初始化时要执行的动作列表(无需经 LLM 调用),格式为 {action_name: {...}}。max_actions_per_stepint10每个步骤里可执行的最大动作数,用于控制 Agent 过度频繁操作。max_failuresint3允许 Agent 失败的最大次数,超过则停止任务。retry_delayint (秒)10当遇到限流 (rate limit) 或可重试的错误时,等待多少秒后再次尝试。generate_gifbool 或 str (路径)False是否录制浏览器过程生成 GIF。为 True 时自动生成随机文件名;为字符串时将 GIF 存储到该路径。1.2. Agent 执行流程图


2. Browser 配置

Browser-use 提供两个主要配置类:

  • BrowserConfig:控制浏览器整体行为
  • BrowserContextConfig:控制单个上下文(浏览器标签页/会话)的行为
官方推荐:「1 个 Agent 对应 1 个 Browser 和 1 个 Context」,以增强稳定性和开发体验。
2.1. BrowserConfig
  1. from browser_use import BrowserConfig
  2. config = BrowserConfig(
  3.     headless=False,
  4.     disable_security=True
  5. )
  6. browser = Browser(config=config)
复制代码
参数名称类型默认值说明headlessboolFalse是否启用无头模式(不显示 UI)disable_securityboolTrue是否禁用浏览器安全功能(如跨域限制)extra_browser_argslist[str][]启动浏览器时的额外参数proxydict / str设置代理,遵循 Playwright 规范new_context_configBrowserContextConfig新建默认的新上下文配置wss_urlstrWebSocket 连接地址,连接云端浏览器服务(如 browserbase、steel.dev)cdp_urlstrChrome DevTools 协议地址,连接本地 Chrome 实例chrome_instance_pathstr指定本地 Chrome 安装路径,保留登录状态和 Cookie
关闭所有正在运行的 Chrome2.2. BrowserContextConfig 配置
  1. from browser_use.browser.context import BrowserContextConfig
  2. config = BrowserContextConfig(
  3.     cookies_file="path/to/cookies.json",
  4.     wait_for_network_idle_page_load_time=3.0,
  5.     browser_window_size={'width': 1280, 'height': 1100},
  6.     locale='en-US',
  7.     user_agent='Mozilla/5.0...',
  8.     highlight_elements=True,
  9.     viewport_expansion=500,
  10.     allowed_domains=['google.com', 'wikipedia.org'],
  11. )
复制代码
参数名称类型默认值说明minimum_wait_page_load_timefloat0.5捕获网页状态前的最小等待时间wait_for_network_idle_page_load_timefloat1.0等待网络空闲时间,可提高到 3-5s 以兼容慢速网站maximum_wait_page_load_timefloat5.0页面加载的最长等待时间browser_window_sizedict浏览器窗口大小,适配大多数 UI 和横幅localestr设置语言/地区(如 zh-CN, en-GB),影响语言头和格式user_agentstr自定义浏览器 User-Agenthighlight_elementsboolTrue是否高亮交互元素(调试用)viewport_expansionint500页面内容扩展范围(像素),影响哪些元素被 LLM 看到。-1 为全部,0 为仅视口内allowed_domainslist[str]限制代理访问的域名,若为空则不限制cookies_filestr加载持久化 Cookie 文件save_recording_pathstr保存操作录像的目录路径trace_pathstr保存 Trace 文件目录,命名为 {trace_path}/{context_id}.zip3. 输出内容

3.1. History 方法

方法说明urls()访问过的 URL 列表screenshots()截图路径列表action_names()执行的动作名称extracted_content()抽取到的内容errors()执行中出现的错误model_actions()所有动作及参数final_result()最终结果is_done()是否成功完成has_errors()是否有错误model_thoughts()LLM 推理过程action_results()所有动作结果3.2. 示例
  1. from pydantic import BaseModel
  2. from typing import List
  3. from dotenv import load_dotenv
  4. from browser_use import Agent, Controller
  5. from langchain_openai import ChatOpenAI
  6. import asyncio
  7. # Define the output format as a Pydantic model
  8. class Post(BaseModel):
  9.         post_title: str
  10.         post_url: str
  11. class Posts(BaseModel):
  12.         posts: List[Post]
  13. load_dotenv()
  14. controller = Controller(output_model=Posts)
  15. async def main():
  16.         task = '从掘金获取 Vue / React / AI 相关文章'
  17.         model = ChatOpenAI(model='gpt-4o')
  18.         agent = Agent(task=task, llm=model, controller=controller)
  19.         history = await agent.run()
  20.         result = history.final_result()
  21.         print('result--->', result)
  22.         print('history.urls()--->', history.urls())
  23.         # print('history.screenshots()--->', history.screenshots())
  24.         print('history.action_names()--->', history.action_names())
  25.         print('history.extracted_content()--->', history.extracted_content())
  26.         print('history.errors()--->', history.errors())
  27.         print('history.model_actions()--->', history.model_actions())
  28.         print('history.is_done()--->', history.is_done())
  29.         print('history.has_errors()--->', history.has_errors())
  30.         print('history.model_thoughts()--->', history.model_thoughts())
  31.         print('history.action_results()--->', history.action_results())
  32.         if result:
  33.                 parsed: Posts = Posts.model_validate_json(result)
  34.                 for post in parsed.posts:
  35.                         print('\n--------------------------------')
  36.                         print(f'Title:            {post.post_title}')
  37.                         print(f'URL:              {post.post_url}')
  38.         else:
  39.                 print('No result')
  40. if __name__ == '__main__':
  41.         asyncio.run(main())
复制代码
[code]result---> {"posts": [{"post_title": "vue3.5+deepseek+arco+markdown\u642d\u5efaweb\u7248\u6d41\u5f0f\u8f93\u51faAI\u6a21\u677f", "post_url": "https://juejin.cn/post/7486369696738017321"}, {"post_title": "\ud83d\ude80\ud83d\ude80\ud83d\ude80\u5c24\u96e8\u6eaa\u8fde\u53d1\u4e24\u6761\u63a8\u7279\u5899\u88c2\u63a8\u8350\u7684\u8fd9\u4e9b\u5e93\u4f60\u4e00\u5b9a\u8981\u77e5\u9053\uff01", "post_url": "https://juejin.cn/post/7484131071569772595"}, {"post_title": "\u524d\u7aef\u4f6c\u4eec\uff01\u584c\u623f\u4e86\uff01\u7528\u8fc7Element-Plus\u7684\u8fdb\u6765~", "post_url": "https://juejin.cn/post/7485966905418760227"}, {"post_title": "\u548c\u540e\u7aef\u5927\u6218\u4e09\u767e\u56de\u5408\u540e\uff0c\u5351\u5fae\u524d\u7aef\u8fd8\u662f\u9009\u62e9\u4e86\u81ea\u5df1\u5199excel\u5bfc\u51fa", "post_url": "https://juejin.cn/post/7447368539936587776"}, {"post_title": "\u4ece DeepSeek \u770b25\u5e74\u524d\u7aef\u7684\u4e00\u4e2a\u5c0f\u8d8b\u52bf", "post_url": "https://juejin.cn/post/7468323178931879972"}, {"post_title": "\ud83d\ude80\ud83d\ude80\ud83d\ude80\u5c24\u96e8\u6eaa\u8fde\u53d1\u4e24\u6761\u63a8\u7279\u5899\u88c2\u63a8\u8350\u7684\u8fd9\u4e9b\u5e93\u4f60\u4e00\u5b9a\u8981\u77e5\u9053\uff01", "post_url": "https://juejin.cn/post/7484131071569772595"}, {"post_title": "\u524d\u7aef\u4f6c\u4eec\uff01\u584c\u623f\u4e86\uff01\u7528\u8fc7Element-Plus\u7684\u8fdb\u6765~", "post_url": "https://juejin.cn/post/7485966905418760227"}, {"post_title": "\u548c\u540e\u7aef\u5927\u6218\u4e09\u767e\u56de\u5408\u540e\uff0c\u5351\u5fae\u524d\u7aef\u8fd8\u662f\u9009\u62e9\u4e86\u81ea\u5df1\u5199excel\u5bfc\u51fa", "post_url": "https://juejin.cn/post/7447368539936587776"}, {"post_title": "vue3.5+deepseek+arco+markdown\u642d\u5efaweb\u7248\u6d41\u5f0f\u8f93\u51faAI\u6a21\u677f", "post_url": "https://juejin.cn/post/7486369696738017321"}, {"post_title": "\u4ece DeepSeek \u770b25\u5e74\u524d\u7aef\u7684\u4e00\u4e2a\u5c0f\u8d8b\u52bf", "post_url": "https://juejin.cn/post/7468323178931879972"}, {"post_title": "\u6709\u4e86Trae\uff0c\u4eba\u4eba\u90fd\u662f\u7a0b\u5e8f\u5458\u7684\u65f6\u4ee3\u6765\u4e86", "post_url": "https://juejin.cn/post/7463397212120973375"}, {"post_title": "\u6b63\u5f0f\u5ba3\u6218\uff0cDeepSeek \u9876\u5f97\u4f4f\u5417\uff1f", "post_url": "https://juejin.cn/post/7464848482987704329"}, {"post_title": "\u7528 DeepSeek \u6253\u9020\u4f60\u7684\u8d85\u5f3a\u4ee3\u7801\u52a9\u624b", "post_url": "https://juejin.cn/post/7454888708588945443"}, {"post_title": "\u521a\u521a\uff0cDeepSeek \u89e3\u7b54\u4e86\u56f0\u6270\u6211\u4e94\u5e74\u7684\u6280\u672f\u95ee\u9898\u3002\u65f6\u4ee3\u786e\u5b9e\u53d8\u4e86\uff01", "post_url": "https://juejin.cn/post/7472248441454018575"}, {"post_title": "\u653e\u5f03\u6ca1\u7528\u7684\u672c\u5730\u90e8\u7f72\u6b8b\u8840\u7248DeepSeek\u5427\uff0c\u6559\u4f60\u5982\u4f55\u767d\u5ad6\u6ee1\u8840\u7248DeepSeek", "post_url": "https://juejin.cn/post/7466832084486914083"}]}history.urls()---> ['about:blank', 'https://juejin.cn/', 'https://juejin.cn/', 'https://juejin.cn/', 'https://juejin.cn/', 'https://juejin.cn/', 'https://juejin.cn/', 'https://juejin.cn/']history.action_names()---> ['go_to_url', 'input_text', 'click_element', 'extract_content', 'input_text', 'click_element', 'extract_content', 'input_text', 'click_element', 'extract_content', 'done']history.extracted_content()---> ['
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册