常见問题

入口頁被 WAF 拦截返回 403,搜尋蜘蛛還能發現里面的連結吗?

入口頁突然只對搜尋蜘蛛返回 403 或彈驗證頁,連結發現鏈條就断了。本文区分 403、429 和 200 驗證頁三種情况,說明蜘蛛在不同返回下會怎么處理,並给出用日誌和响應体確認拦截来源的步骤,以及調整 WAF 規則时该注意的地方。

常见問题

入口頁被 WAF 拦截返回 403,搜尋蜘蛛還能發現里面的連結吗?

做蜘蛛池的时候,入口頁能不能被正常抓取,往往决定了後面的目标 URL 有没有机會被看到。有人會突然發現入口頁的日誌没了,用浏览器打開一看,頁面彈出一個「請完成安全驗證」,或者干脆返回 403。這时候第一個問题就是:搜尋蜘蛛還會顺着這些入口頁發現目标 URL 吗?

先分清几種「被拦」的情况

虽然都表現為蜘蛛抓不到,但原因差別很大,處理方式也不一样:

  • 403 / 401:服務器直接拒绝了請求。可能是 WAF 規則把搜尋引擎的 UA 或 IP 段拦了,也可能是目錄權限配置错了。
  • 429 或 503:限流。請求量短時間内超過阈值,服務器主動让客戶端慢一点。
  • 200 加驗證頁:最隐蔽的一種。服務器返回狀態碼 200,内容却是 JS 挑战、滑块,或者一句「正在驗證」。

403 的情况下,蜘蛛基本看不到連結

搜尋蜘蛛拿到 403,等于没拿到 HTML。頁面里寫多少連結都没用,因為連結压根没進入解析环节。少數情况下蜘蛛會隔一段時間重试,但如果 403 一直存在,重试频率會下降,最终可能把這個 URL 在抓取队列里降權甚至移除。

值得一提的是,403 影响的主要是這個入口頁本身。也就是说,如果你的入口頁對普通訪客正常、只對蜘蛛返回 403,那目标 URL 不會因為這個入口頁被直接惩罚,但發現渠道确實断了。

返回 200 驗證頁,問题更麻烦

因為狀態碼是 200,蜘蛛會把它当成一個正常頁面解析。頁面里如果只有一段 JS 挑战代碼,没有真正的 a 标簽,那連結同样發現不了。更糟的是,蜘蛛可能把這個驗證頁当成入口頁的真實内容,長期缓存下来,下次再来還是這一張空纸。

所以判断标准不是「頁面能不能用浏览器打開」,而是蜘蛛拿到的 HTML 里有没有它認识的普通連結

怎么確認是不是 WAF 干的

  1. 從服務器日誌里挑几條蜘蛛 UA 的记錄,看返回碼分布。如果 403 集中在蜘蛛 UA 上,而普通 UA 是 200,基本可以确定。
  2. 用不带浏览器特征的方式請求一次,把 UA 換成常见蜘蛛 UA,观察返回碼和响應体大小。
  3. 查看 WAF 或 CDN 後台的拦截日誌,看有没有按 UA、按频率触發的規則。
  4. 對比同一入口頁在直连 IP 和经過 CDN 两種情况下的返回,確認拦截發生在哪一层。

處理方向

  • 不要直接把搜尋引擎 IP 段大范围加白,先確認拦截規則本身是不是誤伤。
  • 把驗證碼、JS 挑战這類規則限定在特定路径或特定請求方式上,別覆盖整個入口頁目錄。
  • 如果是频率触發的,降低入口頁的請求密度,通常比繼續加頁面更有效。
  • 顺便检查 robots.txt 和 meta robots,別让它們和 WAF 規則叠在一起,把問题搅成一团。
  • 尽量避免那種「打開就是空白、随後自動跳轉」的入口頁形態,它對人和對蜘蛛都不友好。
一句话總结:蜘蛛發現連結的前提是拿到可解析的 HTML。403 拿不到,200 驗證頁等于拿到一張空纸,两種情况的结论都是發現不了目标 URL。

最後提醒一句,拦截和抓取是两件事。放開拦截只是恢复了入口頁的可訪問性,至于目标 URL 會不會被收錄、多久被抓,還要看它自身的质量、站点整体情况和抓取预算。別把「蜘蛛被拦住」当成排查的终点。