入口页更新了,蜘蛛日志里还是旧链接
不少人做蜘蛛池时,会把入口页当成一个随时可以改动的链接中转页。但改完之后发现:搜索蜘蛛的抓取日志里,请求的还是那批老目标 URL,响应体大小也没什么变化,好像蜘蛛根本看不到新版页面。这类情况多数和缓存层有关,而不是蜘蛛不来抓。
缓存为什么会卡住入口页的更新
入口页通常是纯静态或准静态的 HTML,很容易被中间的缓存层接管:CDN 边缘节点、反向代理、对象存储的静态化规则,以及服务器上的页面缓存插件,都可能在第一次请求后把 HTML 存起来,后续直接返回。
缓存是否命中,取决于缓存键。常见的组合是 URL + Host,有些配置还会把 User-Agent、Cookie、Query 一起算进去。一旦缓存键里带了 User-Agent,就意味着给普通浏览器 UA 的缓存,和给搜索蜘蛛 UA 的缓存是两份。你清了普通用户看到的那一份,蜘蛛那份可能还留在边缘节点上。
几个容易被忽略的缓存细节
- CDN 的 purge 如果只按 URL 提交,可能没有覆盖按 UA 分出的变体缓存。
- 服务商提供的爬虫加速或回源优化,本质是让蜘蛛更早命中缓存,反而可能延长旧版本的生命周期。
- 页面里用时间戳或随机注释来判断新旧版本,但那是渲染时生成的,静态缓存的 HTML 里根本没有。
- 入口页被伪静态规则当成文件处理并加了长缓存头,更新时只改数据库、没动文件。
怎么判断蜘蛛拿到的是不是旧内容
先把猜测换成对比。可以按下面的顺序排查:
- 用搜索蜘蛛的 UA 请求入口页,记录响应头里的 Age、X-Cache、ETag、Last-Modified 等字段。
- 用普通浏览器 UA 请求同一个 URL,把两次返回的正文、链接列表、响应体大小做对比。
- 翻抓取日志,看响应体大小是否长期是同一个固定值;如果连续多天完全一致,可能不是稳定,而是缓存没更新。
- 在页面源码里加一段固定的版本标记,例如注释里的版本号,用蜘蛛 UA 抓一次,看取到的是哪个版本。
如果蜘蛛 UA 拿到旧版本、普通 UA 拿到新版本,基本可以确认是按 UA 分片的缓存造成的问题。
处理顺序与取舍
处理缓存问题时,建议按下面的顺序来,不要一上来就把整站设成不缓存。
- 先全量清理:确认清理范围包含按 UA、按 Query 分出的变体,而不是只清主 URL。
- 再调整入口页的缓存策略:入口页属于经常变动的页型,可以给一个较短的 TTL,或者使用能回源校对的缓存策略,而不是和图片、CSS 一样缓存几个月。
- 检查 Vary 设置:如果业务上不需要按 UA 区分内容,尽量不要让 Vary 把蜘蛛 UA 单独分成一份缓存。
- 清理后再次验证:用蜘蛛 UA 重新请求,确认版本标记已经更新,再观察后续的抓取日志。
清完缓存之后会发生什么
清理缓存解决的是蜘蛛能看到哪一版页面的问题,不解决蜘蛛什么时候来看、看了会不会抓目标 URL。搜索蜘蛛的回访间隔由搜索引擎自己决定,没有可以保证的时间表。已经进入待抓队列的旧链接,也可能仍被抓取一次或多次;把链接从入口页移除,只是让它不再从这条路径被持续发现。
把缓存理解成影响蜘蛛读到哪一版页面的因素,比理解成影响收录的开关更准确。改动之后仍需持续观察日志,而不是指望立刻生效。
小结
入口页更新不生效,先查缓存,再看抓取日志。对比蜘蛛 UA 与普通 UA 的返回结果,是最直接的一步;确认问题后再决定缓存 TTL、Vary 和清理范围。做到这一层,至少能保证蜘蛛看到的入口页,和你以为的一致。