Python 網頁爬蟲教學 - 7 個降低 Web Scraping 被偵測與封鎖的實用方法
後設資料
- URL:https://www.learncodewithmike.com/2020/09/7-tips-to-avoid-getting-blocked-while-scraping.html
- 作者:Mike(你的Py教練Mike)
- 發表日:2020-09-20
- 語言:繁體中文
- 平台 / publication:你的Py教練Mike(learncodewithmike.com)
- vault 中的脈絡:vault 中第一個網頁爬蟲 / Python / 工程主題來源 + 第一個明確處理「反偵測 / 反封鎖」工法的來源 + 與 SEO / 技術SEO 形成「同訊號 / 反向意圖」對位(SEO = 想被爬到 / 反爬蟲檢測 = 不想被爬到)
一句話濃縮
網站靠 IP / 請求標頭 / User-Agent / Referer / 請求間隔節奏 / JS 互動行為 / 隱藏連結 hidden link 七個訊號辨認自動化爬蟲;想穩定爬資料就要七個訊號全部模擬人類——同時,倫理底線是「不要請求頻率高到傷害網站對正常使用者的可用性」。
提取要點
為什麼會被封鎖?
- 爬蟲行為 vs 人類行為在多個訊號上有可被分辨的差異
- 單一 IP 短時間大量請求 → 觸發 rate-limit / IP 封鎖
- 統一 User-Agent / 標頭 / 請求節奏 → 形成可辨識指紋
- 倫理前提:作者強調本文目的不是教如何「攻擊」網站,而是降低正常爬資料時被誤判為惡意流量的機率;請求頻率必須控制在不傷害網站可用性的程度
七招(每招一個訊號)
1. IP 位址輪替(IP Rotation)
- 問題:單一 IP 短時間大量請求 = 紅旗
- 解法:使用代理服務(proxy)/ 商業 IP 輪替服務(Scrapingdog / ScraperAPI)
- 個人開發階段可用免費 proxy pool,生產環境通常用付費服務以維持穩定性
- 對位 技術SEO:搜尋引擎自己的爬蟲 IP 是公開的(Google / Bing 都有官方 IP 範圍);反向技巧是「白名單 Google IP,黑名單其他高頻 IP」
2. 請求標頭(Headers)配置
- 問題:requests 預設標頭 =
User-Agent: python-requests/2.x= 明顯告訴對方「我是 Python 爬蟲」 - 解法:複製瀏覽器開發者工具的 Network → Request Headers 整段,貼進 requests 的
headers=參數 - 多數網站靠這一招就能繞過第一層偵測
3. User-Agent 隨機化
- 問題:所有請求用同一個 User-Agent = 同一個瀏覽器指紋
- 解法:
fake_useragentPython 套件自動產生隨機瀏覽器 User-Agent;每次請求換一個 - 對位 技術SEO:搜尋引擎爬蟲的 User-Agent 是公開的(Googlebot / Bingbot),網站可以針對 User-Agent 做差異化內容(動態 cloaking 是黑帽 SEO 紅線)
4. Referer 標頭管理
- 問題:requests 不設 Referer = 看起來像「直接到達」這個頁面,異常
- 解法:用 SEMRush 等 SEO 工具查目標頁的反向連結 / 自然來源,輪替 Referer 模擬真實流量來源(Google search / Facebook / LinkedIn 等)
- 對位 SEO:Referer 是 SEO 工具(SEMRush / Ahrefs)反向連結報告的基礎資料,這裡反過來用 SEO 工具產出爬蟲偽裝素材
5. 隨機延遲(Random Delay)
- 問題:人類瀏覽請求間隔不規律(看 8 秒、5 秒、10 秒、6 秒、20 秒);爬蟲常用固定間隔(每 1 秒一次)= 機械節奏
- 解法:
time.sleep(random.randint(5, 15))每次隨機延遲 - 倫理層意義:隨機延遲同時降低對網站的負載——「不傷害正常使用者」的具體實踐
- 對位 蕃茄鐘工作法 / 時間箱 反向命題:人類自然節奏是不規律,工具強制規律是為了對抗拖延;機器自然是規律,反爬蟲要強制不規律來偽裝
6. 無頭瀏覽器(Headless Browser / Selenium)
- 問題:純 HTTP 請求不執行 JavaScript / 不管理 Cookie / 不渲染 DOM = 無法處理 JS 渲染內容 + 容易被「JS 偵測」識破
- 解法:Selenium 框架啟動 headless Chrome / Firefox,自動執行 JS、管理 Cookie、模擬真實瀏覽器
- 代價:速度慢(要啟動完整瀏覽器)+ 資源吃重 + 設置複雜
- 判斷:如果目標網站是純 HTML 靜態頁面,用 requests + BeautifulSoup 即可;如果有 JS 渲染或 Cookie / Session 流程才上 Selenium
7. 蜜罐陷阱(Honeypot Trap)避開
- 問題:網站會故意在 HTML 裡放人類看不到、爬蟲會跟的隱藏連結(CSS
display:none/visibility:hidden/opacity:0);一旦爬蟲跟了這些連結 → 被打標 → 封鎖 - 解法:
- 不要無腦遞迴跟所有
<a href> - 跟連結前檢查 CSS(display / visibility / opacity)
- 優先用網站 Sitemap.xml(技術SEO 強調的合法公開 URL 清單)作為起點
- 不要無腦遞迴跟所有
- 對位 技術SEO:Sitemap 是 SEO 給搜尋引擎的「合法 URL 入口」,反爬蟲場景反過來變成「爬蟲應該只走這份清單,不要追隱藏連結」——同一個檔案,雙重用途
配套(曼報補充 / vault 整理層)
- HTTP 502 / 429 / 403 反應碼:被偵測 / 被限流 / 被封鎖的具體訊號(本文未明示但業界常識)
- CAPTCHA / Cloudflare / DataDome:商業反爬蟲服務(本文未討論,是目前更難的反爬蟲層)
- 倫理底線:作者反覆強調「不傷害網站對正常使用者的可用性」是優先順位高於技術
- 法律層:robots.txt / 服務條款 / GDPR / CCPA / 美國 hiQ vs LinkedIn 案件等爬蟲合法性討論(本文未深入)
引用的工具
- requests:Python HTTP 請求標準庫
- BeautifulSoup:HTML / XML 解析
- Selenium:瀏覽器自動化框架
- fake_useragent:隨機 User-Agent 套件
- 外部商業服務:Scrapingdog(proxy)/ ScraperAPI(IP rotation)/ SEMRush(反向連結來源)
提取概念
連結到此來源衍生 / 更新的 wiki 頁:
- 網頁爬蟲 — 新建:vault 中第一個網頁爬蟲主題概念頁;umbrella 結構含 7 招反偵測技術 + 倫理底線 + 工具集 + 與 SEO / 技術SEO 的「同訊號 / 反向意圖」對位
- 你的Py教練Mike — 新建(輕量 entity):Python 教學部落格;vault 中第一個 Python / 工程主題的內容供應者;可作為未來 Python / 爬蟲 / 後端開發主題的持續來源
- SEO — 更新:補入「SEO vs 反爬蟲檢測:同訊號 / 反向意圖」段——SEO 想被 Google 爬到,反爬蟲想阻止其他爬蟲爬到,但用的是同一組訊號(User-Agent / Robots.txt / Sitemap / IP 行為);同一個檔案(如 Sitemap)在兩個視角下用途相反但結構一致
- 技術SEO — 更新:補入「Robots.txt + Sitemap 的雙重用途」段——對 SEO 來說是「告訴 Google 來這裡爬」的清單,對反爬蟲來說是「合法爬蟲應該只走這份清單,不要追隱藏連結」的白名單
主觀立場標記
本文是技術工法清單型來源;作者立場明確倫理導向(不傷害網站可用性),不是教爬蟲「攻擊」。vault 處理時保留作者原意——反偵測 ≠ 反偵測即正當;技術可用但倫理 / 法律邊界另有規則。
本期不獨立建 Selenium / BeautifulSoup / requests 等工具實體頁——目前每個工具只在本期提及一次,密度不足;累積 2+ 來源後可拆。
原文(節錄保存)
七招清單
- IP 位址輪替 — 用 proxy / IP 輪替服務(Scrapingdog / ScraperAPI)
- 請求標頭設置 — 從瀏覽器開發者工具複製整段 headers
- User-Agent 隨機化 —
fake_useragent套件- Referer 管理 — 用 SEMRush 等 SEO 工具找反向連結來源輪替
- 隨機延遲 —
time.sleep(random.randint(...)),每次間隔不一樣- 無頭瀏覽器 — Selenium 處理 JS 渲染與 Cookie
- 蜜罐陷阱避開 — 不追
display:none等隱藏連結;優先用 sitemap.xml倫理底線
「我們收集資料時應該保持尊重的態度,避免向網站發出過多請求,影響到正常使用者的瀏覽體驗。」