Browser-use:基于 Python 的智能浏览器自动化 AI 工具实战
Browser-use 是基于 Python 的 AI 浏览器自动化工具库,结合 LangChain 和 Playwright 实现智能体对网页的访问与操作。支持多种大模型(如 GPT、DeepSeek),需 Python 3.11+ 环境。文章涵盖安装配置、Agent 参数详解、Browser 配置、代码示例及常见问题解决,适合构建网页交互类 AI 应用。

Browser-use 是基于 Python 的 AI 浏览器自动化工具库,结合 LangChain 和 Playwright 实现智能体对网页的访问与操作。支持多种大模型(如 GPT、DeepSeek),需 Python 3.11+ 环境。文章涵盖安装配置、Agent 参数详解、Browser 配置、代码示例及常见问题解决,适合构建网页交互类 AI 应用。

Browser-use 是一个旨在将 AI'智能体'(Agents)与真实浏览器进行交互的 Python 库,可以轻松实现浏览器自动化。在配合 LLM(如 GPT 系列)使用时,Browser-use 能够让你的智能体发起对网页的访问、操作页面元素、收集信息、执行脚本等,从而扩展 AI 应用的落地场景。
目前 Browser-use 最低需要 Python 3.11 及以上,才能正常使用其封装的 Playwright 功能。
browser-use:语言模型 -> 决策/控制 -> 浏览器执行 -> 数据回传 -> 模型后处理
通过 Agent 类即可快速创建带浏览器交互能力的智能体,赋能 LLM 与网页之间的复杂操作。
agent = Agent(
task="打开 https://cn.vuejs.org/guide/essentials/computed,获取页面里所有的 h2 标签文本及所有的 a 标签文本(以及它的 href)",
llm=llm,
)
result = await agent.run()
可轻松集成 LangChain 提供的各类 LLM(如 OpenAI、Anthropic、Cohere 等)进行高级任务管理。
| 模型 | 所属/类型 |
|---|---|
| GPT-4o | OpenAI |
| Claude | Anthropic |
| Azure | Azure OpenAI |
| Gemini | Google Generative AI |
| DeepSeek-V3 | DeepSeek |
| DeepSeek-R1 | DeepSeek |
| Ollama | 本地模型 (需安装 Ollama) |
默认使用 Playwright 进行浏览器的无头启动、页面操作和渲染控制;对常见网页交互场景提供友好的抽象。
除了本地安装运行外,Browser-use 也提供托管版本,可以直接在云端执行,无需配置本地环境。
Github:https://github.com/pyenv/pyenv
brew install pyenv
pyenv install 3.11.9
# pyenv 根目录
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
# 初始化
eval "$(pyenv init -)"
pip3 install browser-use
playwright install
OPENAI_API_KEY=sk-xxxxxxx
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| task | str | 无 | 代理需要执行的任务描述。(必传) |
| llm | BaseChatModel (LangChain Model) | 无 | 主语言模型,执行对话和工具调用。(必传) |
| controller | Controller 实例 | 默认 Controller | 自定义函数/工具调用的注册表 |
| use_vision | bool | True | 是否启用视觉能力(截图 + 分析)。如模型支持图像输入,可显著提高网页理解;也会产生额外 token 成本。Deepseek 需要设置为 False |
| save_conversation_path | str | 无 | 若指定,则会将对话历史保存在该路径下,用于调试或审计。 |
| system_prompt_class | type (自定义 System Prompt 类) | 默认 Prompt | 自定义系统提示词逻辑 |
| browser | Browser (Browser-use 实例) | 无 | 重用已创建的 Browser 实例;若不提供,则 Agent 每次 run() 时会自动创建并关闭新的浏览器。 |
| browser_context | BrowserContext (Playwright 实例) | 无 | 使用已有的浏览器上下文 (Context)。适合需要维护持久会话 (cookies/localStorage) 的场景。 |
| max_steps | int | 100 | 允许 Agent 执行的最大步骤数,防止死循环或无限操作。 |
| planner_llm | BaseChatModel | __ | 规划用语言模型,与主 LLM 分开;可用较小/便宜模型处理高层策略。 |
| use_vision_for_planner | bool | True | Planner 是否能使用视觉功能(若主 LLM 已开启视觉,这里可独立关闭以节省资源)。 |
| planner_interval | int | 1 | Planner 模型执行间隔。即每多少步调用一次 Planner 作重新规划。 |
| message_context | str | 无 | 额外的任务/上下文信息,辅助 LLM 更好理解或执行任务。+ 03/28 文档已删除字段 |
| initial_actions | list[dict] | 无 | 初始化时要执行的动作列表(无需经 LLM 调用),格式为 {action_name: {...}}。 |
| max_actions_per_step | int | 10 | 每个步骤里可执行的最大动作数,用于控制 Agent 过度频繁操作。 |
Browser-use 提供两个主要配置类:
官方推荐:「1 个 Agent 对应 1 个 Browser 和 1 个 Context」,以增强稳定性和开发体验。
from browser_use import BrowserConfig
config = BrowserConfig(
headless=False,
disable_security=True
)
browser = Browser(config=config)
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| headless | bool | False | 是否启用无头模式(不显示 UI) |
| disable_security | bool | True | 是否禁用浏览器安全功能(如跨域限制) |
| extra_browser_args | list[str] | [] | 启动浏览器时的额外参数 |
| proxy | dict / str | 设置代理,遵循 Playwright 规范 | |
| new_context_config | BrowserContextConfig | 新建 | 默认的新上下文配置 |
| wss_url | str | WebSocket 连接地址,连接云端浏览器服务(如 browserbase、steel.dev) | |
| cdp_url | str | Chrome DevTools 协议地址,连接本地 Chrome 实例 | |
| chrome_instance_path | str | 指定本地 Chrome 安装路径,保留登录状态和 Cookie。关闭所有正在运行的 Chrome |
from browser_use.browser.context import BrowserContextConfig
config = BrowserContextConfig(
cookies_file="path/to/cookies.json",
wait_for_network_idle_page_load_time=3.0,
browser_window_size={'width':1280,'height':1100},
locale='en-US',
user_agent='Mozilla/5.0...',
highlight_elements=True,
viewport_expansion=500,
allowed_domains=['google.com','wikipedia.org'],
)
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| minimum_wait_page_load_time | float | 0.5 | 捕获网页状态前的最小等待时间 |
| wait_for_network_idle_page_load_time | float | 1.0 | 等待网络空闲时间,可提高到 3-5s 以兼容慢速网站 |
| maximum_wait_page_load_time | float | 5.0 | 页面加载的最长等待时间 |
| browser_window_size | dict | {1280, 1100} | 浏览器窗口大小,适配大多数 UI 和横幅 |
| locale | str | 设置语言/地区(如 zh-CN, en-GB),影响语言头和格式 | |
| user_agent | str | 自定义浏览器 User-Agent | |
| highlight_elements | bool | True | 是否高亮交互元素(调试用) |
| viewport_expansion | int | 500 | 页面内容扩展范围(像素),影响哪些元素被 LLM 看到。-1 为全部,0 为仅视口内 |
| allowed_domains | list[str] | 限制代理访问的域名,若为空则不限制 | |
| cookies_file | str | 加载持久化 Cookie 文件 | |
| save_recording_path | str | 保存操作录像的目录路径 | |
| trace_path | str | 保存 Trace 文件目录,命名为 {trace_path}/{context_id}.zip |
| 方法 | 说明 |
|---|---|
| urls() | 访问过的 URL 列表 |
| screenshots() | 截图路径列表 |
| action_names() | 执行的动作名称 |
| extracted_content() | 抽取到的内容 |
| errors() | 执行中出现的错误 |
| model_actions() | 所有动作及参数 |
| final_result() | 最终结果 |
| is_done() | 是否成功完成 |
| has_errors() | 是否有错误 |
| model_thoughts() | LLM 推理过程 |
| action_results() | 所有动作结果 |
from pydantic import BaseModel
from typing import List
from dotenv import load_dotenv
from browser_use import Agent, Controller
from langchain_openai import ChatOpenAI
import asyncio
# Define the output format as a Pydantic model
class Post(BaseModel):
post_title: str
post_url: str
class Posts(BaseModel):
posts: List[Post]
load_dotenv()
controller = Controller(output_model=Posts)
async def main():
task = '从掘金获取 Vue / React / AI 相关文章'
model = ChatOpenAI(model='gpt-4o')
agent = Agent(task=task, llm=model, controller=controller)
history = await agent.run()
result = history.final_result()
print('result--->', result)
print('history.urls()--->', history.urls())
# print('history.screenshots()--->', history.screenshots())
print('history.action_names()--->', history.action_names())
print('history.extracted_content()--->', history.extracted_content())
print('history.errors()--->', history.errors())
print('history.model_actions()--->', history.model_actions())
print('history.is_done()--->', history.is_done())
print(, history.has_errors())
(, history.model_thoughts())
(, history.action_results())
result:
parsed: Posts = Posts.model_validate_json(result)
post parsed.posts:
()
()
()
:
()
__name__ == :
asyncio.run(main())
用于 控制 Agent 的行为与能力,对其整体逻辑有深层影响。
自定义提示会显著影响性能、稳定性和输出风格。
message_context 字段
增加 Cookie
context_config = BrowserContextConfig(cookies_file="cookies.json")
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import asyncio
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from browser_use import Agent
load_dotenv()
llm = ChatOpenAI(model="gpt-4o")
async def main():
agent = Agent(
task="打开 https://cn.vuejs.org/guide/essentials/computed,获取页面里所有的 h2 标签文本及所有的 a 标签文本(以及它的 href)",
llm=llm,
)
result = await agent.run()
print('result:', result)
if __name__ == "__main__":
asyncio.run(main())
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from browser_use import Agent, Browser, BrowserConfig
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import asyncio
load_dotenv()
browser = Browser(
config=BrowserConfig(
chrome_instance_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
)
)
llm = ChatOpenAI(model="gpt-4o")
agent = Agent(
task="打开 https://cn.vuejs.org/guide/essentials/computed,获取页面里所有的 h2 标签文本及所有的 a 标签文本(以及它的 href)",
llm=llm,
browser=browser,
)
async def main():
await agent.run()
await browser.close()
if __name__ == '__main__':
asyncio.run(main())
from pydantic import BaseModel
from typing import List
from dotenv import load_dotenv
from browser_use import Agent, Controller, Browser, BrowserConfig
from langchain_openai import ChatOpenAI
import asyncio
class WikiResult(BaseModel):
post_title: str
post_url: str
class WikiResults(BaseModel):
posts: List[WikiResult]
load_dotenv()
browser = Browser(
config=BrowserConfig(
chrome_instance_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
)
)
instruction_message =""" 你正在访问一个公司内部 Wiki 系统:http://wiki.xxx.com/pages/
你的目标是:
1. 打开该页面并使用搜索功能,输入关键词:RAP
2. 等待页面加载完毕,提取所有与搜索结果相关的条目,包括标题、简要描述和对应链接。
3. 优先提取条目中出现 "接口管理"、"Mock"、"权限" 等关键词的内容。
4. 将所有结果以列表形式返回。
请确保你的返回格式如下:
{
"posts": [
{
"post_title": "xxx",
"post_url": "http://..."
},
...
]
}
"""
controller = Controller(output_model=WikiResults)
async def main():
task = "搜索 Wiki 中有关 RAP 的内容"
model = ChatOpenAI(model='gpt-4o')
agent = Agent(
task=task,
llm=model,
controller=controller,
browser=browser,
message_context=instruction_message
)
history = await agent.run()
result = history.final_result()
if result:
parsed: WikiResults = WikiResults.model_validate_json(result)
for post in parsed.posts:
print('\n--------------------------------')
print(f'Title: {post.post_title}')
()
:
()
__name__ == :
asyncio.run(main())
agent1 = Agent(
task="打开 https://cn.vuejs.org/guide/essentials/computed,获取页面里所有的 h2 标签文本及所有的 a 标签文本(以及它的 href)",
llm=llm,
use_vision=False
)
result1 = await agent1.run()
agent2 = Agent(
task="打开 https://docs.browser-use.com/customize/custom-functions,获取页面里所有的 h2 标签文本及所有的 a 标签文本(以及它的 href)",
llm=llm,
use_vision=False
)
result2 = await agent2.run()
llm = ChatOpenAI(model="gpt-3.5-turbo")
或
llm = ChatOpenAI(model="gpt-4o")
OPENAI_API_KEY=sk-xxxx
ANTHROPIC_API_KEY=xxxxxx
如果你还需使用其他模型(如 Cohere、HuggingFace Hub),可一并配置对应的 Key,并在 Python 脚本中初始化相应的 LLM 对象。
在 docs.browser-use.com/introduction 可以找到更多场景示例,比如如何定制 browser-use 的 Tools、配合 PythonREPLTool 扩展执行 Python 脚本等。
pip3 install gradio
import asyncio
import gradio as gr
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from browser_use import Agent
load_dotenv()
llm = ChatOpenAI(base_url='https://api.deepseek.com/v1', model='deepseek-chat', api_key="sk-XXX")
async def run_browser_task(task: str,) -> str:
try:
print('task', task)
agent = Agent(
task=task,
llm=llm,
use_vision=False
)
result = await agent.run()
print('final_result()', result.final_result())
return result
except Exception as e:
return f'Error: {str(e)}'
def create_ui():
with gr.Blocks(title='Browser Use GUI') as interface:
gr.Markdown('# Browser Use Task Automation')
with gr.Row():
with gr.Column():
task = gr.Textbox(
label='Task Description',
placeholder='Task 描述',
lines=3,
)
model = gr.Dropdown(
choices=['gpt-4','gpt-3.5-turbo'],
label=,
value=
)
headless = gr.Checkbox(label=, value=)
submit_btn = gr.Button()
gr.Column():
output = gr.Textbox(label=, lines=, interactive=)
submit_btn.click(
fn= *args: asyncio.run(run_browser_task(task.value)),
inputs=[task, model, headless],
outputs=output,
)
interface
__name__ == :
demo = create_ui()
demo.launch()
打开终端提示的地址,就能看到一个简易的 web 界面,在界面中输入 task 等信息测试智能体。
Browser-use 让 AI 与浏览器的结合变得更便捷,能够快速构建出'会浏览网页、抓取信息、进行动态交互'的智能体。只需简单的配置与几行代码,就能让 LLM 自动处理网页操作,为项目带来更多可能性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
| max_failures | int | 3 | 允许 Agent 失败的最大次数,超过则停止任务。 |
| retry_delay | int (秒) | 10 | 当遇到限流 (rate limit) 或可重试的错误时,等待多少秒后再次尝试。 |
| generate_gif | bool 或 str (路径) | False | 是否录制浏览器过程生成 GIF。为 True 时自动生成随机文件名;为字符串时将 GIF 存储到该路径。 |