網頁爬蟲

一句話定義

**網頁爬蟲(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)

來源:2026-05-01-Mike-反爬蟲檢測7招——

#技術對應訊號工具
1IP 位址輪替IP 行為proxy / Scrapingdog / ScraperAPI
2請求標頭設置請求標頭從瀏覽器開發者工具複製整段
3User-Agent 隨機化UA 一致性fake_useragent 套件
4Referer 管理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 生態)

工具用途
requestsHTTP 請求標準庫;靜態頁面爬取首選
BeautifulSoupHTML / 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 反爬蟲檢測:同訊號 / 反向意圖

vault 中最重要的對位SEO / 技術SEO 與本頁用的是同一組訊號,但意圖完全相反——

訊號SEO 視角(想被爬到)本頁視角(不想被爬到)
Sitemap.xml主動告知 Google「來這裡爬」的清單合法爬蟲應該只走這份清單、不追隱藏連結
Robots.txt控制 Google 檢索範圍 + 提交 sitemap反爬蟲方明示哪些路徑「不歡迎自動化」
User-AgentGooglebot / 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 才有價值——對位「輸出決定輸入」原則,避免無目的爬蟲(數據流能埋什麼就埋什麼」反例的爬蟲版)。

相關來源

備註

本頁建立於 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 解構)—— 累積後可整理為元層命題