很多站长遇到过一个看着很矛盾的现象:源站入口页里明明已经加上了新的目标 URL,用浏览器打开也能看到,但搜索蜘蛛就是不跟进。查日志会发现蜘蛛确实来过,只是抓到的 HTML 和现在源站的内容不一样。这种情况大概率不是蜘蛛的问题,而是 CDN 缓存层返回了旧版本页面。
为什么 CDN 会让搜索蜘蛛看到旧 HTML
CDN 的默认缓存键通常只有 URL,不看访问者是谁。只要边缘节点的缓存还没过期,请求就不会回源,节点上存的是什么,蜘蛛拿到的就是什么。源站更新链接之后,如果没触发刷新,蜘蛛在接下来的缓存周期里看到的仍然是旧页面,新链接自然不会被发现。
几种比较常见的情形:
- 入口页属于“常驻缓存”,TTL 设置得很长,链接更新后没有主动刷新或预热。
- 缓存规则里对爬虫 UA 做了单独分流,部分节点返回源站内容,部分节点返回缓存内容,表现为抓取结果忽新忽旧。
- 入口页配置了 Vary: User-Agent 或 Vary: Cookie,搜索蜘蛛拿到的可能是精简版、甚至不含链接的版本。
- CDN 的 Bot 防护或频率限制把搜索蜘蛛误判为普通爬虫,返回验证页或 429,页面里没有可解析的链接。
哪些情况影响最大
如果入口页的角色就是“把链接暴露给蜘蛛”,那么缓存带来的偏差会被直接放大:源站更新得再勤,蜘蛛看到的始终是上一版。尤其是下面两类站点要特别注意。
- 入口页链接是程序按时间动态生成的,页面内容变化频繁,但缓存 TTL 仍按静态资源设置。
- 入口页承担了反爬与限流职责,CDN 规则对非浏览器 UA 返回简化页面,蜘蛛能进来但拿不到完整 HTML。
排查顺序
- 用搜索蜘蛛的 UA 直接请求入口页,观察响应头里的 X-Cache、Age、CF-Cache-Status 一类字段,判断这次是命中缓存还是回源。
- 把同一 URL 的源站直连结果与 CDN 返回结果做文本对比,看链接有没有缺失、是否被替换、HTML 是否被截断。
- 检查 CDN 的缓存规则与 UA 黑白名单:入口页是否被长 TTL 缓存,搜索蜘蛛是否被施加了 JS 挑战、验证码或限速。
- 翻 CDN 日志里搜索蜘蛛的请求记录,重点看命中率、状态码分布,以及是否出现 403、429、503。
- 确认压缩与编码正常,gzip、br 在边缘节点上没有把 HTML 截断。
调整思路
- 入口页链接发生增删后,主动调用 CDN 的刷新或预热接口,不要等 TTL 自然过期。
- 入口页 TTL 设短一些,几分钟到一小时即可;它本身不是内容页,没必要长时间缓存。
- 对已确认的搜索蜘蛛 UA 关闭 JS 挑战与频率限制,避免它们拿到不含链接的页面。
- 入口页尽量不做 Vary: User-Agent 或按 Cookie 分流,保持同一 URL 对所有访问者返回同一份 HTML。
- 同时把入口页放进 sitemap,给链接发现留一条不依赖缓存的路径。
缓存问题最典型的表现是“部分节点能抓到新链接、部分节点还是旧的”。如果只看单次抓取结果,很容易误判成蜘蛛不跟进或目标站有问题。
需要说明的是,修好缓存一致性只是让入口页的链接能被稳定看到,并不等于目标 URL 一定会被收录。抓取和收录由搜索引擎自行决定,这里能做的只是把发现环节的障碍清掉,剩下的交给正常的抓取节奏去验证。