蜘蛛池知识

蜘蛛池被拦在门外:CDN 與 WAF 的常见拦截與放行思路

蜘蛛池入口頁上线後抓取量上不去,問题不一定在池子本身。CDN 與 WAF 的速率限制、UA 名單、JS 挑战和地区規則,都可能让爬虫提前止步。本文拆解四類常见拦截来源,给出一套從模拟請求到規則放行的排查顺序,並說明放行时需要注意的邊界。

蜘蛛池知识

蜘蛛池被拦在门外:CDN 與 WAF 的常见拦截與放行思路

搭好蜘蛛池之後,一個常见的困惑是:日誌里明明有爬虫来訪的痕迹,但入口頁的抓取量、目标頁的發現量都上不去。這时候不一定是池子本身出了問题,很可能是入口頁前面那层 CDN 或 WAF 把請求拦掉了。爬虫看到的可能是 403、429、一個驗證頁面,甚至是一段空壳 HTML,而這些在源站日誌里往往只留下一行狀態碼。

為什么這類問题容易被忽略

因為拦截發生在邊缘节点,源站看到的請求本来就已经被過滤過一轮。不少 CDN 預設開啟安全防護或 Bot 管理,會對来源 IP、請求频率、User-Agent、請求头完整性做评分,评分低的直接進入挑战流程。浏览器能执行 JS 通過驗證,而多數搜尋引擎爬虫不會执行這類脚本,结果就是訪問被终止在半路。你從源站日誌看不到異常,只能看到抓取量偏低。

常见的四類拦截来源

速率限制

同一 IP 或同一網段在短時間内产生大量請求,容易被判定為異常流量。蜘蛛池的入口頁如果集中在少數 IP 上,又恰逢爬虫集中来訪,就會触發這類規則。典型表現是 429,或者前几十次正常、之後開始返回挑战頁。

UA 與 IP 名單

有些規則把非主流 UA、空 UA,以及大量来自机房 ASN 的 IP 直接标记為可疑。蜘蛛池常用 VPS 與机房 IP,命中名單後就會被降權或阻断。需要注意,搜尋引擎官方爬虫的 IP 段通常可以反查驗證,而很多規則只匹配 UA 字符串,既容易誤伤正常流量,也容易被伪造绕過。

JS 挑战與驗證碼

這是最难處理的一類。頁面狀態碼是 200,但返回内容是“請稍候”或滑块驗證。爬虫拿到的是一個空壳頁,既讀不到正文,也拿不到連結,入口頁等于白建。判断方法是用不执行 JS 的抓取工具請求一次,和浏览器中看到的内容做對比。

地区與节点策略

部分 CDN 的节点策略、地域封禁、海外訪問限制,會让特定来源的請求直接被拒。如果爬虫来源地区與你的防護策略正好冲突,就會出現人訪問正常、爬虫訪問異常的情况。

一個可执行的排查顺序

  1. 用不带 JS、不带 Cookie 的請求模拟爬虫,看返回的狀態碼和正文。
  2. 對比源站直连與经過 CDN 的返回差异,先確認問题出在哪一层。
  3. 查 CDN 或 WAF 的拦截日誌,按 URL、来源 IP、UA、命中規則去筛。
  4. 检查是否命中速率規則,把請求時間拉開後再试一次。
  5. 核對白名單是按搜尋引擎 IP 段配置,還是只匹配了 UA 字符串。

放行时要注意的几点

  • 優先按 IP 段放行,而不是只放行某個 UA,避免規則被伪造滥用。
  • 放行范围尽量收窄到入口頁路径,不要為了省事把整站防護一次關掉。
  • 缓存策略與挑战策略分開設定,静態入口頁可以走缓存,挑战不要套在爬虫路径上。
  • 改完規則後留出观察期,用抓取日誌確認狀態碼分布是否恢复正常。
  • 保留變更记錄,一次只調整一個變量,否則很难判断是哪條規則起了作用。
需要提醒的是,把拦截問题解决掉,只是让门重新打開。抓取能不能進一步轉化成收錄和排名,仍然取决于目标頁本身的内容质量與站点整体表現,CDN 與 WAF 不负责後面的结果。

蜘蛛池的很多問题,最後都會回到“請求有没有正常到達”。在下判断说池子没效果之前,先用一次干净的模拟請求確認鏈路通畅,往往能省下不少来回折腾的時間。