蜘蛛池知识

蜘蛛池入口頁的差异化返回:给蜘蛛和用戶看不同内容會怎样

差异化返回指入口頁根據訪問者身份(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 稳定地暴露出来,让爬虫有路可走。這部分收益是可预期的,而伪装带来的收益既不稳定,也不可控。