常见問题

蜘蛛池入口頁被 WAF 或 CDN 拦截搜尋蜘蛛,目标 URL 還能被發現吗?

入口頁挂了 WAF、CDN 或限速規則後,搜尋蜘蛛可能拿到 403、429、503,或者一個返回 200 的驗證碼空壳頁,目标 URL 因此一直没被解析。本文拆解不同层拦截的差別、如何用日誌和反向 DNS 判断蜘蛛是否真被抓取,以及放行與驗證的可行做法。

常见問题

蜘蛛池入口頁被 WAF 或 CDN 拦截搜尋蜘蛛,目标 URL 還能被發現吗?

蜘蛛池入口頁能不能發挥作用,前提是搜尋蜘蛛真的抓到了那個頁面。但不少站点在入口頁前面挂了 WAF、CDN 或自建防火墙,结果蜘蛛請求被拦下,返回 403、429,甚至一個驗證碼頁,入口頁里的目标 URL 自然也就無從被發現。這里把拦截的几種情况拆開说。

先看清楚拦截發生在哪一层

不同层的拦截,蜘蛛看到的结果完全不一样:

  • 網絡层:按 IP、IP 段或地区直接拒绝,蜘蛛可能连连接都建不起来,源站日誌里看不到任何請求记錄。
  • UA 與請求头层:识別 User-Agent 或缺失的請求头,直接返回 403。
  • 频率层:短時間内請求過多触發限速,返回 429 或 503。
  • 人机校驗层:返回 JS 挑战或驗證碼頁面,HTTP 狀態碼通常還是 200。

被拦截时,蜘蛛實际看到了什么

403、429、503 這類狀態碼,等于明确告诉蜘蛛這次抓取失敗。多數搜尋引擎會在一段時間後重试,但如果長期如此,抓取频率會明顯下降,入口頁上的連結也就一直没机會被解析。返回 503 时,如果能在响應头里带上 Retry-After,给出一個明确的重试時間,比让蜘蛛反复试错要友好一些。

更麻烦的是返回 200 的驗證碼頁或空壳頁。狀態碼正常,蜘蛛會当成一次成功的抓取,把頁面解析一遍,可頁面里既没有正文也没有目标連結。抓取額度被消耗掉了,URL 發現却没有發生,日誌上還會顯示蜘蛛来過。

判断标准很简單:蜘蛛拿到的 HTML 里有没有可解析的 a 标簽。没有,這次抓取對 URL 發現就是無效的。

怎么確認是被拦了,而不是蜘蛛没来

  1. 查服務器訪問日誌,按搜尋引擎官方公布的 IP 段過滤,看有没有對應的請求记錄。
  2. 對出現的 IP 做反向 DNS 查询,確認域名归属,不要只看 User-Agent。
  3. 統計响應碼分布,看這些請求是否集中在 403、429、503。
  4. 用工具模拟不同 UA 請求入口頁,對比返回内容是否一致。
  5. 確認 CDN 或 WAF 侧是否有獨立的拦截日誌,很多拦截根本不會落到源站日誌里。

想让發現能力恢复,可以調整的方向

  • 在 WAF 中為已通過驗證的搜尋引擎 IP 段放行,同时保留反向 DNS 校驗,而不是只匹配 UA 字符串。
  • 對来自搜尋引擎的請求關閉 JS 挑战和驗證碼,直接返回静態 HTML。
  • 给入口頁設定獨立的限速規則,不要和普通用戶請求共用同一個阈值。
  • 保持入口頁連結以普通的 a 标簽加 href 形式輸出,不依赖脚本渲染後再拼出地址。
  • 如果确實没法放開拦截,可以把 URL 發現渠道分散到 sitemap 或 HTTP Link 响應头,而不是死磕入口頁這一條路。

入口頁數量多时,拦截的代價會被放大

如果同一批入口頁部署在相近的 IP 段上,一個網段被整体限速,往往會牵连整批頁面。這種情况下,比起逐個調整 WAF 規則,更實际的做法是把入口頁分散到不同 IP、不同域名,避免一個节点出問题就全量停摆。

两個常见誤区

一是認為只靠 User-Agent 白名單就够了。UA 可以随意伪造,正規做法是 UA 加 IP 反查双重驗證,既拦住假冒流量,也不誤伤真蜘蛛。

二是認為拦截只是影响抓取速度。實际上当入口頁對蜘蛛始终不可讀时,它连“被發現的頁面”都算不上,後續所有依赖它传递連結的环节都不會啟動。