常见问题

入口页被 CDN 缓存了旧版本,搜索蜘蛛抓到的链接是哪一份

入口页更新了链接,搜索蜘蛛抓到的却还是旧版本,通常不是抓取环节出了问题,而是 CDN 或页面缓存返回了旧 HTML。本文说明蜘蛛实际看到的究竟是哪一份内容、缓存如何影响新链接的发现、怎样用响应头和无缓存请求来确认,以及刷新缓存与设置 TTL 的实用做法。

常见问题

入口页被 CDN 缓存了旧版本,搜索蜘蛛抓到的链接是哪一份

做蜘蛛池的人经常会遇到这种情形:入口页明明已经换了新一批目标 URL,可日志里搜索蜘蛛抓的还是上一批;自己用浏览器打开入口页,看到的也是旧链接。多数时候不是蜘蛛不认新内容,而是它拿到的 HTML 本身就是旧的那一份,缓存层把更新挡在了外面。

搜索蜘蛛看到的是哪一份内容

搜索蜘蛛发出的是普通 HTTP 请求,它拿不到所谓的最新版本,只能拿到请求那一刻服务器返回的 HTML。中间只要隔着 CDN、反向代理、页面缓存插件或者对象存储的静态快照,返回的就是缓存节点上的那一份。因此,入口页里的链接能不能被发现,前提是这份缓存副本里确实含有那些链接。

入口页更新的时间点,不等于搜索蜘蛛看到新链接的时间点。两者之间隔着缓存过期的时间窗口。

缓存会怎样影响 URL 发现

  • 新链接延迟出现:缓存未过期前,新加的目标 URL 不会出现在蜘蛛拿到的 HTML 里,自然不会被顺着抓走。
  • 旧链接持续被抓:已经下线的链接如果还留在缓存副本里,蜘蛛会继续按旧版本访问,日志中就会出现一批本该消失的 URL。
  • 不同节点结果不一致:多地 CDN 节点回源节奏不同,可能出现部分节点已更新、部分还是旧版,抓取表现看起来时好时坏。

怎么确认是缓存导致的

  1. 用带随机查询串或明确禁止缓存的请求访问入口页,把返回的 HTML 与蜘蛛日志里的链接做个对比。
  2. 查看响应头里的 Age、X-Cache、CF-Cache-Status 一类字段,判断命中的是缓存还是回源。
  3. 从不同地区或不同线路请求同一个入口页,看返回内容是否一致。
  4. 把改动前后的 HTML 快照保存下来逐条对比,比凭印象判断可靠得多。

处理建议

更新入口页后,第一件事是主动刷新缓存,而不是干等它自然过期。CDN 一般提供刷新或清理接口,把入口页的真实 URL 提交一遍,多数情况下几分钟内就能让新版本生效。

入口页的缓存时长要跟更新频率匹配。更新频繁的入口页用较短的 TTL 更合适;长期不动的入口页可以放长一些,减少回源压力。如果入口页是程序动态生成,注意别把整页设成长期缓存,否则每次换链接都得人工清理。

另外,入口页的链接列表最好带上可对账的标记,比如按上下线时间排序。这样当发现蜘蛛抓的和当前列表对不上时,能较快判断是缓存停留在旧版本,而不是链接本身写错或拼错。

不建议的做法

  • 为了绕开缓存而频繁更换入口页 URL。旧入口页仍会留在蜘蛛的抓取队列里,等于多出一批无意义的抓取。
  • 对入口页直接关闭所有缓存。回源压力上去后,抓取高峰时更容易超时,对蜘蛛并不友好。
  • 只刷新首页,忘了入口页所在的具体路径。刷新要精确到实际被抓的那个 URL。

缓存本身不是问题,问题在于更新和缓存过期之间的时间差没有被意识到、也没有被管理。把缓存刷新纳入入口页更新的常规流程,并让 TTL 与更新节奏对齐,大多数所谓“蜘蛛不来抓新链接”的情况都会明显减少。