蜘蛛的請求,先到 CDN,再到源站
排查抓取問题时,很多人的第一反應是打開源站日誌。但如果站点前面挂了 CDN 或反向代理,蜘蛛的請求往往先落在邊缘节点上——命中缓存就直接返回,根本不會走到源站。這时候源站日誌里一片安静,很容易被誤判成蜘蛛没来,方向從一開始就偏了。
一次抓取請求會经過哪几层
- DNS 解析:蜘蛛把域名解析到 CDN 提供的节点地址,而不是源站 IP。
- 邊缘节点:判断该 URL 有没有可用的缓存副本,是否需要按 UA、Cookie 做区分。
- 回源:缓存未命中或已過期时,节点才向源站發起請求。
- 源站返回:源站的狀態碼和响應头會被节点记錄,其中一部分會被缓存下来。
也就是说,蜘蛛看到的頁面,有可能是几分钟前的,也可能是几天前的,取决于缓存策略怎么设。
缓存命中时,蜘蛛拿到的可能不是最新内容
舊版本 HTML 被缓存
HTML 文档如果被设了較長的缓存時間,頁面更新之後,蜘蛛在缓存有效期内訪問到的仍是舊版本。结果就是内容已经改了,抓取记錄里却看不出任何變化。
错誤狀態碼被缓存
更麻烦的是狀態碼。源站因為一次短暂故障返回 500 或 502,如果這類响應被节点缓存下来,蜘蛛在接下来一段時間里會反复拿到 5xx。反過来,頁面在被删期間返回 404 並被缓存,即使後来恢复上架,蜘蛛仍可能繼續拿到 404。這類問题在源站日誌里往往看不到痕迹。
多节点版本不一致
不同地区的节点回源時間不同,同一個 URL 在不同节点上的版本可能不一样。蜘蛛從不同出口 IP 抓取时,看到的结果就會出現差异,表現成时好时坏、飘忽不定。
几個可以自查的信号
- 源站日誌里缺少某段時間的蜘蛛记錄,但 CDN 訪問日誌里有。
- 頁面已经更新,蜘蛛抓取之後缓存里仍是老内容。
- 同一個 URL 的狀態碼在 200、404、5xx 之間来回跳。
- 不同地区抓取结果不一致,或者只有部分节点表現異常。
- 蜘蛛 UA 被 WAF 或人机校驗拦下,返回的是驗證頁而不是正文。
把缓存策略和抓取策略對齐
- HTML 文档不要设過長的缓存時間,或改用协商缓存,让节点能及时向源站確認版本。
- 静態资源如 CSS、JS、图片可以長缓存並加上指纹,它們不參與 URL 發現。
- 源站返回 5xx 时,明确告诉 CDN 不要缓存這類响應。
- 希望蜘蛛看到與用戶一致的内容时,注意 Vary 头、UA 白名單和缓存键的设計。
- 更新 URL、robots.txt、Sitemap 之後,把刷新流程走一遍,不要只改源站。
- 把 CDN 訪問日誌和源站日誌按時間對齐来看,才能還原完整的抓取路径。
別让安全策略把蜘蛛当成攻击者
有些站点為了防采集,開了频率限制或 JS 挑战。處理不当會出現两種结果:一是蜘蛛直接拿到 403、429;二是返回 200,但正文是校驗脚本,蜘蛛拿到的是空壳。後者更难發現,因為狀態碼看上去完全正常,和软 404 的表現很像。
缓存层的目标是让訪問更快,不是让内容更难被發現。凡是會让蜘蛛拿到的版本與真實内容不一致的設定,都值得重新检查一遍。
做站点运营时,把抓取問题只当成源站問题,很容易漏掉中間那一层。养成同时看 CDN 日誌、源站日誌和缓存命中率的习惯,很多看似莫名其妙的現象,其實都能找到出處。