同一篇文章,北京的用户看到价格 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 是否是一份内容完整、结构清晰的页面。如果不是,先修默认版本,再谈抓取和索引。
把这件事当成日常检查项,比在抓取出问题时逐个环节排查更省力。尤其是刚上线实验、准备做多语言,或者给站点新加了一层边缘规则之后,值得重新用爬虫的视角把页面看一遍。