用浏览器打開入口頁,看到的是完整内容;換一個不带 Cookie 的工具再抓一次,可能只剩一個登入提示或者一段空壳。這種落差在蜘蛛池里很常见,原因往往不在頁面本身,而在服務端的會话逻辑。
蜘蛛手里没有你昨天留下的 Cookie
搜尋引擎蜘蛛的抓取請求通常是無狀態的:它第一次来不带 Cookie,服務器下發 Set-Cookie 之後,它下一次来大概率還是不带。也就是说,任何“首次訪問给一種内容、回訪给另一種内容”的设計,在蜘蛛眼里都會被压缩成同一個版本——几乎永遠是“首次訪問”那個版本。
如果那個版本恰好是被精简、被拦截、被要求驗證的版本,入口頁對蜘蛛的可用性就會大打折扣。你用浏览器換 IP 測試十次都正常,是因為浏览器替你保留了 Cookie,蜘蛛没有這個過程。
依赖 Session 的判断最容易踩空
- 訪問計數:靠 session 记錄“今天第几次来”,蜘蛛每次都算第一次,可能永遠命中限流分支。
- 内容分級:以“未登入只顯示摘要”作為預設逻辑,蜘蛛拿到的就是摘要。
- 彈窗同意:如果服務端在缺少某個同意 Cookie 时直接返回遮挡层,蜘蛛讀到的也是遮挡层。
- 驗證跳轉:先種一個 Cookie,再靠 JavaScript 校驗它是否被带回来,蜘蛛基本過不去這一關。
這些問题在普通用戶视角几乎看不出来,但在入口頁這種专门给蜘蛛看的位置上,代價會被放大。
Set-Cookie 本身不拦蜘蛛,拦的是依赖它的逻辑
下發 Cookie 是正常行為,搜尋引擎不會因為响應里有 Set-Cookie 就拒绝抓取。真正有風險的是後續那套“必须有 Cookie 才放行”的机制:它把蜘蛛推到了一個它無法满足的條件上。同理,CDN 或 WAF 如果在 Set-Cookie 之後加了校驗,也可能让入口頁對蜘蛛返回一個中間態頁面。
還有一種情况是 Cookie 與缓存互相干扰:CDN 缓存了一份带 Set-Cookie 的响應,不同訪客拿到的狀態彼此污染。入口頁最好保持可缓存、無個性化,减少這類不确定性。
几個常见誤区
- “我關了 JavaScript 也能看到内容,所以蜘蛛没問题”:脚本执行只是其中一個變量,Cookie 和會话是另一條獨立的线,要分別驗證。
- “用無痕模式就等于蜘蛛视角”:無痕只是不保留 Cookie,請求头、UA、IP 依然和蜘蛛不同,只能算近似。
- “加了防爬顺带就把坏蜘蛛挡了”:多數通用防爬手段不区分好坏,容易连同正常蜘蛛一起挡在门外。
- “測試时正常,上线就一定正常”:上线後 CDN、WAF、负载均衡各自可能引入新的會话行為,最好在真實鏈路再驗一次。
使用建议
- 让入口頁尽量無狀態:不依赖 session 决定返回什么内容,第一屏對任何訪客保持一致。
- 驗證时用不带 Cookie的方式抓取,例如命令行請求或明确禁用 Cookie 的抓取工具,把返回体與浏览器看到的版本做對比。
- 如果业務上必须有登入或驗證逻辑,確認存在一條對蜘蛛放行的路径,並且這條路径返回的是真實内容而不是占位頁。
- 想区分訪客類型,靠日誌里的 UA、IP 段和訪問频率去分析,不要用 Cookie 当作蜘蛛檢測手段。
- 检查 CDN 與 WAF 規則,避免“種 Cookie 再二次校驗”的鏈路把入口頁變成一道门槛。
把入口頁当成一個公開、無狀態的頁面来對待,通常比研究各種识別技巧更省事。蜘蛛不需要被特別接待,它只需要不被拦住。