蜘蛛池知识

蜘蛛池的 CDN 与缓存层:蜘蛛在不同节点上可能拿到不同页面

入口站挂 CDN 很常见,但缓存配置随意时,蜘蛛从不同节点拿到的 HTML 可能并不一致:旧版本、被改造过的版本、甚至被缓存的错误页都会出现。本文梳理缓存影响抓取的几种典型情况,给出对比排查方法和入口页的缓存配置建议。

蜘蛛池知识

蜘蛛池的 CDN 与缓存层:蜘蛛在不同节点上可能拿到不同页面

不少蜘蛛池入口站为了扛访问量、分散 IP,会把域名挂到 CDN 或前置一层反向代理。这本身没有问题,但缓存一旦配得随意,蜘蛛从不同节点看到的就可能是不同版本的页面——你在源站改过的东西,蜘蛛未必看得到。

缓存命中时,蜘蛛看到的是上一次的页面

蜘蛛请求入口页时会带上自己的 UA,但多数 CDN 默认并不区分 UA,缓存的是第一个触发回源的版本。如果这个版本来自普通访客访问,比如带地域跳转、带活动横幅的 HTML,蜘蛛拿到的就是这份被改造过的内容。

  • 页面主体内容与源站不一致,链接被条件判断吞掉
  • 本该跳转的页面被缓存成 200,源站其实已经 404
  • 页面里的外链被替换成本地域名,锚文本对不上

节点差异:同一个 URL,不同机房不同结果

CDN 是分节点缓存的。回源时间与过期时间不一致时,A 节点可能已经是新版本,B 节点还是几天前的旧版本。蜘蛛被调度到哪个节点并不由你决定,于是日志里的抓取结果时好时坏,很难复现。

如果同一入口页在日志里出现两种完全不同的抓取结果,先别急着怀疑蜘蛛,先查缓存。

缓存污染:不该被缓存的响应被存了下来

  1. 源站返回 5xx 或 302,被 CDN 按错误缓存策略存了一个周期,蜘蛛反复拿到同一个错误。
  2. 带查询参数的 URL 大量生成缓存副本,等于给蜘蛛造了一批内容相同的重复页。
  3. 缓存键没带 Vary: User-Agent,移动版与桌面版互相覆盖,只留最后一份。

对比排查的几步

  • 用多地拨测工具或指定节点 IP 抓取,横向比对响应体是否一致。
  • 看 X-Cache、Age、CF-Cache-Status 这类响应头,确认命中的是缓存还是源站。
  • 临时关掉缓存直连源站,先确认源站本身输出正确,再回来看缓存层。
  • 在日志里按 URL 聚合,观察同一页面的响应长度是否稳定。

入口页的缓存配置建议

入口页通常量不大、变化不频繁,其实没必要做长缓存。比较稳妥的做法是:

  • 入口页 HTML 设短缓存或不缓存,源站更新后主动 purge,别等自然过期。
  • 静态资源可以长缓存,但 HTML 不要跟着一起长缓存。
  • 缓存键区分移动端与桌面端,避免两种版本互相覆盖。
  • 明确 404、5xx、跳转的缓存策略,别让错误页面长期驻留。

什么时候可以放心缓存

如果入口页是纯静态、内容基本不变、没有地域跳转和登录态,缓存能明显减轻源站压力,对蜘蛛的响应也更稳定。反过来,只要页面有一处会随访客变化,缓存就要格外小心,通常宁可让它回源。

缓存不是收录开关,它只决定蜘蛛看到什么。看到的是不是你想让它看到的,这件事得自己确认。