網頁爬蟲
一句話定義
**網頁爬蟲(Web Scraping)**是用程式自動讀取網頁內容並抽取資料的工程實踐;穩定爬資料的核心技術問題不是「怎麼解析 HTML」(那是 BeautifulSoup 一行的事),而是「怎麼不被網站偵測為機器人並封鎖」——亦即同步模擬人類在 IP / 標頭 / 節奏 / 互動行為等多個訊號上的不規則性。倫理底線:請求頻率不能高到傷害網站對正常使用者的可用性。
核心要點
1. 為什麼會被偵測 / 封鎖
網站靠以下訊號區分人類 vs 爬蟲:
- IP 行為:單一 IP 短時間大量請求 = 紅旗
- 請求標頭:requests 預設標頭
User-Agent: python-requests/2.x= 直接告訴對方 - User-Agent 一致性:所有請求同一個 UA = 機械指紋
- Referer 缺失:直接到達深層頁面而沒有來源頁 = 異常
- 請求節奏:固定間隔 / 等距規律 = 機器特徵
- JavaScript 互動:純 HTTP 請求不執行 JS / 不管 Cookie = 無法處理現代 SPA + 容易被 JS 偵測識破
- 隱藏連結追蹤:蜜罐陷阱——人類看不到的
display:none連結,爬蟲跟了就被打標
2. 七招反偵測技術(Mike 2020)
| # | 技術 | 對應訊號 | 工具 |
|---|---|---|---|
| 1 | IP 位址輪替 | IP 行為 | proxy / Scrapingdog / ScraperAPI |
| 2 | 請求標頭設置 | 請求標頭 | 從瀏覽器開發者工具複製整段 |
| 3 | User-Agent 隨機化 | UA 一致性 | fake_useragent 套件 |
| 4 | Referer 管理 | Referer 缺失 | SEMRush 找反向連結輪替 |
| 5 | 隨機延遲 | 請求節奏 | time.sleep(random.randint(...)) |
| 6 | 無頭瀏覽器 | JS 互動 | Selenium + headless Chrome |
| 7 | 蜜罐陷阱避開 | 隱藏連結 | 檢查 CSS / 優先用 sitemap.xml |
核心精神:每一招對應一個訊號;七個訊號全部模擬人類才是穩定爬資料的條件——任一招缺漏都可能形成識別指紋。
3. 倫理底線(不可繞開)
「我們收集資料時應該保持尊重的態度,避免向網站發出過多請求,影響到正常使用者的瀏覽體驗。」(你的Py教練Mike)
- 倫理優先於技術:技術上能繞過偵測 ≠ 應該繞過。請求頻率 / 並行度 / 總量都要控制在不傷害網站可用性的程度
- 隨機延遲的雙重意義:第 5 招「隨機延遲」同時是反偵測 + 反過載——間隔拉長到 5-15 秒既偽裝人類,也對網站友善
- 法律 / 服務條款層:robots.txt / TOS / GDPR / CCPA / 美國 hiQ vs LinkedIn 案件——技術可行 ≠ 法律允許
4. 工具堆疊(Python 生態)
| 工具 | 用途 |
|---|---|
| requests | HTTP 請求標準庫;靜態頁面爬取首選 |
| BeautifulSoup | HTML / XML 解析;DOM 元素抽取 |
| Selenium | 瀏覽器自動化;處理 JS 渲染 / Cookie / Session |
| fake_useragent | 隨機 User-Agent 產生 |
| Scrapy | 大型爬蟲框架(本期未涉及,未來可累積) |
判斷層:靜態 HTML → requests + BeautifulSoup;JS 渲染 / Cookie 流程 → 升級 Selenium(速度與資源代價較高)。
5. 系統設計視角:爬蟲不是單機腳本
2026-05-14-搞定系統設計面試 把網路爬蟲放進 系統設計 案例,而不是單純的 Python 腳本。這補上本頁原本偏「反偵測與資料抽取」的視角:大型爬蟲要處理的是任務調度、去重、禮貌性抓取、解析、儲存與可擴展性。
| 元件 | 作用 |
|---|---|
| URL frontier | 管理待抓 URL,控制優先級與重試 |
| HTML downloader | 多 worker 下載頁面,可用一致性哈希分散負載 |
| parser / extractor | 從 HTML 抽取內容與新連結 |
| dedup | 避免同一頁或同一內容重複抓取 |
| robots / politeness | 尊重 robots.txt、控制抓取頻率,避免傷害網站 |
| queue / storage | 把抓取、解析與儲存解耦 |
| monitoring | 監控失敗率、抓取速度、queue backlog 與被封鎖訊號 |
這讓爬蟲有兩個層次:小規模資料取得時是腳本工程;大規模持續抓取時是 分散式系統元件 的組合題。
SEO vs 反爬蟲檢測:同訊號 / 反向意圖
| 訊號 | SEO 視角(想被爬到) | 本頁視角(不想被爬到) |
|---|---|---|
| Sitemap.xml | 主動告知 Google「來這裡爬」的清單 | 合法爬蟲應該只走這份清單、不追隱藏連結 |
| Robots.txt | 控制 Google 檢索範圍 + 提交 sitemap | 反爬蟲方明示哪些路徑「不歡迎自動化」 |
| User-Agent | Googlebot / Bingbot 是公開白名單 | 偽造瀏覽器 UA 偽裝人類;高頻 UA 是偵測訊號 |
| IP 行為 | Google IP 是公開範圍,可白名單 | 自動化 IP 行為(高頻 / 集中)是偵測訊號 |
| Referer | 反向連結是 SEO 排名訊號 | 偽造 Referer 模擬真實來源輪替 |
範式價值:SEO 與反爬蟲是同一個機制的兩個出口——同一個 sitemap.xml,對 Google 來說是「歡迎爬」,對 ScraperAPI 來說是「合法清單」;同一個 robots.txt,對搜尋引擎是「指南」,對自動化爬蟲是「禁區圖」。理解兩者對位有助於同時看清網站「想被誰看到 + 不想被誰看到」的雙向設計。
與其他概念的關係
- 與 SEO / 技術SEO 對位:同訊號 / 反向意圖——詳見上節「SEO vs 反爬蟲檢測」對位表。本頁與 技術SEO 是 vault 中第一對「同機制反向用途」概念。
- 與 結構化資料 連結:Sitemap / Schema.org 都是網站給合法爬蟲的「結構化提示」;本頁第 7 招「優先用 sitemap.xml」是把這個 SEO 公開資源當作反爬蟲場景的合法白名單。
- 與 時間箱 / 蕃茄鐘工作法 反向命題:人類自然節奏是不規律的,工具強制規律是為了對抗拖延(時間箱 / 蕃茄鐘);機器自然是規律,反爬蟲要強制不規律來偽裝人類。規律 vs 不規律的雙向使用範式。
- 與 AI輔助開發 連結:爬蟲程式碼產出是 LLM 輔助開發的高頻場景(HTML 解析 / XPath / CSS selector / 例外處理);爬蟲是獨立工程任務而非「駐留 agent」場景,工具偏腳本級。
- 與 系統設計 / 分散式系統元件 連結:當爬蟲從一次性腳本升級為大型持續抓取系統,就需要 URL frontier、佇列、去重、分散式下載器、儲存、監控與節流。
- 與 Actionability 連結:爬到資料是 input 層;資料能服務具體 Project 才有價值——對位「輸出決定輸入」原則,避免無目的爬蟲(數據流 「能埋什麼就埋什麼」反例的爬蟲版)。
相關來源
- 2026-05-01-Mike-反爬蟲檢測7招 — Mike / 你的Py教練Mike / 2020-09-20;vault 中第一個網頁爬蟲 / Python / 工程主題來源;本頁的七招清單與倫理底線完整來自此來源
- 2026-05-14-搞定系統設計面試 — 補入分散式爬蟲架構視角:URL frontier、去重、下載器、parser、robots / politeness、佇列與監控
備註
本頁建立於 vault 第一個工程主題來源 ingest。網頁爬蟲是 Python 後端 / 資料工程 / 自動化的核心技能;本期透過 你的Py教練Mike 的「7 招反偵測」清單建立 vault 第一個錨點。
未來累積方向:
- (a) 工具實體頁:Selenium / BeautifulSoup / requests / Scrapy —— 累積 2+ 來源後可拆
- (b) 蜜罐陷阱 獨立概念頁:本期僅作為第 7 招內嵌;累積 2+ 安全 / 反爬蟲主題來源後可拆
- (c) 商業反爬蟲服務:CAPTCHA / Cloudflare / DataDome / PerimeterX —— 是目前更難的反爬蟲層;本期未涉及
- (d) 法律 / 服務條款層:robots.txt 法律地位 / hiQ vs LinkedIn / GDPR / CCPA / 美國 CFAA —— 技術 + 法律雙軌
- (e) 大型爬蟲架構:Scrapy / 分散式爬蟲 / 增量爬取 / 資料 dedup / 任務佇列(Celery / Redis);2026-05-14-搞定系統設計面試 已補入第一個系統設計入口
- (f) AJAX / SPA 爬取:Mike 文章中其他文章涉及;本期未深入
- (g) 反爬蟲偵測的 ML 視角:行為指紋(mouse movement / typing rhythm)/ 瀏覽器指紋(canvas / WebGL)—— 比本期七招更深的偵測層
- (h) 同訊號 / 反向意圖範式擴展:除 SEO vs 反爬蟲外,vault 中可能還有同類對位(例:個人品牌 vs 人設 崩塌風險:同訊號的展現 vs 解構)—— 累積後可整理為元層命題