不少站点会发现一个情况:自己在浏览器里打开的入口页,链接列表是新的;但搜索蜘蛛抓取时拿到的那份 HTML,可能还是几小时前甚至几天前的旧版本。结果就是新加的链接迟迟没被看到,已经删掉的链接还在被反复请求。这种情况多半不是蜘蛛不抓,而是缓存层在中间做了手脚。
为什么蜘蛛看到的页面会和你不一样
入口页通常不会只有一层:源站之外,可能有 CDN 边缘节点、反向代理、页面缓存插件、对象存储副本。这些层各自按自己的规则保存一份 HTML。搜索蜘蛛从不同的 IP、不同地区、不同 UA 发起请求,命中的缓存副本未必是同一份,看到的内容自然可能对不上。
更常见的是缓存键(cache key)设置得太粗:比如只按 URL 缓存,忽略了 UA、语言、地区。移动端蜘蛛和桌面端蜘蛛拿到同一份 HTML,其中一方的链接可能并不适合它。
常见的几种“版本错位”
- 新增链接没同步:源站已更新,边缘节点仍返回旧 HTML,新链接没进入蜘蛛的视野。
- 删除链接仍在:入口页已撤下目标 URL,缓存副本里还留着,蜘蛛继续按旧列表抓取。
- UA 差异化:对蜘蛛和普通访客返回不同内容,缓存把其中一份固定下来,导致长期错位。
- 缓存了错误响应:源站短暂 5xx 或超时,缓存把错误页也存了一份,蜘蛛拿到的是错误页面。
- 多节点不一致:不同地区节点刷新时间不同,蜘蛛在不同时间访问,看到的链接数量都不一样。
怎么判断是不是缓存造成的
- 用命令行请求入口页,查看响应头里的 Age、X-Cache、CF-Cache-Status 一类字段,判断是否命中缓存。
- 连续请求几次,或换不同地区节点请求,对比返回的 HTML 是否一致。
- 换用常见搜索蜘蛛的 UA 再请求一次,看正文里的链接列表有没有变化。
- 对照服务器日志:蜘蛛抓取的时间点,和源站实际更新时间、缓存刷新时间是否吻合。
如果同一 URL 在不同时间返回的 HTML 指纹不同,而源站并没有改动,基本可以定位到缓存层。
处理思路
核心原则是:入口页的 HTML 一旦变更,要主动让缓存失效,而不是等它自然过期。
- 更新链接列表后,立即对该 URL 做缓存刷新或预热,避免新旧混杂。
- HTML 的缓存时间不要太长,入口页这类频繁变动的页面尤其如此;静态资源可以长缓存,HTML 建议短缓存加校验。
- 如果必须做 UA 或地区差异化,确认缓存键里包含这些维度,避免串用。
- 移除链接时同样要刷新缓存,否则蜘蛛会继续沿着旧链接抓取。
- 源站异常时,避免把 5xx 页面缓存下来;配置上排除错误状态码的缓存。
缓存不是设好就不用管的开关。入口页这类承担 URL 发现作用的页面,缓存策略要跟着链接变更的节奏走。
日常运营的几点建议
- 把刷新缓存写进入口页的发布流程,和更新链接同时执行。
- 定期抓取入口页并保存 HTML 指纹,观察内容是否与源站一致。
- 关注入口页的 HTTP 状态码分布,长时间异常先查缓存再查其它环节。
- 链接结构调整时,先小范围验证蜘蛛拿到的版本正确,再批量更新。
说到底,URL 发现依赖的是蜘蛛实际读到的那份 HTML,而不是你屏幕上看到的那份。把缓存这一层管好,很多新链接不抓、旧链接还抓的疑惑会少一大半。