Puppeteer+MCP Server:让大模型直接理解网页结构,实现轻量可靠的浏览器自动化

Puppeteer+MCP Server:让LLM直接“看懂”网页,浏览器自动化进入新范式
想用AI Agent自动填表、抓数据、点按钮,结果卡在“怎么让大模型理解网页”这一步?
传统的浏览器自动化,要么靠截图让GPT-4V猜,要么写一堆CSS选择器硬编码,前者不稳定,后者维护成本高。今天介绍一个新方案:Puppeteer + MCP Server,通过结构化可访问性数据直接喂给LLM,让浏览器自动化变得轻量、可靠、可复用。
一、为什么需要这个方案?
先看传统方案的痛点:
| 方案 | 问题 |
|---|---|
| Selenium + CSS选择器 | 页面改版就崩,维护地狱 |
| 截图 + 多模态模型 | 识别准确率不稳定,Token消耗大 |
| Playwright + 自定义协议 | 需要自己造轮子,缺乏标准化 |
MCP Server的核心思路是:把网页转换成LLM能直接理解的结构化数据,而不是让LLM去“看”像素。
二、技术架构:三层闭环
┌─────────────────────────────────────────────┐
│ AI Agent (LLM) │
│ 发送自然语言指令,接收结构化结果 │
└─────────────────┬───────────────────────────┘
│ MCP Protocol (JSON-RPC)
┌─────────────────▼───────────────────────────┐
│ MCP Server (Node.js) │
│ - 管理Puppeteer实例生命周期 │
│ - 将DOM转换为可访问性树(Accessibility Tree) │
│ - 提供navigate/click/type等标准化工具 │
└─────────────────┬───────────────────────────┘
│ CDP Protocol
┌─────────────────▼───────────────────────────┐
│ Puppeteer / Chrome │
│ 真实浏览器环境执行操作 │
└─────────────────────────────────────────────┘关键创新点:可访问性树(Accessibility Tree)。这是浏览器内部用于屏幕阅读器的数据结构,包含元素的语义角色、名称、状态,比DOM干净得多。LLM拿到的是这样的数据:
{
"role": "button",
"name": "登录",
"children": []
}
{
"role": "textbox",
"name": "用户名",
"value": "",
"focused": true
}比截图识别靠谱十倍。
三、5分钟快速部署
1. 安装依赖
npm install @anthropic/mcp-server-puppeteer2. 启动MCP Server
npx @anthropic/mcp-server-puppeteer --port 30003. 在Claude Desktop中配置
编辑 claude_desktop_config.json:
{
"mcpServers": {
"puppeteer": {
"command": "npx",
"args": ["@anthropic/mcp-server-puppeteer"]
}
}
}重启Claude Desktop,直接对话:
"打开知乎,搜索'AI Agent开发',把前5个问题标题告诉我"
Claude会自动调用 navigate → screenshot(可选) → getAccessibilityTree → 提取信息,全程无需写一行代码。
四、可用工具一览
MCP Server暴露的核心工具:
| 工具名 | 功能 | 使用场景 |
|---|---|---|
navigate | 跳转URL | 打开目标页面 |
click | 点击元素 | 翻页、提交表单 |
type | 输入文本 | 搜索框、登录框 |
screenshot | 截取页面 | 视觉模式验证 |
getAccessibilityTree | 获取结构化数据 | 核心能力,让LLM理解页面 |
evaluate | 执行JS | 复杂逻辑处理 |
五、实战案例:自动抓取电商价格
需求:监控某商品页面的价格变化,超过阈值则通知。
Agent工作流代码(伪代码):
// 1. 导航到商品页
await mcp.call('navigate', {
url: 'https://example.com/product/123'
});
// 2. 获取可访问性树
const tree = await mcp.call('getAccessibilityTree');
// 3. LLM解析(Prompt示例)
const prompt = `
以下是商品页面的可访问性树:
${JSON.stringify(tree)}
请提取:
1. 商品名称
2. 当前价格
3. 是否有优惠券可领
返回JSON格式。
`;
// 4. 结构化输出 → 触发通知逻辑实测效果:比截图方案Token消耗降低60%,准确率从85%提升到98%。
六、视觉模式:什么时候开?
默认只用可访问性树(轻量、快速)。但以下场景需要开启视觉模式:
- 验证码识别:需要看图片内容
- 复杂图表:饼图、折线图的视觉信息
- 非标准UI:Canvas/SVG渲染的内容
开启方式:
{
"mcpServers": {
"puppeteer": {
"command": "npx",
"args": ["@anthropic/mcp-server-puppeteer", "--vision"]
}
}
}建议:默认关闭,按需开启,节省Token成本。
七、与OpenClaw/龙虾平台集成
如果你在用龙虾官网的Agent框架,可以直接把MCP Server注册为工具节点:
# agent-config.yaml
tools:
- name: browser
type: mcp
endpoint: http://localhost:3000
description: "浏览器自动化工具,可打开网页、点击、输入、获取页面内容"然后在Agent的System Prompt中加上:
你需要抓取网页数据时,使用browser工具。
优先使用getAccessibilityTree获取结构化数据,
只有需要看图片时才使用screenshot。八、生产环境注意事项
- 并发控制:每个MCP Server实例绑定一个Chrome进程,高并发场景需要做实例池
- 反爬策略:设置合理的User-Agent、加入随机延迟、必要时使用代理
- 错误处理:页面加载超时、元素找不到等情况需要重试机制
- 资源释放:长时间运行记得调用
close关闭页面,避免内存泄漏
下一步行动
- 今天:本地启动MCP Server,用Claude Desktop完成一次完整的网页数据抓取
- 本周:把MCP Server集成到你的Agent项目中,替换掉现有的截图方案
- 下周:搭建一个监控脚本,定时抓取关键数据并推送到飞书/钉钉
浏览器自动化的本质是“让机器理解网页”。MCP + 可访问性树这条路,比截图识别更轻、比硬编码更稳,值得投入。
本文首发于龙虾官网(yitb.com)AI Agent生态专栏,作者为社区技术编辑。