做蜘蛛池的时候,很多人會把注意力放在連結、IP、跳轉這些顯眼的地方,却忽略了一個很隐蔽的變量:Cookie。蜘蛛来抓入口頁时,通常不携带任何 Cookie,也不执行 JavaScript 里的寫入逻辑。如果你的頁面只在某些狀態下才輸出正文,蜘蛛看到的可能就是另一版。
蜘蛛的請求和普通用戶差在哪
普通用戶訪問时,浏览器會带上第一次响應里 Set-Cookie 下發的值,服務器據此识別“這個人来過”。蜘蛛的請求更像一次干净的首次訪問:没有 Cookie,没有本地存储,没有登入態。也就是说,入口頁在“首次訪問”這一分支下返回什么,才是蜘蛛真正拿到的東西。
三類容易被忽略的問题
同意框或彈窗挡在正文前面
合規提示、地区選擇、語言切換這類彈窗,常用 Cookie 记錄“已確認”。蜘蛛每次都算首次訪問,于是每次都命中彈窗分支。如果彈窗是前端渲染的,影响有限;但如果是服務端判断後輸出一段占位 HTML,正文就會被挤掉。
正文依赖會话才生成
有些入口頁為了防采集,會先下發 Cookie,再在後續請求里輸出真實連結。蜘蛛拿不到第二步,自然只能看到一個空壳。這類设計在人工測試时完全正常,因為浏览器帮你把 Cookie 走完了。
狀態判断触發了跳轉
“未登入跳轉到 A,已登入跳轉到 B”的逻辑,蜘蛛永遠落在未登入那一支。如果 A 是首頁或驗證頁,入口頁實际上就没被訪問到。反過来,如果你的目标是让蜘蛛看到某一版,就要確認這一版在無 Cookie 时也能直接返回。
排查方法
- 用不带 Cookie 的請求抓一次入口頁,例如 curl -I 看响應头,再抓完整正文對比長度。
- 切換成蜘蛛 UA 再抓一次,看返回内容是否和普通 UA 一致。
- 检查响應头里的 Set-Cookie,確認是否存在依赖它的後續逻辑。
- 在訪問日誌里观察蜘蛛請求,看它是否反复拿到同一個中間態頁面。
- 關掉浏览器缓存與 Cookie,用無痕窗口手工复現一次。
處理建议
- 入口頁的正文與核心連結尽量做成無狀態輸出,不依赖 Cookie。
- 彈窗、提示條放在前端渲染,避免占用服務端的正文輸出。
- 必须用 Cookie 做分流时,给蜘蛛 UA 一條明确的放行分支,並保持内容與目标頁一致。
- 別把 Cookie 当防采集手段,它拦不住采集,却容易誤伤蜘蛛。
判断标准很简單:關掉 Cookie 打開入口頁,如果看到的和你希望蜘蛛看到的不一样,那蜘蛛看到的也不是你希望的那一版。