不少做蜘蛛池的站長會在入口頁上做用戶分流:第一次来给 A 版,第二次给 B 版;或者用 Set-Cookie 记錄訪問次數,超過阈值就跳到別處。這套逻辑對着真實用戶没問题,但對着搜尋引擎蜘蛛,结果往往和预期相反。原因很朴素:蜘蛛不是“用戶”,它不带會话。
蜘蛛的預設行為:無 Cookie 的干净請求
主流搜尋引擎的抓取請求,绝大多數情况下第一次訪問不携带任何 Cookie,服務端返回的 Set-Cookie 它也不會儲存,更不會在後續請求里回传。也就是说,同一個入口頁被反复抓取十次,在服務端看来就是“十個全新的第一次訪問”。
個別场景會有例外,比如某些站長工具自带的抓取測試,或者特定爬虫對個別站点做過狀態保持,但這些属于特例,不能当作入口頁设計的前提。把 Cookie 当成蜘蛛會记住的東西,是這類頁面最常见的誤判。
一旦用 Cookie 决定内容,蜘蛛只會看到同一條路
假设入口頁的逻辑是:無 Cookie 走分支 A,有 Cookie 走分支 B。蜘蛛永遠走 A。如果分支 A 恰好是“引導頁 → 跳轉 → 再跳轉”,那么蜘蛛的抓取鏈就停在這條鏈上,永遠不會到達後面對應的内容。
更隐蔽的一種是限次分流:代碼里寫“同一訪客訪問三次後不再展示入口頁”。這個計數器放在 Cookie 里,對蜘蛛就永遠不生效;放在服務端按 IP 統計,又可能誤伤同 IP 段的正常抓取,甚至把整段机房的請求一起挡掉。两種做法都需要先想清楚:你到底是想让蜘蛛看到入口頁,還是想让它尽快离開。
Session ID 寫進 URL 是另一個坑
有些老框架會在 URL 里带上 ;jsessionid=xxxx 這類會话标识。同一個頁面因此會衍生出大量带不同參數的地址,蜘蛛把這些当成不同 URL 逐一抓取,抓取预算就被浪費在重复内容上,反而拖累了真正需要被發現的目标頁。
如果确實需要會话跟踪,让标识待在 Cookie 里,不要放進 URL;並且在 robots 或服務端判断中,對已知 UA 直接返回不带會话逻辑的静態版本。這样做既保留了真實用戶的体驗,也不至于让蜘蛛在參數迷宫里打轉。
需要做會话判断时,怎么和蜘蛛共存
- 按 IP + UA 识別已知蜘蛛:命中後直接返回最完整的静態内容,跳過所有分流、限次和彈窗逻辑。
- 保持路径一致:同一 UA、同一 IP 段訪問同一入口頁,返回的 HTML 不應每次都不同,避免蜘蛛反复抓到不同版本。
- 不要把關键内容放在登入墙後:需要 Cookie 才能看到的内容,對蜘蛛等于不存在。
- canonical 與 hreflang 不要依赖 Cookie:這類标簽應在無 Cookie 狀態下也輸出一致的值。
几個可以马上做的自测
- 用 curl 或浏览器隐私窗口訪問入口頁,观察返回的 HTML 與正常訪問是否一致。
- 在訪問日誌里按蜘蛛 UA 過滤,看這些請求是否携带 Cookie、是否命中了分流分支。
- 把服務端的分流命中结果單獨记錄一段時間,確認蜘蛛請求的返回是否稳定。
入口頁的设計逻辑,最好建立在“蜘蛛每次都是全新訪問”這個前提上。凡是依赖會话狀態才成立的分流、限次、跳轉,都要先問一句:無 Cookie 的第一次訪問,它會看到什么。
说到底,Cookie 和 Session 是给人用的工具,不是给蜘蛛用的。把它們用在登入、购物车、用戶偏好上没問题;一旦用来决定蜘蛛能看到哪些内容、能不能繼續往下走,就等于在抓取鏈路上加了一道随机闸门。先把這個闸门拆掉或者對蜘蛛放行,再谈入口頁的内容和連結结构,思路會清楚很多。