蜘蛛池入口頁的任務是让搜尋蜘蛛稳定地發現連結、顺着連結往下走。但很多人忽略了:蜘蛛每一次抓取,都是一個没有身份的陌生訪客——它不带 Cookie、不维持會话,也不會点击“同意”按钮。入口頁如果依赖這些狀態,蜘蛛看到的頁面可能和你用浏览器看到的不一样。
蜘蛛訪問时不携带什么
主流搜尋引擎的抓取程序在多數情况下不會保留上一次訪問的 Cookie,也不會执行登入、勾選偏好這類操作。這意味着:
- 依赖 Session 判断“是否已訪問過”的分流逻辑,對蜘蛛基本無效;
- 需要点击“接受 Cookie 政策”才展開的正文或連結,蜘蛛很可能看不到;
- 把連結清單放在“最近浏览”“猜你喜欢”這類個性化模块里,蜘蛛拿不到;
- 前端根據 Cookie 做 A/B 測試,蜘蛛可能一直落在同一個版本,甚至落到空版本。
三個连鎖反應
1. 會话與個性化模块被掐断
入口頁最核心的東西是連結。如果模板把這些連結放進需要狀態才渲染的模块,蜘蛛抓到的就是一具没有出口的骨架。稳妥的做法是把主要連結放在首屏的静態 HTML 里,個性化模块只作為补充,而不是唯一入口。
2. 基于 IP 或地域的跳轉
不少入口頁會根據訪問者 IP 做地域跳轉,比如把海外 IP 導到一個“全球版”頁面。蜘蛛的出口 IP 和你所在地往往不同,它可能被跳到一個内容與連結都不同的版本,甚至跳進循环。若要做地域分流,至少保證不同版本的核心連結结构一致。
3. 缓存层的 Vary: Cookie
如果响應头里带着 Vary: Cookie,缓存會把每個不同 Cookie 的請求都当作獨立版本,命中率下降、回源變多,服務器更容易變慢;對蜘蛛而言,它每次拿到的版本也可能不稳定。入口頁是给蜘蛛看的“公告栏”,内容應当尽量與訪客狀態無關。
調整顺序:先保證預設狀態可讀
- 用無痕窗口或自定义 UA 抓取入口頁,對比正常浏览器的返回结果;
- 關閉 JavaScript,看首屏還剩多少可点击的連結;
- 清掉 Cookie 再抓一次,確認頁面没有因為缺少會话而少内容;
- 检查缓存與 CDN 的缓存键規則,避免把 Cookie、UA 混進键里;
- 把“同意條款”“登入提示”這類遮挡层,做成不阻断 HTML 輸出的形式。
日誌里能看到什么
在服務器日誌中,可以對比同一入口頁在蜘蛛 UA 與普通浏览器 UA 下的响應体大小和狀態碼。如果蜘蛛請求返回的体量明顯偏小,或者狀態碼是 302,又或者返回 200 但内容偏短,多半就是狀態相關逻辑在起作用。观察周期建议按周看,不要凭單次抓取下结论。
不建议给蜘蛛做特殊處理
针對蜘蛛 UA 返回一套完全不同的内容,短期也许能看到抓取上的變化,但模板差异過大时可能被判定為伪装,反而让入口頁失去信任。更稳妥的做法是让預設版本本身就對蜘蛛友好:連結在 HTML 里、跳轉鏈短、缓存規則简單。真要做区分,也尽量控制在同一套模板的细微差异内,比如是否展示個性化推荐位。
提示:蜘蛛不带 Cookie 這件事本身不是問题,問题是你把“必须带狀態才能看到的内容”当成了唯一入口。把預設狀態下的頁面做好,比针對蜘蛛做特殊處理更省事,也更稳。