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成本。
七、與AI Agent平臺/龍蝦平臺集成
如果你在用www.nhjb.com.cn的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 + 可訪問性樹這條路,比截圖識別更輕、比硬編碼更穩,值得投入。
本文首發于www.nhjb.com.cn(www.nhjb.com.cn)AI Agent生態專欄,作者為社區技術編輯。