蜘蛛池入口页的职责是让搜索蜘蛛不断发现新的目标 URL。如果入口页前面挂了 CDN 或反向代理,缓存策略没配好,搜索蜘蛛拿到的可能一直是几天前那份 HTML,新加的链接根本没机会被看到。这通常不是蜘蛛池本身失效,而是缓存层把请求挡在了源站外面。
缓存为什么会卡住 URL 发现
CDN 和反向代理一般会按路径、查询串缓存页面,部分配置还会按 UA 或 Cookie 区分版本。入口页链接更新后,源站内容变了,但边缘节点上的副本还在 TTL 内,请求直接返回旧 HTML。搜索蜘蛛拿到旧页面,自然只能看到旧链接。
典型表现是:自己在浏览器里刷新能看到新链接,日志里搜索蜘蛛的抓取记录也有,但目标 URL 迟迟不进抓取队列。
先确认是不是缓存导致
- 用 curl -I 请求入口页,看响应头里有没有 Age、X-Cache、CF-Cache-Status 之类字段。有 Age 且数值较大,基本可以判定命中缓存。
- 对比源站和 CDN 返回的 HTML 长度或内容哈希,不一致就说明拿到的是缓存副本。
- 把搜索蜘蛛的 UA 单独拿出来请求一次,看是否返回了另一份内容,有些配置对爬虫走了单独的缓存规则。
- 翻访问日志,确认搜索蜘蛛抓到的版本和源站当前版本对应不上。
缓存可能不止一层
从搜索蜘蛛到源站,中间可能经过 CDN 边缘节点、CDN 中间层、源站前面的 Nginx proxy_cache,甚至应用自身的页面缓存。只清掉一层,剩下的层还会返回旧内容。排查时按请求链路逐层验证:先看边缘节点响应头,再绕过 CDN 直连源站 IP 请求,最后检查应用层有没有单独缓存入口页。
调整方向
- 入口页不缓存或短缓存。把 Cache-Control 设成 no-cache 或很短的 max-age,让边缘节点频繁回源。
- 更新后主动刷新。每次改完链接就调用 CDN 的刷新接口清掉入口页缓存,别等 TTL 自然过期。
- 动态页和静态资源分开。图片、CSS 可以长缓存,入口页 HTML 保持回源。
- 避免按 UA 分版本。给搜索蜘蛛单独返回一份内容容易踩到 cloaking 的边界,维护成本也高。
- 链接更新走固定流程。先刷新缓存,再确认回源内容正确,最后才看日志里的抓取记录。
哪些情况不用动缓存
如果入口页本身几乎不更新,链接长期固定,缓存反而能降低源站压力,这时没必要强行回源。判断标准很简单:入口页的链接集合是否还在变化。不再变化,缓存就是帮手;还在频繁增删,缓存就是阻力。
两个常见误区
- 把缓存当成唯一原因。缓存清了目标 URL 还是没动静,说明问题在链接可抓取性、robots 规则或目标页响应状态上。
- 为了绕过缓存给搜索蜘蛛单独开一份内容。短期可能看到抓取变化,长期风险不小,也不容易维护。
入口页的重点不是内容多新鲜,而是搜索蜘蛛每次来能不能看到当前的链接集合。缓存让这两者脱节时,排查优先级要排在改模板前面。
改完之后怎么看效果
调整后不要立刻下结论。观察一到两周日志,看搜索蜘蛛抓入口页时返回的 HTML 是否已经是最新版本,目标 URL 有没有出现首次抓取记录。如果入口页抓取正常、内容也是最新的,但目标 URL 依然没有动静,那问题在别处,需要回到链接可抓取性、robots 规则和目标页响应状态上继续排查。