搞过网页自动化或者爬虫的朋友肯定都有过这样的痛苦:盯着浏览器的开发者工具,费尽心思写出一个完美的XPath或者CSS选择器。结果没过两周,网站前端稍微改版加了个div,整个代码就全线崩溃了。为了维护这些选择器,我们耗费了大量的精力。
最近我在用 Python 折腾大模型应用的时候,发现了一个能从根本上解决这个痛点的思路。既然大模型现在不仅能读懂文本,还能看懂图片(多模态),那为什么不直接让它自己去“看”网页,自己决定点哪里、输什么呢?
今天来聊聊一个非常硬核的 Python 库:Browser-use。
简单来说,这是一个能让大语言模型(比如 GPT-4o 或者 Claude 3.5)直接控制浏览器的框架。你只需要用自然语言给它下发任务,它就会自动打开页面,寻找按钮,输入文本,甚至翻页提取你要的数据。
它是怎么运作的?(附核心流程图)
在写代码之前,我们先理清它的内部工作机制。传统的 Playwright 或 Selenium 是由我们一行行写死操作逻辑,而 Browser-use 则是把 Playwright 当作了 AI 的“手”,把 DOM 树和屏幕截图当成了 AI 的“眼睛”。
它的核心交互逻辑是一个循环反馈的过程,我画了一个流程图:
graph TD A[你输入自然语言任务] --> B(Agent 初始化并启动浏览器) B --> C{判断任务是否达到目标?} C -- 还没完成 --> D[提取当前页面的 DOM 元素和截图] D --> E[将页面状态发给 LLM] E --> F[LLM 分析并决策下一步操作] F --> G[将决策转化为具体的鼠标/键盘动作] G --> C C -- 目标已完成 --> H[输出你想要的结果]
在这个循环里,Agent 就像一个真实的人类在上网:先看一眼屏幕,判断目标在哪,操作一下,然后再看一眼屏幕有没有跳转成功。
第一个实战:极其极简的自动化任务
要跑通这个库,你需要准备好 Python 3.11 以上的环境,并且配置好 OpenAI 或者其他支持 LangChain 的模型 API Key。
我们先看一个最基础的例子。假设我们要让它去豆瓣电影查一下最近某部电影的评分,顺便抓两条热评。
import asynciofrom langchain_openai import ChatOpenAIfrom browser_use import Agentasync def main(): # 配置你的大模型,这里推荐用视觉能力强一点的模型 llm = ChatOpenAI(model="gpt-4o") # 定义任务,直接说人话就行 task_description = """ 1. 打开豆瓣电影的主页。 2. 在搜索框里搜索《流浪地球2》。 3. 点击进入电影详情页。 4. 提取出它的当前豆瓣评分,以及页面最前方的两条短评。 5. 把提取到的结果总结后返回给我。 """ # 实例化 Agent agent = Agent( task=task_description, llm=llm ) # 运行并等待结果 result = await agent.run() print("最终结果:") print(result.final_result())if __name__ == '__main__': asyncio.run(main())
当你运行这段代码时,你会看到屏幕上弹出了一个 Chromium 浏览器,鼠标光标在自己移动,输入法自动打字,页面自己跳转。不需要你去抓取搜索框的 input ID,也不需要解析页面 HTML 去找评分标签,大模型自己把这一切都搞定了。
进阶玩法:注入自定义动作 (Controller)
仅仅是在网页上点点点还不够。在真实的业务场景中,我们经常需要把网页上的操作和本地的代码逻辑结合起来。比如,看到一个表格数据,顺手存进本地数据库里。
Browser-use 提供了一个叫 Controller 的机制,允许你定义专属的 Python 函数,并在大模型认为合适的时候去调用它。
看看下面这段代码,我们教 AI 如何把在网上查到的数据实时保存到本地的文本里:
import asynciofrom langchain_openai import ChatOpenAIfrom browser_use import Agent, Controller# 初始化控制器controller = Controller()# 用装饰器把普通的 Python 函数注册给 AI 使用@controller.action('将获取到的关键信息保存到本地文件')def save_data_to_file(data: str, filename: str): """ 当你找到需要的数据时,调用此函数保存。 参数: data: 需要保存的文本内容 filename: 文件名(包含后缀 .txt) """ with open(filename, 'a', encoding='utf-8') as f: f.write(data + "\n") return f"成功保存数据到 {filename}"async def main(): agent = Agent( task="去 Github 搜索 stars 大于 50000 的 Python 开源库,找到前三个,并把它们的名字和简介用 save_data_to_file 动作保存到 top_repos.txt 文件里", llm=ChatOpenAI(model="gpt-4o"), controller=controller # 把控制器传给 Agent ) await agent.run()asyncio.run(main())
这段代码执行时,大模型在网页上找到数据后,不会直接结束任务,而是会自己组织参数,调用你写的 save_data_to_file 函数。这就把 Web 自动化和本地业务逻辑完美打通了。
解决现实痛点:接管已有的浏览器会话
做过爬虫的人都知道,最让人头疼的其实不是怎么提取数据,而是怎么绕过那些反人类的登录验证码和滑块。如果每次运行 Agent 都要重新登录,那这东西基本没法用。
Browser-use 考虑到了这一点,它允许你连接到一个已经打开、包含了你日常登录状态的 Chrome 浏览器上。
你需要先在终端用 Debug 模式启动本地 Chrome:
chrome.exe --remote-debugging-port=9222
然后在 Python 代码里接管它:
import asynciofrom langchain_openai import ChatOpenAIfrom browser_use import Agentfrom browser_use.browser.browser import Browser, BrowserConfigasync def main(): # 配置并连接到已经打开的本地 Chrome browser = Browser( config=BrowserConfig( chrome_instance_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', # 这里换成你的浏览器实际路径 cdp_url='http://localhost:9222' # 连接 Debug 端口 ) ) agent = Agent( task="去我的知乎主页,看看有没有新的私信,如果有,简单概括一下是谁发了什么", llm=ChatOpenAI(model="gpt-4o"), browser=browser # 传入接管的浏览器实例 ) await agent.run() # 别忘了用完关闭 await browser.close()asyncio.run(main())
由于接管的是你平常用的人类浏览器,什么 Cookie、Session、记住密码全都在。AI 直接跳过了繁琐的登录风控环节,进去直接开始干活。
写在最后
这几个月体验下来,我个人的感受是:基于 LLM 的 Web 自动化虽然在执行速度上还比不上写死的 Playwright 脚本(毕竟每一步都要等模型推理返回),但在“开发效率”和“抗变化能力”上是降维打击的。
你不需要去研究 DOM 结构了,前端怎么改版只要人眼还能看懂,代码就还能跑。这其实指明了未来自动化测试和轻量级爬虫的一个重要发展方向。
有兴趣的朋友周末可以把代码拉下来跑一跑,尤其是配合一下最近很火的本地模型,说不定能搞出很多有意思的个人助理工具。