搜索抓取

同一个 URL 两套内容:给蜘蛛单独开小灶的代价

同一网址返回两套内容,在动态渲染、地区跳转、A/B 测试和登录墙等场景里很常见。蜘蛛抓到 A 版本、用户看到 B 版本,URL 发现、索引版本和内链传递都会受影响。本文梳理几类典型场景的处理方式,并给出一份可执行的自查清单。

搜索抓取

同一个 URL 两套内容:给蜘蛛单独开小灶的代价

为什么会出现“同一个 URL 两套内容”

一个网址只对应一份内容,是抓取和索引能成立的前提。但在实际站点里,同一 URL 返回不同结果的情况很常见:

  • 用 UA 判断,遇到蜘蛛返回纯文本或预渲染版本,遇到用户返回正常前端应用;
  • CDN 或 WAF 规则里给搜索引擎 IP 段放行,普通访问者却要先过验证页;
  • 根据 IP 或浏览器语言做地区跳转,蜘蛛从海外机房访问就落到另一个版本;
  • A/B 测试脚本在页面加载时替换了标题、正文甚至链接,蜘蛛取到的 HTML 和用户看到的不一致;
  • 内容被放在登录墙、付费墙或“点击展开”之后。

这些做法各有理由,但都会让蜘蛛拿到的页面和用户看到的页面不是同一份。抓取环节一旦出现这种分裂,后面的解析、索引、展示都会跟着偏移。

对抓取路径的实际影响

URL 发现会变窄

蜘蛛沿链接前进。如果它拿到的版本里链接要靠 JS 渲染才有,或者被精简掉,它能发现的 URL 数量就会少一大截。尤其导航、分页、相关推荐这些区域被替换掉时,深层内容可能长期得不到入口。

索引里的版本可能不是用户看到的

蜘蛛抓走 A 版本,用户访问看到 B 版本,搜索结果展示的摘要、标题可能对不上。这类不一致往往要靠人工排查才能发现,因为站内自查时看到的一直是用户版本。

有被判定为作弊的风险

刻意给蜘蛛看一套、给用户看另一套,属于典型的欺骗性做法。即便出发点只是“让蜘蛛能读懂”,只要两套内容差异足够大,也可能被归到同一类问题里处理。区别只在意图,机器判断时未必分得清。

几类常见场景怎么处理

预渲染与动态渲染

如果站点是前端渲染,希望蜘蛛拿到可抓取的 HTML,正确做法是让返回给蜘蛛的版本包含与用户版本一致的核心内容(标题、正文、主要链接),并且最终用户访问的 URL 不变。避免只渲染正文而丢掉内链,也避免给蜘蛛返回一个“简化到没有导航”的页面。

地区与语言跳转

按 IP 强制跳转是最容易出问题的一类。更稳的做法是:每个语言或地区版本有独立且可直达的 URL,用 hreflang 互相标注,跳转只作为提示而不是唯一入口,同时保证默认版本可以直接访问,不被自动跳转拦住。

A/B 测试与个性化

测试尽量放在可区分的参数或临时路径上,结束后收敛回主 URL;不要让同一 URL 长期返回两套正文。个性化模块(推荐、价格、库存)如果只影响局部,尽量保留主体内容一致,避免整页替换。

登录墙与付费墙

完全挡在登录之后的页面,蜘蛛拿不到内容,也就很难参与索引。如果希望部分内容能被发现,可以放开首段或摘要,并把付费部分明确标注;不要一边要求登录、一边期待完整收录。

判断标准很简单:关掉 JS、换一个陌生 UA、清空 Cookie,用普通请求抓一次,看拿到的 HTML 里有没有你想要蜘蛛看到的内容。如果答案不一致,问题就已经存在了。

自查清单

  1. 用命令行工具或抓取工具,分别以普通用户 UA 和搜索引擎 UA 请求同一 URL,对比返回的 HTML 差异。
  2. 关闭 JS 后查看源码,确认标题、正文、主要内链是否还在。
  3. 检查 CDN、WAF、反爬规则里是否存在针对特定 UA 或 IP 段的差异化放行。
  4. 用不同地区的出口 IP 访问,确认是否发生强制跳转。
  5. 检查 robots.txt、meta robots 与 X-Robots-Tag 是否在不同版本下返回不同结果。
  6. 确认移动端与桌面端版本内容一致,不存在只给其中一端提供链接的情况。

小结

抓取路径要顺畅,前提是路径本身对蜘蛛可见且稳定。与其给蜘蛛单独准备一份内容,不如让同一份内容同时对人和对机器可读:链接写在 HTML 里,正文不依赖点击才出现,地区版本各有固定地址。做到这一点,抓取、URL 发现和内链传递都会少很多说不清的麻烦。