同一篇文章,北京的用戶看到價格 A,上海的用戶看到價格 B;新訪客看到首頁大图,老訪客看到推荐流;實驗组看到标题甲,對照组看到标题乙。這些都是常见的产品策略,但對搜尋蜘蛛来说會變成一件麻烦事:蜘蛛拿到的頁面,和你以為的頁面,可能不是同一份。
不一致從哪来:触發條件在請求阶段就生效
内容差异通常由几種信号决定,而它們都發生在服務器返回 HTML 之前:
- Cookie 與會话:實驗分组、登入態、购物车、浏览歷史。
- User-Agent:移動端與桌面端模板、爬虫专用渲染分支。
- IP 归属地:按地域切換語言、货幣、库存、门店。
- 来源渠道或 Referer:從广告連結進入时的落地頁變体。
- 随机與時間:轮播、榜單、按哈希分组的實驗。
蜘蛛的請求通常不带 Cookie、不登入、UA 明确标注為爬虫,出口 IP 来自机房而不是某個城市的家庭宽带。于是它天然落進了“預設分支”。問题在于,預設分支未必是你希望被检索的那一版。
几個容易踩到的具体场景
實驗组與對照组内容不同
如果 A/B 測試在服務端分流,蜘蛛每次抓取可能被分到不同组,看到不同的标题、简介甚至價格。反复抓到互相矛盾的版本,會让頁面内容的判断變得不稳定;如果對照组恰好是“藏起了主推内容”的版本,還可能被当成内容缩水。
地域化或語言化内容
按 IP 切換語言时,蜘蛛的出口 IP 决定了它看到哪種語言。如果只靠這條逻辑来区分多語言版本,很容易出現“每個語言版本看起来都差不多”,或者只有一種語言被稳定识別的情况。
登入墙與會員内容
未登入狀態只能看到摘要、提示條或空区块。蜘蛛不登入,所以它看到的是门外的样子。若這類頁面上的有效正文太少,主题判断就會偏向導航和推荐位。
怎么確認蜘蛛看到的是哪一版
- 用 curl 之類工具,把 UA 设成蜘蛛的标识去請求目标 URL,儲存返回的 HTML,不要只看浏览器渲染後的结果。
- 不带 Cookie、使用干净會话,重复請求几次,看返回内容是否稳定一致。
- 再發一次带正常 Cookie 和浏览器 UA 的請求,逐項對比标题、正文、價格、内鏈的差別。
- 覆盖多個出口 IP,測試地域化逻辑實际會落到哪個預設語言版本。
- 在抓取日誌里按 UA 過滤,抽查蜘蛛拿到的响應体大小與狀態碼,異常偏小的响應值得單獨看。
處理原則:让預設版本稳定且可索引
- 預設分支必须是一份完整、能獨立成立的頁面。實驗變体可以是它的改進版,但不能是唯一有正文的版本。
- 重要内容不要只存在于實驗组。标题、核心正文、主要内鏈應始终出現在預設响應里。
- 把變体放到 URL 上。多語言、多地区内容各用獨立地址,配合 hreflang 标注對應關系,通常比让同一地址返回不同内容更容易维護。
- 不要让蜘蛛被跳轉甩走。用 302 把蜘蛛導向另一個變体,容易让它停在中間环节,連結關系的判断也會變得混乱。
- 個性化区块保持在次要位置。推荐流、最近浏览這類模块可以個性化,但不要挤掉主内容的位置。
判断标准很简單:一個不带 Cookie、不登入、来自机房 IP 的請求,拿到的那份 HTML 是否是一份内容完整、结构清晰的頁面。如果不是,先修預設版本,再谈抓取和索引。
把這件事当成日常检查項,比在抓取出問题时逐個环节排查更省力。尤其是刚上线實驗、准备做多語言,或者给站点新加了一层邊缘規則之後,值得重新用爬虫的视角把頁面看一遍。