做蜘蛛池入口頁时,很多人习惯把普通網站那一套會话逻辑直接搬過来:登入態、地区偏好、訪問来源、AB 測試分组,全部塞進 Cookie 或 URL 參數里。問题是,蜘蛛的訪問方式和真實用戶差別很大,會话狀態在這條鏈路上往往是负担而不是帮助。
蜘蛛基本不携带 Cookie
主流搜尋引擎蜘蛛在首次抓取时通常不带 Cookie,後續是否保留也没有统一承诺。不同爬虫行為不一致,有的會临时接受 Set-Cookie 並在同一次會话里回传,有的直接忽略。把是否輸出連結寄存在 Cookie 上,等于把 URL 發現交给一個不确定的變量。
更麻烦的是,蜘蛛抓取往往是分布式、多出口 IP、無狀態的。同一個入口頁,今天由 A 节点抓,明天由 B 节点抓,Cookie 不共享,你寫進去的會话标记自然也不會连續。
會话 ID 寫進 URL 的代價
比 Cookie 更常见的問题是 URL 里带會话參數,例如 sessionid、sid、uid 這類字段。它带来的後果通常有三類:
- 同一個頁面被当成多個 URL 發現,重复消耗抓取预算;
- 站内連結一旦带上會话參數,蜘蛛顺着爬會产生大量副本;
- 日誌里看起来抓取量很大,實际有效 URL 却很少。
這類問题在入口頁尤其明顯,因為入口頁的連結密度高,一個參數污染會沿着連結层級放大。
用 Cookie 或 Session 做内容分流
有些入口頁會根據 Cookie 判断新訪客還是老訪客,返回不同模板,或者按會话里的地区标记切換語言。對蜘蛛来说,這會造成同一個 URL 在不同节点上抓到不同内容,既容易让缓存命中率下降,也让頁面主题變得模糊。
如果是有意對蜘蛛和用戶返回不同内容,那已经是另一類風險,不属于省事的優化手段。入口頁最好保持一份不含任何會话判断的預設輸出。
更稳妥的處理方式
- 入口頁保持無狀態:不依赖 Cookie 决定是否輸出連結;
- 會话資料放在 Cookie 里,不要出現在 URL 上;
- 必须携带的參數做規范化:固定顺序、统一大小寫、统一尾斜杠;
- 需要区分地区或語言时,用獨立路径或子域,而不是同一個 URL 靠 Cookie 切換;
- 在訪問日誌里按是否带 Cookie 分组統計,观察蜘蛛抓取的差异。
上线前可以自查的几点
- 清空 Cookie 後訪問入口頁,首屏連結是否完整輸出;
- URL 中是否残留 session、sid、token 之類參數;
- 是否存在僅当 Cookie 存在时才輸出分頁或列表的逻辑;
- 响應头里是否因為會话判断而寫了影响缓存的字段。
给蜘蛛保留一條干净、無需會话的訪問路径,是入口頁设計里最省事的一條原則。會话狀態留给用戶,連結輸出留给預設逻辑。