不少人在入口頁上线之後习惯性套一层 CDN 和安全防護,图的是稳定和抗压。但抓取量下降、日誌變少、頁面迟迟没有動静,問题常常不在頁面本身,而在源站和蜘蛛之間的那一层中間服務。這一层做得好是缓冲,做得不好就是一道看不见的门。
CDN 對蜘蛛抓取的两面性
CDN 的預設目标是给真人用戶加速,缓存策略以“尽快返回”為優先;而蜘蛛關心的是“拿到的是不是最新、最完整的版本”。两者目标不一致时,就會出現下面几種情况。
蜘蛛抓到的是缓存里的舊版本
如果入口頁的缓存 TTL 设得很長,你更新了标题、内容或連結结构,蜘蛛第一次来仍然拿到舊 HTML。它不會报错,只是繼續按舊版本理解這個頁面。入口頁本来就靠内容變化维持抓取兴趣,缓存時間過長等于把更新节奏掐掉了。
回源變少,源站日誌看不到蜘蛛
缓存命中率高的时候,大量請求在邊缘节点就被消化了,源站日誌里几乎看不到蜘蛛的身影。這时候如果只看源站日誌,很容易誤判成“蜘蛛不来了”,實际上蜘蛛来了,只是没走到源站。判断抓取情况要把 CDN 侧的訪問日誌一起看。
节点分布與蜘蛛来源不匹配
蜘蛛的抓取出口和你選的加速区域不一定重合。加速区域只覆盖了部分地区的用戶,蜘蛛可能從別的线路過来,走到的是没有優化的路径,首字节時間反而更長。
WAF 與安全策略的常见誤伤
安全防護的預設規則是按“像不像正常用戶”来判断,而蜘蛛的訪問特征恰恰和爬虫很像——短時間内大量請求、固定 UA、不执行 JS、不带 Cookie。以下几類配置最容易誤伤:
- 速率限制:入口頁被集中抓取时触發限流,直接返回 429 或 403。
- UA 黑名單:批量拉黑爬虫類關鍵詞时,把正規蜘蛛也一起挡了。
- JS 挑战與人机校驗:蜘蛛不执行 JS,拿到的是一段空壳頁面或校驗頁。
- 地区封禁:蜘蛛出口所在地区被封,請求直接被拒。
- Cookie 與指纹校驗:没有會话记錄的訪問一律被判定為異常。
這些規則在防護真實攻击时是有效的,但用在入口頁上,需要给已知蜘蛛留出明确的放行規則,而不是靠調低整体阈值来“顺便”放行。
出問题时先查哪一层
排查顺序建议從最靠近源站的地方往外推,避免一上来就改頁面:
- 直连源站測試:用临时域名或本地 hosts 指向源站 IP,確認源站本身能正常返回 200 和完整 HTML。
- 對比带 CDN 的结果:同一 URL 分別走源站和走 CDN,看狀態碼、响應体長度、响應头是否一致。
- 看响應头:X-Cache、CF-Cache-Status、Age、Server 等字段能看出是命中缓存、回源,還是被防護层拦下。
- 看两侧日誌:CDN 日誌和源站日誌對照,確認請求到了哪一层、被谁拦下。
- 检查被缓存的文件:robots.txt、sitemap、入口頁 HTML 是否被長時間缓存,導致蜘蛛讀到過期内容。
配置上的几條實用建议
- 给已知蜘蛛的 UA 和 IP 段設定顯式放行,優先級高于通用限流規則。
- 入口頁 HTML 的缓存 TTL 设短一些,静態资源可以長,两者分開配置。
- 關閉作用在入口頁上的 JS 挑战和驗證碼,防護重点放在後台和管理路径。
- 保留真實訪客 IP 的日誌字段,否則日誌里全是 CDN 节点 IP,没法区分蜘蛛和普通請求。
- 留一條不经過 CDN 的直连通道,方便快速判断問题到底出在哪一层。
- 如果安全产品會把請求轉發到拦截頁,確認那個拦截頁返回的狀態碼不是 200。
CDN 和 WAF 本身不是問题,問题在于預設配置是给真人流量设計的,而蜘蛛的訪問方式和真人差得很遠。要么在規則里给蜘蛛單獨開一條路,要么接受抓取量被削掉一部分。
最後提醒一点:入口頁數量多、域名杂,很容易触發共享的防護阈值,出現“一個入口頁被限流,整批入口頁跟着受影响”的连鎖反應。给蜘蛛池單獨划一個防護策略或獨立域名分组,比事後一個個排查要省力得多。