蜘蛛池知识

蜘蛛池与 CDN、反向代理:中间层会改变蜘蛛看到什么

蜘蛛池的入口页往往不止一层中间层:CDN、WAF、反向代理都可能先接手请求,于是同一个 URL 对不同来源返回不同内容。本文梳理缓存与 Vary、频率拦截、回源超时、真实 IP 日志这几处常见问题,并给出一份上线前后的检查清单,帮助把抓取异常定位到具体是哪一层在起作用。

蜘蛛池知识

蜘蛛池与 CDN、反向代理:中间层会改变蜘蛛看到什么

为什么中间层会改变蜘蛛的体验

蜘蛛抓取入口页时,通常不是直接连到你的源站。DNS 解析、CDN 边缘节点、WAF、反向代理、负载均衡,任何一层都可能先接手这个请求。这些层的默认配置是为“保护站点、加速用户访问”服务的,而蜘蛛的需求和普通用户并不完全一致:它基本不执行 JavaScript、不保存登录态、请求频率高且集中、还经常从同一个出口反复请求同一个地址。

于是同一个 URL 可能返回三种结果:给普通用户的是缓存后的完整页面,给蜘蛛的是被拦下来的验证页或空壳,给回源探测的才是源站原始 HTML。蜘蛛最终看到哪一个,取决于中间层如何判断。

最容易出问题的几个设置

缓存与 Vary 头

如果站点按 User-Agent 返回不同内容,又没有正确设置 Vary,CDN 可能把某个 UA 的响应缓存下来,再发给所有来源。结果是蜘蛛拿到一个几乎为空的页面,而你在浏览器里看起来一切正常,很难第一时间联想到缓存。

WAF 与频率规则

入口页数量多、抓取相对集中时,很容易触发“单 IP 高频访问”这类规则。蜘蛛被拦后不会给你发通知,只在日志里留下 403 或挑战页记录。可以考虑把搜索引擎官方 IP 段加白,或在验证层放开常见蜘蛛 UA 的访问。

回源超时与连接复用

中间层的回源超时设置往往短于蜘蛛的等待阈值。源站稍微慢一点,蜘蛛收到的就是 5xx 或连接超时,而不是它本来还能等到的 200。这类问题在直连测试时通常看不出来。

日志里的真实来源

接入 CDN 后,源站日志里记录的多是节点 IP,看不出蜘蛛的踪影。抓取情况的核对要依赖 X-Forwarded-For 或 CDN 自带的日志字段,否则很容易把正常抓取误判成“蜘蛛没来”。

上线前后的检查清单

  1. 用 3 到 5 个不同的 UA 和来源 IP 请求同一个入口页,比较返回的 HTML 是否一致。
  2. 检查响应头中的 Cache-Control、Vary、Age,确认缓存策略与预期相符。
  3. 查看 WAF 拦截日志,确认是否有蜘蛛 UA 或官方 IP 段被命中。
  4. 对比 CDN 日志与源站日志,确认抓取次数和状态码能对上。
  5. 测试绕过中间层直连源站的表现,作为排查时的基线参照。
中间层本身不是问题,问题在于你不知道它替蜘蛛做了哪些决定。排查抓取异常时,先把这条链路打通,再去调整入口页的内容和结构,顺序会顺很多。

几点使用建议

  • 需要被稳定抓取的入口页,缓存策略尽量保持简单,避免叠加多层规则。
  • 把蜘蛛的访问路径单独列成白名单,与普通用户的规则分开维护,改动时互不影响。
  • 定期做一次直连与经过中间层的对比,确认两边的响应内容和状态码一致。
  • 变更 CDN、WAF 规则后,观察一段时间的抓取状态与状态码分布,再做下一步调整。