浏览器 Agent:用 DOM/可访问性树和 Playwright 驱动网页任务,控制选择器与网络边界
浏览器 Agent 让模型在网页上导航、填表、点击和提取信息。常见实现用 Playwright/CDP 控制浏览器,把 DOM/可访问性树或截图给模型,模型输出动作。它比纯 HTTP 抓取能处理登录、JavaScript 渲染和多步流程,但更慢、更脆弱,也更容易被反爬和页面变化影响。
优先用稳定接口:有官方 API 就用 API,有导出/下载就用文件,不要用浏览器点。必须用浏览器时,固定浏览器版本、视口、语言和时区,限制可访问域名,隔离登录态,并记录每步动作和截图。
# Playwright:稳定的等待和定位
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page(viewport={"width": 1280, "height": 800})
page.goto("https://example.com/login", wait_until="networkidle")
page.get_by_label("用户名").fill("user")
page.get_by_label("密码").fill("pass")
page.get_by_role("button", name="登录").click()
page.wait_for_url("**/dashboard")
print(page.title())
# Agent 循环:DOM 摘要 + 动作
for step in range(max_steps):
dom = page.accessibility.snapshot() # 或精简 DOM
action = model.predict(dom, task, history)
if action.type == "click":
page.get_by_role(action.role, name=action.name).click()
elif action.type == "type":
page.get_by_label(action.label).fill(action.text)
elif action.type == "goto":
if not allowed_domain(action.url):
break
page.goto(action.url)
page.wait_for_load_state("networkidle")
安全边界:
- 域名白名单,禁止访问内网/管理面
- 独立浏览器 profile,不共享个人登录态
- 下载/上传目录隔离,限制文件类型
- 发送/提交/支付前人工审批
- 记录 URL、动作、截图、下载和网络请求
wait_for_*、networkidle 或显式条件。合上页面,先回答,再展开对照。
小程序版
微信扫码,随时查命令