做蜘蛛池的人经常会遇到这种情形:入口页明明已经换了新一批目标 URL,可日志里搜索蜘蛛抓的还是上一批;自己用浏览器打开入口页,看到的也是旧链接。多数时候不是蜘蛛不认新内容,而是它拿到的 HTML 本身就是旧的那一份,缓存层把更新挡在了外面。
搜索蜘蛛看到的是哪一份内容
搜索蜘蛛发出的是普通 HTTP 请求,它拿不到所谓的最新版本,只能拿到请求那一刻服务器返回的 HTML。中间只要隔着 CDN、反向代理、页面缓存插件或者对象存储的静态快照,返回的就是缓存节点上的那一份。因此,入口页里的链接能不能被发现,前提是这份缓存副本里确实含有那些链接。
入口页更新的时间点,不等于搜索蜘蛛看到新链接的时间点。两者之间隔着缓存过期的时间窗口。
缓存会怎样影响 URL 发现
- 新链接延迟出现:缓存未过期前,新加的目标 URL 不会出现在蜘蛛拿到的 HTML 里,自然不会被顺着抓走。
- 旧链接持续被抓:已经下线的链接如果还留在缓存副本里,蜘蛛会继续按旧版本访问,日志中就会出现一批本该消失的 URL。
- 不同节点结果不一致:多地 CDN 节点回源节奏不同,可能出现部分节点已更新、部分还是旧版,抓取表现看起来时好时坏。
怎么确认是缓存导致的
- 用带随机查询串或明确禁止缓存的请求访问入口页,把返回的 HTML 与蜘蛛日志里的链接做个对比。
- 查看响应头里的 Age、X-Cache、CF-Cache-Status 一类字段,判断命中的是缓存还是回源。
- 从不同地区或不同线路请求同一个入口页,看返回内容是否一致。
- 把改动前后的 HTML 快照保存下来逐条对比,比凭印象判断可靠得多。
处理建议
更新入口页后,第一件事是主动刷新缓存,而不是干等它自然过期。CDN 一般提供刷新或清理接口,把入口页的真实 URL 提交一遍,多数情况下几分钟内就能让新版本生效。
入口页的缓存时长要跟更新频率匹配。更新频繁的入口页用较短的 TTL 更合适;长期不动的入口页可以放长一些,减少回源压力。如果入口页是程序动态生成,注意别把整页设成长期缓存,否则每次换链接都得人工清理。
另外,入口页的链接列表最好带上可对账的标记,比如按上下线时间排序。这样当发现蜘蛛抓的和当前列表对不上时,能较快判断是缓存停留在旧版本,而不是链接本身写错或拼错。
不建议的做法
- 为了绕开缓存而频繁更换入口页 URL。旧入口页仍会留在蜘蛛的抓取队列里,等于多出一批无意义的抓取。
- 对入口页直接关闭所有缓存。回源压力上去后,抓取高峰时更容易超时,对蜘蛛并不友好。
- 只刷新首页,忘了入口页所在的具体路径。刷新要精确到实际被抓的那个 URL。
缓存本身不是问题,问题在于更新和缓存过期之间的时间差没有被意识到、也没有被管理。把缓存刷新纳入入口页更新的常规流程,并让 TTL 与更新节奏对齐,大多数所谓“蜘蛛不来抓新链接”的情况都会明显减少。