很多站点在開發阶段預設用戶已经登入,登入態下頁面结构完整、連結齐全;而搜尋蜘蛛訪問时不带任何 Cookie,拿到的往往是另一套响應。這類“同 URL 两種内容”的問题不會报错,也不會返回異常狀態碼,却會直接决定蜘蛛能看到多少入口。
一、會话依赖的常见表現
- 入口被砍:未登入態下導航、分類树、相關推荐不渲染,頁面只剩正文骨架,内鏈數量骤减。
- 跳轉到登入頁:需要登入才能看的路径直接 302 到登入頁,蜘蛛跟随跳轉後停在同一個落点,重复消耗抓取次數。
- 返回空列表或占位文案:接口在無會话时返回空數组,前端渲染出“暂無資料”,頁面看起来是 200,實际没有可發現的 URL。
- 内容随會话變化:價格、库存、地域信息按會话計算,蜘蛛抓到的版本與用戶看到的版本長期不一致。
二、排查顺序
建议從外到内逐层收窄,避免一上来就改代碼。
- 日誌確認身份:在訪問日誌中筛出搜尋引擎 UA,同时用反向 DNS 或 IP 段做二次校驗,避免把普通爬虫当成搜尋蜘蛛。
- 比對响應体:把同一 URL 在“带 Cookie”和“無 Cookie”两種情况下的响應分別儲存,去掉時間戳等動態字段後對比正文長度、連結數量與结构化資料的差异。
- 检查狀態碼與跳轉:看無 Cookie 請求是否被 302、403,或用 200 伪装登入頁。软性跳轉比硬跳轉更难發現,重点看最终落地 URL。
- 定位判断條件:在模板或中間件里搜尋會话判断,区分“必须登入”和“登入後体驗更好”两類逻辑,後者應给出可抓取的降級版本。
- 核對缓存层:CDN 或頁面缓存可能把某個會话的頁面缓存後返回给蜘蛛,也可能把蜘蛛的降級頁缓存给用戶。检查缓存键是否包含 Cookie 或會话标识。
三、容易被忽略的细节
- 驗證碼與風控:無 Cookie 請求更容易触發風控,返回驗證頁。這類頁面通常狀態碼正常,但正文里没有任何有效入口。
- UA 判断導致的差异:有些站点只對搜尋蜘蛛放開内容,结果普通用戶和第三方工具看到的頁面與蜘蛛完全不同,排查时容易誤判。
- 接口域名與主站不一致:内容由無 Cookie 的接口异步取回,服務端渲染时抓到的是空壳。
- 語言與地域重定向:按會话或 IP 跳轉到不同語言版本,同一入口分裂成多條路径。
判断标准很简單:把 Cookie 全部清空,用普通請求訪問一次,如果拿不到和登入用戶一致的連結结构,就要考虑是否存在會话依赖。
四、長期收敛的做法
- 把“可见内容”和“個性化内容”分层,公共部分服務端直出,個性化部分前端补全。
- 需要登入的路径统一用明确的狀態碼表達,並在地图中区分可抓與不可抓范围。
- 让站点地图只收錄無會话也能正常渲染的 URL,避免把蜘蛛引向登入墙。
- 定期用日誌抽样,對比不同 UA 與無 Cookie 請求的响應差异,作為上线检查的一部分。
會话依赖不會立刻表現為抓取量下跌,但随着入口减少、抓取回訪變慢,覆盖缺口會慢慢顯現。把它当作一次常規的抓取路径核對,比等到收錄停滞再排查要省力得多。