蜘蛛池入口页通常不是给用户看的,而是给搜索引擎蜘蛛提供链接路径。很多站点会把入口页放到 CDN 或反向代理后面,这时缓存就会介入蜘蛛的每一次请求。蜘蛛拿到的可能不是源站最新内容,而是边缘节点上的旧副本。如果入口页的链接已经更新,但缓存没刷新,蜘蛛就会反复看到同一批旧链接,URL 发现效率自然下降。
缓存为什么会改变蜘蛛看到的内容
蜘蛛请求入口页时,会先经过 DNS、CDN、反向代理,最后才到源站。如果 CDN 节点上有未过期的缓存,请求不会回源,蜘蛛得到的是缓存副本。对蜘蛛来说,它并不知道这是缓存,只会按拿到的 HTML 解析链接。常见问题包括:新加的链接没出现,删掉的链接还在,不同节点返回不同版本。
缓存并不只发生在 CDN。Nginx、Varnish、对象存储、甚至某些主机面板的静态缓存,都会让入口页在一段时间内保持旧状态。排查时要先确认蜘蛛请求到底经过了哪一层。
常见缓存头与蜘蛛抓取的关系
Cache-Control
max-age 决定缓存副本在浏览器和中间层保留多久。s-maxage 主要面向 CDN 等共享缓存。入口页如果更新频繁,max-age 可以设短一些,比如几十秒到几分钟;如果入口页长期不变,可以适当放长,但更新链接后要主动刷新。还要注意 no-cache 不是不缓存,而是每次使用前要回源校验;no-store 才更接近完全不保存。
ETag 与 Last-Modified
这两个头用于条件请求。蜘蛛再次访问时,如果带上 If-None-Match 或 If-Modified-Since,源站可能返回 304,表示内容没变。这能减少传输,但如果入口页内容变了而 Last-Modified 没更新,蜘蛛可能误以为没变化。动态入口页要确保修改链接后,响应头里的校验标识也随之变化。
Vary
如果对蜘蛛和普通用户返回不同内容,又设置了 Vary: User-Agent,CDN 可能会按 UA 分别缓存。表面看没问题,实际上容易造成缓存碎片:蜘蛛拿到的是某个版本的缓存,普通用户拿到另一个版本。蜘蛛池入口页通常没必要针对蜘蛛做单独模板,保持同一份 HTML 更稳妥。
CDN 缓存带来的几个实际问题
- 边缘节点不同步:蜘蛛从不同地区节点抓取,可能看到不同版本的入口页,链接数量不一致。
- 旧链接长期不消失:源站已经删除的链接,因缓存未过期仍被蜘蛛抓到,形成无效请求。
- 回源比例过高:把缓存时间设得太短,蜘蛛每次访问都回源,服务器压力反而更大。
- 刷新不及时:更新入口页后只刷新首页,没有刷新具体 URL,蜘蛛仍命中旧缓存。
动态入口页与缓存的冲突
如果入口页的链接是程序动态生成的,缓存设置要更谨慎。完全静态化的入口页适合较长缓存,但每次更新链接都要刷新 CDN;动态页面适合短缓存或不缓存,让蜘蛛每次拿到较新的链接列表。折中做法是:入口页框架可以缓存,链接列表部分通过短缓存或异步方式更新。
缓存只能减少蜘蛛等待和重复传输,不能替代链接质量、内容相关性和站点可访问性。把缓存当成收录捷径,通常会失望。
排查缓存问题的基本步骤
- 用 curl -I 或浏览器开发者工具查看响应头,重点关注 Age、X-Cache、Via、Cache-Control。
- 对比源站直接访问和通过 CDN 访问的 HTML,看链接是否一致。
- 检查访问日志中同一入口页的返回大小和状态码,判断是否长期命中缓存。
- 更新链接后,刷新对应 URL 的 CDN 缓存,并确认回源已经拿到新版本。
- 观察一段时间内蜘蛛对入口页的抓取频率和发现的新 URL 数量,再决定缓存时长。
使用建议
- 入口页缓存时间从短开始,确认蜘蛛能稳定拿到新链接后再逐步调整。
- 不要对蜘蛛单独设置一套缓存策略,避免不同 UA 看到不同链接。
- 更新频繁的入口页,建议配合 CDN 刷新接口或版本号参数,减少旧副本影响。
- 把缓存命中率、回源率和蜘蛛抓取日志放在一起看,单独看一项容易误判。
蜘蛛池入口页的缓存策略没有统一答案。更新越频繁,缓存越要短;更新越少,越可以放长。关键是让蜘蛛每次访问都能拿到当前有效的链接列表,同时不给服务器增加无谓回源。先观察日志,再调缓存,比一次性照搬模板更实用。