蜘蛛池知识

蜘蛛池入口頁被 WAF 拦住了?403、驗證碼頁和空 200 是三個信号

入口頁铺好、連結發出去,抓取量却一直上不去,問题未必在頁面本身。本文梳理 WAF、CDN 與防火墙誤伤蜘蛛的几種典型表現——日誌里查不到請求、返回 403、以及最容易被忽略的「200 空頁」,並给出排查顺序與白名單、限速的調整思路。

蜘蛛池知识

蜘蛛池入口頁被 WAF 拦住了?403、驗證碼頁和空 200 是三個信号

入口頁铺好、連結也放出去了,日誌里却始终只有零星几次抓取,很多人第一反應是頁面质量不够。實际上,不少抓取量上不去的情况,問题出在頁面之前的那一层——WAF、CDN 防護規則或者服務器防火墙,把蜘蛛挡在了门外,而你在源站日誌里什么都看不到。

先分清「没来」還是「被挡」

這两種情况的排查方向完全不同,先看現象再動手:

  • 站点日誌里完全没有對應 IP 的請求记錄:大概率是蜘蛛没發現入口,或者請求在到達源站前就被拦掉了,這时要看 CDN/WAF 日誌而不是源站日誌。
  • 有請求,但狀態碼是 403、406、429、503:典型的拦截或限速,属于「硬拦」。
  • 狀態碼是 200,但返回内容是驗證碼頁、空白頁或一段 JS 挑战脚本:属于「软拦」,最容易被誤判成頁面正常。

常见的誤伤配置

  • 預設規則集過嚴:部分防護模板會把机房 IP 段、無 Referer 請求、非常規 UA 直接判為風險。
  • IP 频率限制:蜘蛛抓取往往来自同一批 IP,短時間高频請求很容易触發限速,入口頁數量一多就更明顯。
  • JS 挑战 / 五秒盾:對所有訪客開啟人机校驗,蜘蛛拿不到校驗结果,只能停在挑战頁。
  • 地域封禁:為了挡掉某些地区的垃圾流量,顺手把蜘蛛常出現的 IP 段也封了。
  • UA 白名單没做校驗:也有站点反過来,只凭 UA 就放行,结果被大量伪造 UA 的請求刷爆,最後干脆一刀切全拦。

怎么排查

  1. 把源站日誌和 CDN/WAF 日誌按時間對齐,看請求是压根没到源站,還是到了之後被拦。
  2. 用 curl 带上蜘蛛的 UA 請求入口頁,看返回的狀態碼和内容,注意跟随跳轉,確認有没有被 302 到驗證頁。
  3. 查看 WAF 拦截明细,重点看被拦請求的 UA、IP 段和触發的規則名。
  4. 用不同 IP、不同频率各测一次,区分是規則拦截還是频率限制。
判断拦截最直接的标准不是狀態碼好不好看,而是蜘蛛實际拿到的 HTML 里有没有你放的連結。返回 200 但正文是挑战脚本,對蜘蛛来说等同于空頁。

調整时把握几個原則

  • 白名單做三重校驗:UA、反向 DNS、IP 段至少對得上两項再放行,只認 UA 等于没有防護。
  • 對已驗證的蜘蛛放開频率限制,對未驗證流量繼續限速,而不是整体關掉。
  • 關閉针對已知蜘蛛的 JS 挑战,让它們直接拿到静態 HTML。
  • 保留可排查的返回:真要拦,返回明确的 403 並记錄日誌,比返回空白 200 好得多。

几個容易踩的坑

為了放蜘蛛把 WAF 整個關掉,是最常见也最亏的做法。防護和放行並不冲突,冲突的是一刀切的思路。另外,換 CDN、換服務器、改解析线路之後,原来的白名單規則不一定跟着迁移,需要重新驗證一遍。還有一点容易被忽略:入口頁數量增加後,抓取频率自然上升,原来够用的限速阈值可能就不够用了,每次扩量後都值得回头看一眼拦截日誌。

把這一层理顺之後,再去讨论頁面质量、連結结构才有意义。否則入口頁做得再细,蜘蛛连门都没進。