蜘蛛池入口页的作用是让搜索蜘蛛顺着链接走到目标 URL。但很多站点前面挂着 CDN、反向代理或对象存储缓存,入口页实际返回的内容并不完全由源站决定。缓存命中时,搜索蜘蛛拿到的是一份副本,而不是你刚改过的版本。这一点在做 URL 发现时容易被忽略。
缓存为什么会出现在发现链路上
入口页通常是静态 HTML,正好是最容易被整页缓存的一类页面。CDN 边缘节点、Nginx 的 fastcgi_cache、对象存储的静态托管,都可能把第一次请求的结果存下来,之后一段时间内直接返回这份副本。
- 缓存命中时返回的是旧副本,里面可能还没有你新加的目标链接。
- 缓存时间设置得过长,新增的目标 URL 会一直停在源站,出不去。
- 不同地区、不同节点的缓存状态不一致,来自不同 IP 的蜘蛛看到的内容可能不同。
- 缓存层与源站返回的状态码、字节数不一致,日志里会出现对不上的情况。
搜索蜘蛛看到旧版本,影响的是什么
已经存在于旧版本里的链接,一般不会因为缓存而消失,蜘蛛仍然能按原有结构继续走。真正受影响的是新增部分:如果新的目标 URL 只写在最新版本的 HTML 里,而缓存还没刷新,那么这条链接对外就还不存在。
不是发现失败,而是发现延后
大多数情况下这不是链路断掉,而是节奏被拉长。入口页本身被蜘蛛正常抓取,但抓到的是旧内容,于是新一轮的目标 URL 要等缓存过期、节点刷新之后才可能被看到。如果入口页是持续更新、持续投放新目标 URL 的,这种延后就会累积。
怎么判断缓存是否挡在了中间
- 直接请求入口页,查看响应头里的 age、x-cache、cf-cache-status、x-cache-status 等字段,判断这次是否命中缓存。
- 对比源站直连返回的 HTML 和经过 CDN 返回的 HTML,看链接列表是否一致。
- 在服务器日志里比对着看:同一个入口页,源站收到的请求次数和缓存层转发的次数往往差很多。
- 在入口页加一条明显的测试链接,观察它多久能在缓存层生效,以此估算实际的更新延迟。
入口页的缓存策略怎么调
- 把入口页和普通静态资源区分开。内容页、图片可以长缓存,入口页这类需要频繁改动的页面建议设置较短的缓存时间,或者直接不缓存。
- 更新入口页后同步刷新 CDN 缓存,不要只刷新首页和几个重点页面。
- 保持一条源站可直连的路径,方便自己核对内容,也方便排查缓存层返回的版本问题。
- 如果入口页数量较多,把更新和刷新做成同一个流程,而不是先改完再想起来刷缓存。
缓存解决的是访问速度问题,不是抓取问题。把入口页的缓存策略和更新节奏对齐,比反复往页面里堆链接更有效。
一个容易忽略的细节
缓存节点之间并不同步。同一个入口页,A 节点可能已经刷新,B 节点还是旧版本。搜索蜘蛛的出口 IP 不固定,不同时间抓到的内容就可能不一样。如果发现目标 URL 的发现速度时快时慢、时有时无,可以先把这一层排除掉,再去看入口页结构和链接设置。
整体思路不复杂:让源站、缓存层、蜘蛛三者看到的内容尽量一致。入口页更新后能及时对外生效,目标 URL 的发现链路才是稳定的。