蜘蛛池知识

蜘蛛池入口页的差异化返回:给蜘蛛和用户看不同内容会怎样

差异化返回指入口页根据访问者身份(UA、IP、是否执行 JS)返回不同内容。本文梳理常见做法、搜索引擎的判定逻辑、CDN 缓存带来的意外,以及蜘蛛池场景下更稳妥的替代方案,帮你在不做内容伪装的前提下兼顾抓取与用户体验。

蜘蛛池知识

蜘蛛池入口页的差异化返回:给蜘蛛和用户看不同内容会怎样

把同一个 URL 做成两副面孔——蜘蛛来的时候给一个版本,普通用户来的时候给另一个版本——这在入口页运营里并不少见。有人是为了让蜘蛛只看到干净的链接列表,有人是为了把广告或弹窗挡在抓取之外。这种做法通常被叫作差异化返回,也叫内容伪装(cloaking)。它不是完全不能用,但边界很窄。

常见的几种差异化做法

实际操作中,区分访问者的依据主要有这么几类:

  • 按 UA 判断:请求头里带 Baiduspider、Googlebot 等字样就返回 A 版,其他返回 B 版。这是最常见的做法,也是最容易翻车的一种。
  • 按 IP 段判断:反查来源 IP 是否属于搜索引擎的官方网段。比 UA 稍严谨,但仍可被伪造,也可能误伤。
  • 按是否执行 JS 判断:有渲染能力的访问者看到一个版本,纯源码抓取的看到另一个版本。
  • 按 Referer 或 Cookie:从站内跳进来的给完整内容,直接访问的给简化页。

搜索引擎怎么看待这件事

主流搜索引擎的态度是明确的:如果两个版本在主体内容语义上不一致,就可能被认定为伪装,后果包括降低该站点的信任度、减少抓取频次,甚至对整批入口页做处理。

但也要说清楚,“有差异”和“伪装”不是一回事。下面这些差异通常是可以接受的:

  • 统计脚本、客服组件、个性化推荐位不同;
  • 面向移动端的排版与面向桌面端的排版不同;
  • 登录状态下显示用户名,未登录不显示。

而下面这些会明显踩线:

  • 给蜘蛛一份充满外链的页面,给用户一份几乎没链接的页面;
  • 给蜘蛛看正常内容,给用户看跳转或下载;
  • 隐藏文字、隐藏链接,只让蜘蛛读到。

几个容易被忽略的细节

缓存层会把版本串起来

如果差异化判断写在应用层,而前面挂了 CDN 或反向代理,很可能出现蜘蛛版本被缓存、再发给真实用户的情况。结果是你以为自己在做精细控制,实际上用户看到的是给蜘蛛准备的页面,投诉和跳出都会上来。判断逻辑越靠前,越要检查缓存键是否包含 UA。

日志里会留下痕迹

同一 URL 在抓取日志和访问日志里出现两套不同长度的响应,配合快照对比,主体内容不一致很容易被看出来。这类证据不需要多高明的手段就能发现。

渲染差异本身不算伪装,但会放大问题

如果入口页靠 JS 注入大量链接,源码里几乎没有可跟的链接,纯源码抓取的爬虫就看不到路径。这算不上伪装,却会让入口页对一部分爬虫失效,效果自然打折。

更稳妥的做法

入口页的核心任务是被发现和被跟随,不是和爬虫斗智。与其维护两套内容,不如把一套内容做扎实:

  1. 链接直接写在 HTML 里,不依赖 JS 注入;
  2. 广告、弹窗、浮层用异步加载,不阻塞主体内容;
  3. 需要区分场景时,只区分装饰性元素,不动正文和链接结构;
  4. 确实要针对移动端单独排版,用响应式而不是两套完全不同的内容。

如果一定要做区分,边界在哪

可以记住一条判断标准:把两个版本并排放在一起,去掉样式之后,主体内容、链接数量和指向是否基本一致。如果一致,差异只是技术实现;如果不一致,无论出发点是什么,风险都由你承担。

另外,蜘蛛池入口页往往是批量生成的,一旦模板里写了差异化逻辑,出问题的规模也是批量的。上线前先在少量入口页上验证,比全量铺开后再回滚要省事得多。

差异化返回解决的是“不想让某类访问者看到某些东西”,而搜索引擎关心的是“这个页面到底提供了什么”。两者冲突时,让步的通常不是搜索引擎。

回到入口页的本职:把可抓取的 URL 稳定地暴露出来,让爬虫有路可走。这部分收益是可预期的,而伪装带来的收益既不稳定,也不可控。