常见问题

蜘蛛池入口页被缓存了旧版本,新增的目标 URL 为什么一直不被抓

入口页明明加了新链接,日志里也能看到蜘蛛来访,目标 URL 却迟迟没有抓取记录。本文从 CDN、反向代理和站点静态化三个方向,说明为什么蜘蛛拿到的是旧版 HTML,并给出确认缓存问题、刷新缓存和验证恢复的排查顺序。

常见问题

蜘蛛池入口页被缓存了旧版本,新增的目标 URL 为什么一直不被抓

入口页明明加了新的链接,服务器日志里也能看到蜘蛛来抓,可过了一周目标 URL 依然没有任何抓取记录。这种情况下先别急着怀疑链接写法,很多时候问题出在你看到的 HTML 和蜘蛛拿到的 HTML 不是同一份。

为什么会出现“日志有抓取、链接却不更新”

搜索蜘蛛抓取入口页时,拿到的是 CDN、反向代理或缓存层返回的那份 HTML。如果这份 HTML 是几天前的旧版本,里面自然没有你新加的链接,蜘蛛也就无从发现新的目标 URL。日志只会记录“蜘蛛来过”,不会告诉你它拿到的是哪一版内容。

常见的三类缓存来源

  • CDN 层缓存:HTML 被当作静态资源缓存,回源频率低于你的更新频率。
  • 反向代理缓存:proxy_cache 之类的配置 TTL 较长,或者缓存规则没有按实际更新节奏调整。
  • 站点自身静态化:入口页由定时任务生成,改了源文件却没有触发重新生成。

用三步确认是不是缓存问题

  1. 用带时间戳参数的地址强制回源访问入口页,看返回的 HTML 里有没有新链接。
  2. 再用不带参数的普通地址访问一次,看返回的是哪一版。两份内容不一致,基本可以确定是缓存层在起作用。
  3. 查看响应头里的缓存相关字段,确认 HTML 是否被标记为可缓存,以及缓存有效期有多长。

如果第一步有、第二步没有,说明源站已经更新,问题在缓存;如果第一步也没有,先去检查源站文件和静态化流程。

为什么蜘蛛拿到的内容和浏览器不一样

部分 CDN 会按 User-Agent 或请求头区分缓存,可能对爬虫请求直接回源、对普通用户返回缓存副本,也可能反过来。所以“我在浏览器里能打开新链接”并不能说明蜘蛛也能看到。要验证就用和蜘蛛相同的方式访问,而不是只看浏览器结果。

处理时容易踩的两个坑

1. 用随机参数绕开缓存

有人为了避开缓存,把入口页链接改成每次都带随机参数。这会让同一个入口页产生大量不同 URL,抓取预算被分散,反而更慢。更稳妥的做法是刷新缓存、缩短 HTML 的缓存时间,而不是改变 URL 本身。

2. 只改了链接,没改缓存策略

如果入口页需要经常增删链接,建议把 HTML 设为较短的缓存时间或不缓存,图片、CSS 等静态资源继续长缓存。也可以在发布流程里加一步:更新入口页后主动刷新对应地址的 CDN 缓存。

验证是否恢复

  • 观察入口页的抓取日志,看蜘蛛下一次抓取返回的字节数是否发生变化。
  • 用相同的访问方式(同样的 UA、同样的路径)对比源站与 CDN 返回的内容。
  • 给新加的目标 URL 一段观察期,不要因为一天没动静就反复改动入口页。
蜘蛛能否发现目标 URL,取决于它实际收到的那份 HTML,而不是你在后台或源文件里看到的那份。

缓存问题排查起来并不复杂,难的是先意识到它的存在。当你确认链接写法、状态码、robots 规则都没问题时,缓存层值得优先检查一次。