做搜尋抓取排查时,有一個容易被忽略的前提:你在浏览器里看到的頁面,和搜尋引擎蜘蛛拿到的那份 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 随机返回两個版本,蜘蛛多次抓取可能拿到不同内容。測試結束後應及时收敛,或對蜘蛛固定返回一個版本,避免長期的不一致。
怎么確認蜘蛛實际看到了什么
- 從服務器日誌中筛出搜尋引擎的 User-Agent,观察返回狀態碼和响應字节數,字节數明顯偏小的頁面值得复查;
- 用無 Cookie、無登入狀態的無痕會话訪問同一 URL,和抓取结果做對照;
- 使用官方提供的抓取測試工具,查看渲染後的 HTML 與资源請求情况;
- 關閉 JavaScript 再訪問一次,確認正文是否仍然存在于 HTML 中。
几條可以落地的處理原則
- 核心内容不依赖 Cookie、不依赖登入、不依赖必须执行的前端接口;
- URL 保持稳定,不携带會话參數和临时标识;
- 個性化與實驗性内容設定兜底版本,保證抓取时能拿到預設内容;
- 内容差异較大时,優先用服務端渲染輸出可讀的 HTML。
蜘蛛看到的那一份頁面,才是真正參與抓取和评估的版本。先保證這一份是完整的,再去谈其他方面的調整。
如果你不确定蜘蛛看到的是什么,最省事的做法就是模拟一次無狀態訪問:清空 Cookie、登出登入、關閉脚本,再打開同一個 URL。你看到的内容,基本就接近蜘蛛看到的内容。