搜索抓取

搜索蜘蛛抓取:爬虫 UA 分流与 CDN 缓存命中差异造成的抓取内容不一致排查

同一个 URL 被不同 UA 抓到不同内容,往往不是蜘蛛行为异常,而是 CDN 缓存键与爬虫 UA 分流规则叠加的结果。本文给出从抓取日志定位差异、区分源站与边缘层、检查缓存键与识别规则,到修复后验证响应收敛的完整排查顺序。

搜索抓取

搜索蜘蛛抓取:爬虫 UA 分流与 CDN 缓存命中差异造成的抓取内容不一致排查

同一个 URL,站长在自己浏览器里看到的是 A 页面,抓取日志里记录到的却是 B 页面;或者同一批链接,一部分抓到了完整正文,另一部分只拿到骨架和占位内容。这类“抓取内容不一致”的问题,多数不是蜘蛛本身的行为异常,而是 CDN 与源站对爬虫 UA 做了两套处理,再加上缓存命中状态不同,最终把不同版本的内容分发给了不同请求。

先把“不一致”定位到具体一层

在动配置之前,先确认差异出现在哪一层,否则很容易在错误的位置反复调参。

  • 直接访问源站 IP 并带上 Host 头,绕过 CDN,看返回内容是否一致;
  • 通过 CDN 域名访问,但把 User-Agent 换成与抓取日志中一致的爬虫 UA,观察响应是否变化;
  • 对比首次请求(缓存未命中、回源)与二次请求(缓存命中)的响应体差异;
  • 记录响应头中的 Age、X-Cache、CF-Cache-Status 一类字段,判断这次请求是否真的走了缓存。

CDN 缓存是最常见的分叉点

CDN 可能按 URL 缓存,也可能把 UA、Cookie、Accept-Encoding 一起纳入缓存键。当缓存键包含 UA 时,爬虫与普通用户的请求会落在两个独立缓存条目上;如果源站对两类 UA 返回不同内容,缓存就会把差异长期固化。更麻烦的是,缓存条目一旦生成,源站后来修好的内容也可能因为缓存未过期而迟迟不更新。

需要重点确认三件事:缓存键里到底包含哪些维度、爬虫 UA 是否被单独排除在缓存之外、缓存 TTL 是否长到足以掩盖源站的修复。

UA 分流规则常见的几种误配

  • 用“包含 spider/bot”这类宽松子串识别爬虫,把正常浏览器 UA 也误判进去;
  • 对识别为爬虫的请求返回精简版页面、跳转到静态快照,或直接给验证页;
  • 规则只在部分节点或部分地区生效,导致同一 UA 在不同边缘节点拿到不同内容;
  • 分流规则与 robots.txt、X-Robots-Tag 各自独立维护,改了一处忘了另一处。

建议的排查顺序

  1. 从抓取日志里挑出内容异常的 URL,抽取请求时间、UA、Referer、响应大小与状态码;
  2. 用相同 UA 和相同请求头复现一次,确认问题可稳定复现而不是偶发;
  3. 绕过 CDN 直连源站再复现一次,判断问题在源站还是边缘;
  4. 检查 CDN 缓存键配置与缓存命中状态,必要时对相关路径做一次定向刷新;
  5. 检查边缘的 UA 识别规则、WAF 规则与 Bot 管理策略,确认爬虫没有被降级处理;
  6. 检查源站是否存在基于 UA 的动态渲染或模板分支;
  7. 修复并清缓存后,用两种 UA 分别请求同一 URL,比对响应体是否收敛为同一版本。

修复与长期验证

较稳妥的做法是让爬虫 UA 与普通用户拿到同一份 HTML,把差异留给前端按需渲染,而不是在服务端生成两套结构。缓存键尽量只保留 URL 与必要的编码维度,把 UA、Cookie 从键里剔除,避免缓存被切碎、同一条内容反复回源。

修复之后不要只看一次结果。建议保留一个抽样清单,定期用相同 UA 抓取同一批 URL,记录响应体长度与关键内容指纹,一旦再次出现分叉就能第一时间发现。

抓取内容不一致时,先怀疑分发链路(CDN、WAF、UA 分流),再怀疑页面本身。多数情况不是“蜘蛛抓不到”,而是“不同请求拿到了不同版本”。