维护蜘蛛池入口页时常会遇到一种情况:后台明明加了新一批目标 URL,搜索蜘蛛日志里却迟迟看不到对应抓取,甚至十几天后抓到的还是老版本的链接列表。这不一定说明入口页失效,很可能是缓存层把旧 HTML 反复交给了搜索蜘蛛。
缓存为什么会让搜索蜘蛛看到旧页面
搜索蜘蛛本质上是一个不带 Cookie、不发 POST、请求行为比较规律的 HTTP 客户端。如果入口页前面挂着 CDN、Nginx 缓存、对象存储或框架级页面缓存,那么第一次抓取把 HTML 存进缓存之后,后续所有请求——包括搜索蜘蛛的请求——都会拿到同一份副本,直到缓存过期或被主动刷新。你在后台更新的链接列表,在缓存过期前蜘蛛是看不到的。
三种常见的“缓存错位”场景
- CDN 把 HTML 也缓存了。很多 CDN 默认只缓存静态资源,但如果入口页被设成“缓存全部”,或者缓存规则写得过宽,HTML 也会被长时间缓存,刷新周期可能从几小时到几天不等。
- 页面缓存没有按 URL 区分。某些程序按栏目或模板做整页缓存,你更新了 A 列表,结果返回的却是 B 列表或旧模板,蜘蛛抓到的链接和目标对不上。
- 源站更新了,边缘节点没回源。缓存时间还没到,回源规则又比较宽松,蜘蛛就一直被边缘节点挡在外面,看到的是旧副本。
怎么确认是缓存问题而不是抓取问题
- 用浏览器无痕窗口打开入口页,再用 curl 带上搜索蜘蛛的 UA 请求同一地址,对比两次返回的 HTML 是否一致。不一致基本可以判断存在 UA 维度的缓存分流。
- 看响应头里的 Age、X-Cache、CF-Cache-Status 这类字段,出现 HIT 说明命中的是缓存副本。
- 把日志里蜘蛛的抓取时间和入口页实际更新时间放在一起看。如果抓取时间晚于你的更新时间,返回内容却是旧的,属于缓存问题;如果抓取时间明显滞后于更新时间,更可能是抓取频率本身偏低。
- 手动刷新一次缓存,再观察一到两个抓取周期,看新链接是否出现在日志里。
减少影响的几个常规做法
- 入口页这类需要频繁更新链接的 HTML,尽量设置较短的缓存时间,或在缓存规则里直接排除。
- 为入口页配置合理的 Cache-Control 以及 ETag、Last-Modified,让缓存层在内容变化时能拿到新版本。
- 更新链接后主动刷新一次缓存,而不是干等缓存自然过期。
- 把“入口页能否被稳定读取”列进日常巡检,而不是出了问题才回头查。
缓存不会直接决定收录,但它会决定搜索蜘蛛能不能看到你新加的那批 URL。
几个常见误解
有人觉得只要 URL 提交接口返回成功、入口页用浏览器能打开,蜘蛛就一定能看到新链接。实际上接口只负责把地址递出去,抓取时拿到什么内容,取决于缓存层给的是哪一份副本。也有人认为缓存只影响蜘蛛不影响用户,其实用户看到旧内容的概率是一样的,只是用户不会去翻日志。
排查这类问题时,建议把入口页的“返回内容版本”和“被抓取时间”一起记录下来。长期对比之后,你会更容易判断抓取量波动是缓存造成的,还是抓取策略本身发生了变化。