Web Fetch 在三層中的角色
| 框架 | 用途 | 方式 |
|---|---|---|
| Hermes Agent | 背景資訊搜集 | Python requests / fetch_url |
| OpenClaw | 任務中抓取網頁 | MCP Puppeteer / fetch_url |
| Claude Code | 通過 OC 間接使用 | 不直接抓取 |
靜態頁面抓取(輕量)
# Python fetch(Hermes 背景搜集用)
import requests
from bs4 import BeautifulSoup
resp = requests.get("https://example.com/article")
soup = BeautifulSoup(resp.text, "html.parser")
text = soup.get_text()
動態頁面抓取(MCP Puppeteer)
需要 JavaScript 渲染的頁面用 Puppeteer MCP:
{
"mcpServers": {
"puppeteer": {
"command": "npx",
"args": ["@anthropic-ai/mcp-server-puppeteer"]
}
}
}
典型場景
| 場景 | 用什麼 | 例子 |
|---|---|---|
| 抓取 AI 新聞摘要 | Hermes + requests | 每日搜集 |
| 查詢 HKEX 公告 | OpenClaw + Puppeteer | /sdd 流程中 |
| 驗證外連結是否失效 | 腳本 + requests | 建置時檢查 |
先判斷靜態還是動態
選錯方式是最常見的浪費來源。輕量抓取速度快、成本低,但拿不到 JavaScript 渲染後的內容;瀏覽器抓取能處理動態頁面,但資源開銷大、速度慢。判斷順序建議如下。
- 先用輕量方式抓一次,檢查回應內容是否已包含目標資料。
- 若目標資料不在 HTML 原始碼中(例如由前端框架在載入後填入),改用瀏覽器渲染。
- 若頁面需要互動(點擊、捲動、登入)才顯示資料,才升級到完整的瀏覽器自動化。
| 方式 | 優點 | 限制 |
|---|---|---|
| requests 加解析器 | 快、開銷小、易平行 | 拿不到渲染後內容 |
| 瀏覽器渲染 | 能處理動態與互動 | 慢、耗資源、易受版面變動影響 |
| 官方 API | 穩定、欄位明確 | 需授權、可能有配額 |
只要能取得授權,官方 API 永遠優先於抓取。抓取適合沒有 API 或 API 不敷使用的情況,屬於補充手段。
合規、禮貌與反爬的取捨
抓取前要先確認對方網站的使用條款與 robots 規則,並避免對來源造成壓力。
- 設定合理的請求間隔,不要在短時間內密集打同一站。
- 帶上可識別的 User-Agent,方便對方辨識與聯絡。
- 尊重 robots 規則與網站聲明的抓取限制。
- 遇到限流或封鎖時,採用指數退避重試,而不是持續重打。
- 大量抓取前先評估是否需要授權或付費方案。
- 注意個人資料與版權:只取需要的部分,不要把整站複製保存。
反爬機制常見於動態網站,可能包括驗證碼、行為偵測與指紋識別。處理這類機制的正確方向是改用官方管道或降低頻率,而不是繞過防護。繞過防護既不可靠,也容易帶來法律與聲譽風險。
內容清理與保存
抓回來的 HTML 通常混雜導覽列、廣告、頁尾與腳本,直接餵給模型既浪費 token 也降低準確度。常見做法是:
- 抽出正文區塊,丟棄樣板內容(可依標籤結構或已知的正文容器判斷)。
- 移除多餘空白與重複段落,保留標題層級以便理解結構。
- 保留來源 URL 與抓取時間,方便日後回溯與引用。
- 對需要引用的內容保留原文,不要只留摘要,避免日後無法核對。
- 設定回應大小上限,避免抓到超大檔案拖垮流程。
另一個關鍵是逾時與錯誤處理:沒有逾時的抓取會卡住整條流程;沒有區分「頁面不存在」與「暫時失敗」的錯誤處理,會讓重試策略失去意義。
驗證方式與常見錯誤
驗證方式
- 對已知會渲染內容的頁面做一次對照,確認輕量方式拿不到、瀏覽器方式拿得到。
- 檢查抓取結果是否包含正文關鍵字,確認沒抓到空殼頁。
- 測試逾時與失敗路徑,確認錯誤訊息清楚且不會靜默通過。
- 驗證連結檢查腳本能正確區分失效連結與暫時無法連線。
- 抽查保存的內容是否附有來源與時間戳。
常見錯誤
- 對所有頁面都用瀏覽器渲染,浪費資源又拖慢流程。
- 抓取沒有設定逾時,遇到慢站整條流程卡死。
- 忽略 robots 規則與條款,或對來源過度請求。
- 沒有保留來源與時間,日後無法引用或核對。
- 只抓一次就假設資料最新,沒有考慮快取與更新頻率。
- 把抓到的整頁內容原封不動塞進提示,稀釋了關鍵資訊。
- 連結檢查把暫時性網路錯誤誤報為失效。
檢查清單
- 已確認目標頁面是否需要 JavaScript 渲染。
- 已優先評估是否可用官方 API 取代抓取。
- 已確認條款與 robots 規則允許抓取。
- 已設定請求間隔、User-Agent 與退避重試。
- 已設定逾時與明確的錯誤分類。
- 已抽出正文並移除樣板內容。
- 每筆結果都保留來源 URL 與抓取時間。
- 已測試渲染、逾時、失效連結等關鍵路徑。