常见问题

入口页被 CDN 缓存后,搜索蜘蛛拿到的可能是旧版本

蜘蛛池入口页明明更新了目标 URL,日志里却迟迟看不到新抓取,问题常常出在缓存层:CDN、Nginx 或框架级页面缓存会把旧版 HTML 反复交给搜索蜘蛛。本文说明缓存错位的常见场景、如何用响应头和 UA 对比来确认问题,以及入口页缓存时间该怎么设、什么时候需要主动刷新缓存。

常见问题

入口页被 CDN 缓存后,搜索蜘蛛拿到的可能是旧版本

维护蜘蛛池入口页时常会遇到一种情况:后台明明加了新一批目标 URL,搜索蜘蛛日志里却迟迟看不到对应抓取,甚至十几天后抓到的还是老版本的链接列表。这不一定说明入口页失效,很可能是缓存层把旧 HTML 反复交给了搜索蜘蛛。

缓存为什么会让搜索蜘蛛看到旧页面

搜索蜘蛛本质上是一个不带 Cookie、不发 POST、请求行为比较规律的 HTTP 客户端。如果入口页前面挂着 CDN、Nginx 缓存、对象存储或框架级页面缓存,那么第一次抓取把 HTML 存进缓存之后,后续所有请求——包括搜索蜘蛛的请求——都会拿到同一份副本,直到缓存过期或被主动刷新。你在后台更新的链接列表,在缓存过期前蜘蛛是看不到的。

三种常见的“缓存错位”场景

  • CDN 把 HTML 也缓存了。很多 CDN 默认只缓存静态资源,但如果入口页被设成“缓存全部”,或者缓存规则写得过宽,HTML 也会被长时间缓存,刷新周期可能从几小时到几天不等。
  • 页面缓存没有按 URL 区分。某些程序按栏目或模板做整页缓存,你更新了 A 列表,结果返回的却是 B 列表或旧模板,蜘蛛抓到的链接和目标对不上。
  • 源站更新了,边缘节点没回源。缓存时间还没到,回源规则又比较宽松,蜘蛛就一直被边缘节点挡在外面,看到的是旧副本。

怎么确认是缓存问题而不是抓取问题

  1. 用浏览器无痕窗口打开入口页,再用 curl 带上搜索蜘蛛的 UA 请求同一地址,对比两次返回的 HTML 是否一致。不一致基本可以判断存在 UA 维度的缓存分流。
  2. 看响应头里的 AgeX-CacheCF-Cache-Status 这类字段,出现 HIT 说明命中的是缓存副本。
  3. 把日志里蜘蛛的抓取时间和入口页实际更新时间放在一起看。如果抓取时间晚于你的更新时间,返回内容却是旧的,属于缓存问题;如果抓取时间明显滞后于更新时间,更可能是抓取频率本身偏低。
  4. 手动刷新一次缓存,再观察一到两个抓取周期,看新链接是否出现在日志里。

减少影响的几个常规做法

  • 入口页这类需要频繁更新链接的 HTML,尽量设置较短的缓存时间,或在缓存规则里直接排除。
  • 为入口页配置合理的 Cache-Control 以及 ETagLast-Modified,让缓存层在内容变化时能拿到新版本。
  • 更新链接后主动刷新一次缓存,而不是干等缓存自然过期。
  • 把“入口页能否被稳定读取”列进日常巡检,而不是出了问题才回头查。
缓存不会直接决定收录,但它会决定搜索蜘蛛能不能看到你新加的那批 URL。

几个常见误解

有人觉得只要 URL 提交接口返回成功、入口页用浏览器能打开,蜘蛛就一定能看到新链接。实际上接口只负责把地址递出去,抓取时拿到什么内容,取决于缓存层给的是哪一份副本。也有人认为缓存只影响蜘蛛不影响用户,其实用户看到旧内容的概率是一样的,只是用户不会去翻日志。

排查这类问题时,建议把入口页的“返回内容版本”和“被抓取时间”一起记录下来。长期对比之后,你会更容易判断抓取量波动是缓存造成的,还是抓取策略本身发生了变化。