互联网的本质是什么?
有人说是信息流动,有人说是连接一切。
但如果让我给个答案,我会说:高效获取信息,自动化重复场景。
Browser Use,4天开发,1700万美元融资,生动诠释了这个第一性原理。
Browser Use由苏黎世联邦理工学院校友Magnus Müller和Gregor Zunic联手打造的开源项目,几乎是“速成”的代名词。
几个月内,GitHub星标突破5万,接着Manus的东风,风投圈争相下注,AI+浏览器自动化的Agent火爆一时。
Browser Use的核心其实很简单:让AI像人一样用浏览器。
市面也有很多自动化工具,但是还停留在机械地模拟点击或填写表单,而Browser Use却能让AI“看懂”网页,然后像真人一样思考和操作。
举个例子,你扔给它一句“帮我找三家云南大理最具性价比的酒店”,传统AI顶多丢给你个链接,敷衍了事。
但Browser Use会直接打开booking.com,翻页筛选,比较评分和价格,最后奉上一份详细报告。这种从“指令接收”到“任务执行”的闭环能力,精准击中了AI落地的痛点。
更夸张的是,它的价格和开放性。开源,MIT协议随便改随便用,还支持Claude、GPT、Gemini等多模型切换,不绑死任何一家供应商。闭源竞品OpenAI Operator要200美元!
火出圈的必备三大杀招——开源、多模型、低成本,直接让它在自动化赛道无人能及。
Browser Use的技术架构并不复杂,却聪明得让人叹服。整个系统靠四层架构撑起,从网页感知到操作执行,每一层都直戳Web自动化的核心难题。
DOM层,这是AI的眼睛。AI识别网页上的按钮和文本,智能判断“这个按钮现在能不能点”“这个元素是不是被遮住了”。
透过源码我们能看到,它用了一个扁平化的哈希映射,而不是传统的树形结构,序列化和查找效率直接拉满。
Browser层负责动手的。本质基于Playwright库。
Controller层是“翻译官”,把AI的决策变成具体动作。它的装饰器模式设计优雅到不行,想加个新功能,比如截图,只需三行代码搞定,扩展性拉满。
最后是Agent层,经典的“观察-思考-行动”循环,调用语言模型做判断,执行动作后还能根据结果调整策略。
四层环环相扣,解决了从感知到执行的全链路问题。难怪有人说,Browser Use是“用最少的代码,干了最多的事”。
当然风投从不只为技术买单,他们买的还是是市场潜力。
Browser Use的1700万美元融资,背后是对一个万亿级市场的押注。
全球6亿知识工作者,每周25%-40%的时间在重复性任务上,其中一半跟网页操作有关。如果每周能省5小时,按时薪25美元算,这是个7500亿美元/年的超级市场。
更别提企业级场景:销售线索自动抓取、竞品价格实时监控、媒体舆情跟踪、招聘简历筛选……个个都是刚需。
开源策略更是妙棋。
5万GitHub星标只是起点,随着开发者社区的涌入,代码贡献和功能迭代会指数级增长,形成技术护城河。
相比之下,闭源竞品想追赶,难度可想而知。风投看中的,正是这种“低成本起飞,高壁垒落地”的打法。
Browser Use的核心逻辑简单到可以用100行代码复现。
我参照源码准备了一个极简版。基于Playwright和OpenAI,核心是个“观察-思考-行动”循环。启动后,它会打开浏览器,抓取页面状态,交给AI决策下一步。
importasyncio
fromplaywright.async_apiimportasync_playwright
fromopenaiimportOpenAI
importjson
client=OpenAI()#替换为你的AI模型客户端
asyncdefmain():
#初始化浏览器
asyncwithasync_playwright()asp:
browser=awaitp.chromium.launch(headless=False)
page=awaitbrowser.new_page()
#导航到目标网站
awaitpage.goto("https://example.com")
#主循环
forstepinrange(5):#最多执行5步
#1.观察:获取页面状态
state=awaitget_page_state(page)
#2.思考:让AI决策下一步
next_action=awaitget_ai_decision(state)
print(f"AI决定:{next_action}")
#如果AI决定完成任务,退出循环
ifnext_action["action"]=="done":
print(f"任务完成:{next_action.get('reason','')}")
break
#3.行动:执行AI决策
awaitexecute_action(page,next_action)
awaitpage.wait_for_load_state("networkidle")
awaitbrowser.close()
asyncdefget_page_state(page):
"""获取当前页面状态"""
#获取页面基本信息
url=page.url
title=awaitpage.title()
#获取可交互元素
elements=awaitpage.evaluate("""()=>{
constresults=[];
constall=document.querySelectorAll('a,button,input,select,textarea');
all.forEach((el,index)=>{
constrect=el.getBoundingClientRect();
//只收集可见元素
if(rect.width>0&&rect.height>0){
results.push({
index:index,
tag:el.tagName.toLowerCase(),
text:el.innerText||el.value||'',
type:el.type||'',
id:el.id||'',
name:el.name||'',
className:el.className||''
});
}
});
returnresults;
}""")
#将元素列表格式化为易读形式
elements_text=""
forelinelements:
elements_text+=f"[{el['index']}]<{el['tag']}>{el['text']}{el['id']}\n"
return{
"url":url,
"title":title,
"elements":elements,
"elements_text":elements_text
}
asyncdefget_ai_decision(state):
"""使用AI决定下一步行动"""
prompt=f"""
你是一个浏览器自动化助手。根据当前页面状态,决定下一步操作。
当前URL:{state['url']}
页面标题:{state['title']}
可交互元素:
{state['elements_text']}
请从以下选择一个动作:
1.click-点击元素,参数:index(整数)
2.input-输入文本,参数:index(整数),text(字符串)
3.goto-导航到URL,参数:url(字符串)
4.done-完成任务,参数:reason(字符串)
以JSON格式返回决策,例如:{"action":"click","index":2}
"""
response=client.chat.completions.create(
model="gpt-4",
messages=[{"role":"user","content":prompt}],
response_format={"type":"json_object"}
)
#解析AI响应
try:
returnjson.loads(response.choices[0].message.content)
except:
#解析失败时的后备策略
return{"action":"done","reason":"无法解析AI响应"}
asyncdefexecute_action(page,action):
"""执行AI决定的动作"""
ifaction["action"]=="click":
#获取元素并点击
elements=awaitpage.evaluate("""()=>{
constresults=[];
constall=document.querySelectorAll('a,button,input,select,textarea');
all.forEach((el,index)=>{
constrect=el.getBoundingClientRect();
if(rect.width>0&&rect.height>0){
results.push({
index:index,
rect:{x:rect.x,y:rect.y,width:rect.width,height:rect.height}
});
}
});
returnresults;
}""")
forelinelements:
ifel["index"]==action["index"]:
#点击元素中心
x=el["rect"]["x"]+el["rect"]["width"]/2
y=el["rect"]["y"]+el["rect"]["height"]/2
awaitpage.mouse.click(x,y)
return
elifaction["action"]=="input":
#先点击输入框,再输入文本
awaitexecute_action(page,{"action":"click","index":action["index"]})
awaitpage.keyboard.type(action["text"])
elifaction["action"]=="goto":
#导航到指定URL
awaitpage.goto(action["url"])
if__name__=="__main__":
asyncio.run(main())当然,以上都只是术,在AI时代,真正的创新未必是造出新轮子,而是把现有技术拼装成解决痛点的利器,解决需求解决问题才是真正的道。
Browser Use也用4天证明:只要找准场景,简单技术也能撬动亿万市场。
或许,
下一个改变游戏规则的AI应用,就藏在你我的灵感里。等着被4天写出来。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |