搜尋抓取

蜘蛛看到的頁面和用戶一样吗:Cookie、會话與個性化内容的抓取影响

你在浏览器里看到的頁面,和搜尋引擎蜘蛛抓到的 HTML 常常不是同一份。Cookie、URL 里的會话參數、個性化推荐模块、登入墙與 A/B 測試,都會让两者出現差异。本文說明這些差异從哪里来,以及如何用無狀態訪問、日誌核對與渲染測試確認蜘蛛實际拿到的内容,让抓取落在完整而稳定的那個版本上。

搜尋抓取

蜘蛛看到的頁面和用戶一样吗:Cookie、會话與個性化内容的抓取影响

做搜尋抓取排查时,有一個容易被忽略的前提:你在浏览器里看到的頁面,和搜尋引擎蜘蛛拿到的那份 HTML,往往不是同一份。差异可能来自 Cookie、會话狀態、個性化推荐模块,也可能是登入墙、地域判断或前端渲染導致的。如果只按自己看到的样子判断抓取效果,结论很容易偏。

蜘蛛請求通常不携带任何 Cookie

搜尋引擎的抓取請求大多是“裸請求”:没有你的登入態,也没有你此前浏览留下的 Cookie。這意味着任何依赖 Cookie 才會出現的内容,對蜘蛛来说约等于不存在。

  • 依赖 Cookie 才顯示的正文、價格、库存、评论区,蜘蛛讀到的可能只是一個空容器;
  • 依赖登入才展開的詳情,蜘蛛只能看到登入提示;
  • 用 Cookie 记錄的分頁位置、排序偏好、語言選擇,蜘蛛不會繼承。

判断方法很直接:用無痕窗口、禁用 Cookie 後訪問頁面,看核心内容是否還在。如果核心内容消失了,說明這套展示逻辑對抓取不友好。

把會话 ID 寫進 URL 會带来什么

有些站点會在 URL 上附加會话标识,例如各類 sessionid 參數。對用戶来说只是地址栏長了一点,對抓取来说却是另一回事。

  • 同一篇内容产生大量 URL 變体,蜘蛛需要逐個抓取再归並;
  • 日誌里的抓取次數被放大,看起来抓得很勤,實际是重复劳動;
  • 内鏈指向被分散到不同變体上,連結關系變得模糊。

處理方式一般是把會话狀態放到 Cookie 或後端,不在 URL 里暴露。已经产生的带會话參數地址,可以用規范化标簽或 301 收敛到一個稳定 URL,减少蜘蛛在重复路径上的消耗。

個性化模块:同一個 URL,不同訪問者看到不同内容

推荐位、最近浏览、猜你喜欢這類模块,通常由前端根據 Cookie 或本地存储動態插入。蜘蛛抓取时這些模块往往是空的。如果正文本身也依赖同一套接口渲染,抓到的内容就會残缺。

比較稳妥的做法是把主体内容放在首屏 HTML 里,個性化模块作為补充。這样即使模块没有被渲染,蜘蛛依然能讀到頁面的核心信息,頁面主题也不會因為缺少内容而變模糊。

登入墙、地域限制與 A/B 測試

  • 登入墙:能给蜘蛛看的公開摘要尽量放在登入之前,不要把全部正文藏在登入之後,否則抓取到的只是一頁提示。
  • 地域限制:按 IP 判断地域並返回不同内容时,要確認蜘蛛来源的 IP 不會被誤判成受限地区而拿到空白頁。
  • A/B 測試:同一個 URL 随机返回两個版本,蜘蛛多次抓取可能拿到不同内容。測試結束後應及时收敛,或對蜘蛛固定返回一個版本,避免長期的不一致。

怎么確認蜘蛛實际看到了什么

  1. 從服務器日誌中筛出搜尋引擎的 User-Agent,观察返回狀態碼和响應字节數,字节數明顯偏小的頁面值得复查;
  2. 用無 Cookie、無登入狀態的無痕會话訪問同一 URL,和抓取结果做對照;
  3. 使用官方提供的抓取測試工具,查看渲染後的 HTML 與资源請求情况;
  4. 關閉 JavaScript 再訪問一次,確認正文是否仍然存在于 HTML 中。

几條可以落地的處理原則

  • 核心内容不依赖 Cookie、不依赖登入、不依赖必须执行的前端接口;
  • URL 保持稳定,不携带會话參數和临时标识;
  • 個性化與實驗性内容設定兜底版本,保證抓取时能拿到預設内容;
  • 内容差异較大时,優先用服務端渲染輸出可讀的 HTML。
蜘蛛看到的那一份頁面,才是真正參與抓取和评估的版本。先保證這一份是完整的,再去谈其他方面的調整。

如果你不确定蜘蛛看到的是什么,最省事的做法就是模拟一次無狀態訪問:清空 Cookie、登出登入、關閉脚本,再打開同一個 URL。你看到的内容,基本就接近蜘蛛看到的内容。