搜索抓取

抓取一致性:AB 测试、灰度发布与个性化下,蜘蛛为什么会看到不同版本

同一个 URL,蜘蛛隔几天来一次却拿到差异很大的 HTML,问题往往不在蜘蛛,而在站点自身的分流逻辑。本文梳理 AB 测试、灰度发布、个性化与随机模块让页面版本漂移的常见原因,说明它给抓取判断、canonical 信号和抓取预算带来的影响,并给出让主内容趋于稳定的实操思路。

搜索抓取

抓取一致性:AB 测试、灰度发布与个性化下,蜘蛛为什么会看到不同版本

做抓取日志分析时,常会遇到一种情况:同一个 URL,蜘蛛隔几天来一次,拿到的 HTML 差异很大——标题不同、价格不同、列表顺序不同,甚至主要模块都不在。这通常不是蜘蛛抓错了,而是站点本身在不同时间给不同访问者返回了不同版本。对用户来说这可能是有意的产品设计,对抓取来说却会带来判断困难。

为什么蜘蛛看到的内容会变

搜索蜘蛛一般不带 Cookie、不登录,也不会走完整的用户画像流程。但站点侧的判断依据并不只有身份信息:UA、请求头、IP 段、地理位置都可能触发分流。即便没有刻意做蜘蛛分流,前端框架里的 AB 测试、按需渲染和随机推荐也会让最终 DOM 每次都不一样。

前端 AB 测试

分组常发生在客户端脚本里,蜘蛛执行渲染时命中的是随机分组之一。如果实验改动的是标题、主图或首屏文案,那么每次抓取拿到的信号都可能不同。

灰度发布与多版本并存

新版本只在部分节点上线时,蜘蛛的请求落到哪台机器并不确定。结果就是新旧结构在不同抓取中交替出现,链接、面包屑和结构化数据都可能对不上。

个性化与地域差异

默认城市、货币、语言、推荐列表,都会让主体内容之外的部分发生变化。如果这些变化侵入到主内容区,影响就不只是边角差异。

随机与时间因素

猜你喜欢、随机排序、倒计时、库存状态,这类模块的变动通常影响有限,但一旦替代了主内容的位置,就会被抓取端当成内容变化。

它带来的实际问题

  • 标题和摘要信号来回摆动,容易被判断为高变化页面;
  • canonical、hreflang 等标签在不同版本里不一致,甚至彼此矛盾;
  • 回访频率被抬高,抓取预算消耗在重复请求上;
  • 日志与渲染结果对不上,排查方向容易被带偏。

先确认问题是否真实存在

用固定 UA、固定出口、不带 Cookie 的方式连续请求几次,比对 HTML 关键片段的摘要;再用能执行 JS 的抓取方式跑几遍。如果差异总是出现在同一分流条件上,那基本是分流问题;如果每次随机,多半和 AB 测试或随机模块有关。也可以按 UA 分组看服务器日志,确认蜘蛛命中的是哪条分支。

处理思路

  1. 给蜘蛛固定一个稳定版本。可以是主版本,也可以是有代表性的版本,关键是同一 URL 长期返回一致的主内容。
  2. 把随机和个性化模块对蜘蛛收敛。首屏主内容用默认值渲染,不要把随机推荐放在决定性位置。
  3. AB 测试尽量放在非主体区域。按钮文案、样式微调这类实验对抓取判断影响小;动到标题和主体结构时,让蜘蛛命中固定分组。
  4. 灰度发布时用 URL 区分。若结构有实质变化,让新旧版本通过地址区分,而不是同一个 URL 返回两套结构。
  5. 抓取相关标签保持一致。canonical、hreflang、robots、分页标注应在所有版本里输出同样的结果。

几个容易踩的细节

一致性不是给蜘蛛单独准备一套内容,而是让主内容、结构化数据和链接在用户、蜘蛛、外部工具三类访问者之间的结果不互相矛盾。
  • 不要因为追求一致,就把用户可见内容和抓取可见内容完全分离,那样风险更大;
  • CDN 边缘节点缓存与源站版本要同步刷新,否则新旧版本会并存一段时间;
  • 改版或迁移切换时留出观察期,比对切换前后抓取日志里的差异。

小结

抓取一致性说到底就是可预测性。蜘蛛并不要求页面永远不变,而是希望变化有规律、可解释。把分流逻辑、渲染方式和缓存刷新这三条链路理顺,抓取日志里的异常往往就会自己变少。