網頁抓取是把網頁內容自動取得並轉換為結構化資料的過程。本文講清靜態與動態頁面的區別、工具選擇、完整實施流程及robots.txt和個人資料合規邊界。
網頁抓取(Web Scraping)是透過程式取得網頁內容,再從 HTML、介面回應或瀏覽器渲染結果中擷取所需欄位,並整理成表格、JSON 或資料庫記錄的過程。常見用途包括價格監測、公開商品資訊彙整、輿情研究、SEO 稽核、徵才資訊分析和內部資料遷移。
網頁抓取不是簡單的「複製貼上自動化」。一個可靠的專案至少要處理存取權限、頁面結構、動態渲染、分頁、去重、限速、異常重試、資料品質和隱私合規。能否在技術上存取某個頁面,也不等於有權收集、保存或再利用其中的全部資料。
Web Scraping與網路爬蟲有什麼區別?
兩者經常混用,但關注點不同:
- **網路爬蟲(Web Crawler)**側重發現和遍歷 URL,例如從首頁沿連結持續尋找新頁面;
- **網頁抓取(Web Scraping)**側重從目標頁面中擷取欄位,例如商品名、價格、庫存狀態和更新時間;
- 一個完整系統通常先爬取 URL,再抓取頁面,最後清洗和儲存資料。
搜尋引擎就是典型的爬取與處理系統。現代網頁還可能需要執行 JavaScript 後才能看到完整內容。商業資料採集的規模通常小得多,但「發現頁面、取得內容、解析欄位、儲存結果」的基本鏈路相似。
網頁抓取的基本工作原理
一個抓取任務通常經過六個環節。
1. 明確資料目標
先定義真正需要的欄位、更新頻率、覆蓋範圍和用途。例如,價格監測未必需要使用者評論者的姓名;SEO 稽核只需要標題、狀態碼和 canonical 標籤,也無需保存頁面全部正文。
目標越明確,越容易控制請求量、儲存成本和個人資料風險。
2. 取得頁面
對於伺服端直接回傳完整 HTML 的靜態頁面,一般 HTTP 用戶端通常足夠。對於依賴 JavaScript 載入內容、需要點擊或捲動的動態頁面,可能要使用真實瀏覽器自動化工具進行渲染。
但在引入瀏覽器前,應先檢查網站是否提供官方 API、資料匯出、RSS、站點地圖或公開資料集。這些管道通常更穩定,也更容易符合使用條款。
3. 解析與定位元素
取得 HTML 後,程式會用 CSS 選擇器或 XPath 定位內容。Scrapy 選擇器官方文件說明,選擇器能夠從 HTML 中擷取節點,Scrapy 回應物件直接提供 .css() 和 .xpath() 等介面。
選擇器應依賴穩定語義,例如資料屬性、結構化資料或明確的容器層級,盡量避免依賴隨頁面改版頻繁變化的隨機類別名稱。
4. 清洗與標準化
網頁文字往往混有空格、貨幣符號、單位和在地化格式。清洗階段需要統一:
- 字元編碼與換行;
- 日期、時區和數字格式;
- 貨幣與計量單位;
- 相對 URL 與絕對 URL;
- 缺失值、重複記錄和異常值。
原始值與清洗值最好分別保留,方便發生爭議或規則變化時追溯。
5. 儲存與版本管理
少量資料可寫入 CSV 或試算表,持續任務更適合資料庫或物件儲存。除業務欄位外,還應保存來源 URL、抓取時間、回應狀態、資料版本和解析器版本。這樣才能判斷某個變化來自網站、解析規則還是抓取失敗。
6. 監控與維護
網頁會改版,欄位會移動,介面會變化。生產抓取應監控成功率、空值率、重複率、回應時間、HTTP 狀態碼和單位時間請求量。某欄位突然全部為空時,應暫停任務並檢查,不要把空值直接覆蓋正常歷史資料。
靜態頁面、動態頁面與介面該怎麼選?
優先使用官方API或匯出
官方 API 通常提供穩定欄位、分頁和權限機制。只要許可、配額和費用滿足需求,它通常比解析網頁更可靠。
靜態HTML適合輕量抓取
如果「檢視網頁原始碼」就能看到目標資料,可用 HTTP 用戶端加 HTML 解析器。它啟動快、資源佔用低,適合公開清單、文件和內容頁。
動態頁面才考慮瀏覽器自動化
如果內容在腳本執行後出現,或者必須完成授權範圍內的點擊、篩選和捲動,才考慮 Playwright 等瀏覽器工具。Playwright BrowserType 文件展示了啟動或連線瀏覽器的自動化介面。
瀏覽器自動化消耗更多 CPU 和記憶體,頁面選擇器也更容易受改版影響。因此不要把它作為所有專案的預設方案,更不應藉它繞過登入權限、驗證碼或存取控制。
如何開始一個網頁抓取專案?
步驟一:確認許可和替代管道
檢視網站服務條款、API 條款、robots.txt、版權聲明和資料許可。若涉及登入後內容、付費內容、個人資料或大規模商業使用,應由法務或資料保護負責人確認依據。
robots.txt 是網站向自動用戶端表達抓取規則的標準機制。RFC 9309明確說明,它用於服務擁有者控制爬蟲如何存取資源,但不是存取授權機制。也就是說,允許抓取並不自動授予內容版權或個人資料處理權;禁止規則也不應被當作需要「技術繞過」的障礙。
步驟二:抽樣檢查頁面結構
選擇不同分頁、分類和邊界情況的 10—20 個頁面,確認欄位是否都在相同位置。特別檢查無價格、缺圖、已下架、多規格、跨語言和登入過期等情況。
步驟三:設計資料結構
給每個欄位定義名稱、型別、是否必填、清洗規則和唯一鍵。例如商品資料可包含:來源 URL、平台商品 ID、標題、目前價格、幣種、庫存狀態和採集時間。
步驟四:先做小規模原型
用少量頁面驗證選擇器、分頁、編碼、去重和錯誤處理。不要在選擇器尚未穩定時直接跑全站。
步驟五:增加友善限速
設定合理請求間隔、並發上限、逾時和指數退避;遇到 429 Too Many Requests 或持續 5xx 時主動降速或暫停。快取已經取得且短期不變的頁面,避免重複請求。能按更新時間增量抓取,就不要每天全量重抓。
步驟六:上線監控與停止條件
為異常狀態設定停止條件,例如驗證碼突然出現、登入失效、空值率飆升、結構變化或伺服器錯誤持續增加。自動化系統應該在不確定時停下來等待人工確認,而不是不斷重試。
robots.txt應該怎麼看?
robots.txt 通常位於網站根目錄的 /robots.txt。規則按 user-agent 分組,並透過 allow 與 disallow 描述路徑。Google 對 robots.txt 的解釋還強調,規則僅適用於對應主機、協定和連接埠,路徑區分大小寫。
需要注意:
- robots.txt 不是密碼牆,也不應用來存放秘密 URL;
- 它主要表達爬取偏好,不等同於內容授權;
- 具體網站條款、契約、智慧財產權和資料保護義務仍需單獨評估;
- 即使沒有 robots.txt,也不代表可以無限並發或收集任何資料;
- 專案應使用可識別的 user-agent 和聯絡方式,而不是偽裝成一般使用者逃避治理。
網頁抓取有哪些合規風險?
個人資料
公開可見不等於可以無限制處理。如果資料能直接或間接識別個人,收集方仍可能承擔告知、合法依據、保存期限、安全和權利回應義務。
歐盟委員會對 GDPR 原則的說明列出了合法、公平與透明、目的限制、資料最小化、保存期限、準確性、安全性和問責等原則。面向歐盟個人的資料專案,應只收集實現明確目的所必需的欄位,並設定刪除或複核期限。
著作權與資料庫權利
事實資料和頁面表達可能受到不同保護,大量複製正文、圖片、評論或資料庫內容的風險高於只記錄必要事實欄位。是否可以再發布、訓練模型或商業轉售,需要結合司法轄區、許可和使用方式判斷。
契約與存取控制
網站條款可能限制自動存取、資料再利用或帳號共享。不得繞過登入、付費牆、驗證碼、頻率限制或其他技術存取控制。若專案必須取得受限資料,應先取得明確授權。
對網站服務的影響
過高並發會增加對方成本並影響正常使用者。限速、快取、增量更新、錯峰執行和明確停止條件既是工程品質要求,也是基本的服務禮儀。
如何讓瀏覽器自動化任務更可控?
當抓取目標確實需要瀏覽器渲染,或涉及多帳號、多環境、需要團隊協作時,任務的可追溯性和權限控制就變得關鍵。可考慮把這些瀏覽器操作組織成可稽核、可管理的流程:
- 按客戶或專案把瀏覽器環境分組隔離,減少 Cookie 與工作階段混用;
- 只給執行成員必要的權限,避免共享帳號密碼;
- 用操作日誌記錄誰在何時啟動了哪項任務;
- 對必須渲染的頁面設定小批次佇列和並發上限,保持請求強度可控;
- 在測試環境驗證選擇器後,再逐步擴大授權範圍內的任務;
- 接入內部排程時保留逾時、限速與人工停止機制。
需要注意的是,任何瀏覽器自動化工具都不能把未經允許的資料採集變成合規行為,也不應用於繞過驗證碼、封禁、付費牆或平台限制。開始自動化前,應先確認資料來源、權限和用途。需要管理授權瀏覽器工作流程時,可選用合適的瀏覽器自動化管理工具建立測試環境。
常見問題
Web Scraping合法嗎?
沒有適用於所有國家、網站和資料型別的統一答案。需要同時考慮網站條款、存取方式、版權、資料庫權利、個人資料、商業競爭和當地法律。高風險或大規模專案應諮詢專業法律顧問。
robots.txt允許就可以隨便抓嗎?
不可以。robots.txt 是抓取規則,不是版權許可、契約豁免或個人資料處理授權。
抓靜態頁面還是用無頭瀏覽器?
能透過官方 API 或靜態 HTML 獲得資料時優先使用輕量方式;只有目標內容確實依賴 JavaScript 或授權互動時,才使用瀏覽器自動化。
如何避免頁面改版導致髒資料?
保存來源與時間戳,設定欄位驗證和空值率告警,對解析規則做版本管理,並在異常時停止寫入而不是覆蓋歷史資料。
總結
Web Scraping 的核心不是「把頁面抓下來」,而是以可控、可驗證、可維護的方式把網頁資訊轉成結構化資料。一個成熟流程會優先使用官方介面,尊重 robots.txt 和服務條款,控制請求強度,最小化個人資料,並為結構變化和異常狀態設計停止機制。
當權限、資料模型和監控都先於規模擴張,網頁抓取才能真正成為穩定的資料基礎設施,而不是一次性的脆弱腳本。


