搜尋抓取

A/B 測試、地域與個性化:蜘蛛抓取时看到的到底是哪一版

同一地址,用戶和蜘蛛可能拿到不同的 HTML。本文梳理 A/B 測試、地域定向、登入態和個性化模块如何影响蜘蛛看到的版本,给出用爬虫视角核對頁面的具体检查步骤,以及让預設版本保持稳定、可索引的處理原則。

搜尋抓取

A/B 測試、地域與個性化:蜘蛛抓取时看到的到底是哪一版

同一篇文章,北京的用戶看到價格 A,上海的用戶看到價格 B;新訪客看到首頁大图,老訪客看到推荐流;實驗组看到标题甲,對照组看到标题乙。這些都是常见的产品策略,但對搜尋蜘蛛来说會變成一件麻烦事:蜘蛛拿到的頁面,和你以為的頁面,可能不是同一份。

不一致從哪来:触發條件在請求阶段就生效

内容差异通常由几種信号决定,而它們都發生在服務器返回 HTML 之前:

  • Cookie 與會话:實驗分组、登入態、购物车、浏览歷史。
  • User-Agent:移動端與桌面端模板、爬虫专用渲染分支。
  • IP 归属地:按地域切換語言、货幣、库存、门店。
  • 来源渠道或 Referer:從广告連結進入时的落地頁變体。
  • 随机與時間:轮播、榜單、按哈希分组的實驗。

蜘蛛的請求通常不带 Cookie、不登入、UA 明确标注為爬虫,出口 IP 来自机房而不是某個城市的家庭宽带。于是它天然落進了“預設分支”。問题在于,預設分支未必是你希望被检索的那一版。

几個容易踩到的具体场景

實驗组與對照组内容不同

如果 A/B 測試在服務端分流,蜘蛛每次抓取可能被分到不同组,看到不同的标题、简介甚至價格。反复抓到互相矛盾的版本,會让頁面内容的判断變得不稳定;如果對照组恰好是“藏起了主推内容”的版本,還可能被当成内容缩水。

地域化或語言化内容

按 IP 切換語言时,蜘蛛的出口 IP 决定了它看到哪種語言。如果只靠這條逻辑来区分多語言版本,很容易出現“每個語言版本看起来都差不多”,或者只有一種語言被稳定识別的情况。

登入墙與會員内容

未登入狀態只能看到摘要、提示條或空区块。蜘蛛不登入,所以它看到的是门外的样子。若這類頁面上的有效正文太少,主题判断就會偏向導航和推荐位。

怎么確認蜘蛛看到的是哪一版

  1. 用 curl 之類工具,把 UA 设成蜘蛛的标识去請求目标 URL,儲存返回的 HTML,不要只看浏览器渲染後的结果。
  2. 不带 Cookie、使用干净會话,重复請求几次,看返回内容是否稳定一致。
  3. 再發一次带正常 Cookie 和浏览器 UA 的請求,逐項對比标题、正文、價格、内鏈的差別。
  4. 覆盖多個出口 IP,測試地域化逻辑實际會落到哪個預設語言版本。
  5. 在抓取日誌里按 UA 過滤,抽查蜘蛛拿到的响應体大小與狀態碼,異常偏小的响應值得單獨看。

處理原則:让預設版本稳定且可索引

  • 預設分支必须是一份完整、能獨立成立的頁面。實驗變体可以是它的改進版,但不能是唯一有正文的版本。
  • 重要内容不要只存在于實驗组。标题、核心正文、主要内鏈應始终出現在預設响應里。
  • 把變体放到 URL 上。多語言、多地区内容各用獨立地址,配合 hreflang 标注對應關系,通常比让同一地址返回不同内容更容易维護。
  • 不要让蜘蛛被跳轉甩走。用 302 把蜘蛛導向另一個變体,容易让它停在中間环节,連結關系的判断也會變得混乱。
  • 個性化区块保持在次要位置。推荐流、最近浏览這類模块可以個性化,但不要挤掉主内容的位置。
判断标准很简單:一個不带 Cookie、不登入、来自机房 IP 的請求,拿到的那份 HTML 是否是一份内容完整、结构清晰的頁面。如果不是,先修預設版本,再谈抓取和索引。

把這件事当成日常检查項,比在抓取出問题时逐個环节排查更省力。尤其是刚上线實驗、准备做多語言,或者给站点新加了一层邊缘規則之後,值得重新用爬虫的视角把頁面看一遍。