蜘蛛池知识

蜘蛛池入口頁的 Cookie 與登入態:蜘蛛不带 Cookie 时看到的是哪一版

蜘蛛抓取入口頁时通常不带 Cookie,也不执行前端寫入逻辑,因此頁面在“首次訪問”分支下返回什么,才是蜘蛛真正拿到的内容。本文梳理彈窗、會话依赖、狀態跳轉這三類常见問题,並给出用 curl 與日誌排查、把正文改成無狀態輸出的具体做法,帮你在接入蜘蛛池前先確認蜘蛛看到的版本無誤。

蜘蛛池知识

蜘蛛池入口頁的 Cookie 與登入態:蜘蛛不带 Cookie 时看到的是哪一版

做蜘蛛池的时候,很多人會把注意力放在連結、IP、跳轉這些顯眼的地方,却忽略了一個很隐蔽的變量:Cookie。蜘蛛来抓入口頁时,通常不携带任何 Cookie,也不执行 JavaScript 里的寫入逻辑。如果你的頁面只在某些狀態下才輸出正文,蜘蛛看到的可能就是另一版。

蜘蛛的請求和普通用戶差在哪

普通用戶訪問时,浏览器會带上第一次响應里 Set-Cookie 下發的值,服務器據此识別“這個人来過”。蜘蛛的請求更像一次干净的首次訪問:没有 Cookie,没有本地存储,没有登入態。也就是说,入口頁在“首次訪問”這一分支下返回什么,才是蜘蛛真正拿到的東西。

三類容易被忽略的問题

同意框或彈窗挡在正文前面

合規提示、地区選擇、語言切換這類彈窗,常用 Cookie 记錄“已確認”。蜘蛛每次都算首次訪問,于是每次都命中彈窗分支。如果彈窗是前端渲染的,影响有限;但如果是服務端判断後輸出一段占位 HTML,正文就會被挤掉。

正文依赖會话才生成

有些入口頁為了防采集,會先下發 Cookie,再在後續請求里輸出真實連結。蜘蛛拿不到第二步,自然只能看到一個空壳。這類设計在人工測試时完全正常,因為浏览器帮你把 Cookie 走完了。

狀態判断触發了跳轉

“未登入跳轉到 A,已登入跳轉到 B”的逻辑,蜘蛛永遠落在未登入那一支。如果 A 是首頁或驗證頁,入口頁實际上就没被訪問到。反過来,如果你的目标是让蜘蛛看到某一版,就要確認這一版在無 Cookie 时也能直接返回。

排查方法

  1. 用不带 Cookie 的請求抓一次入口頁,例如 curl -I 看响應头,再抓完整正文對比長度。
  2. 切換成蜘蛛 UA 再抓一次,看返回内容是否和普通 UA 一致。
  3. 检查响應头里的 Set-Cookie,確認是否存在依赖它的後續逻辑。
  4. 在訪問日誌里观察蜘蛛請求,看它是否反复拿到同一個中間態頁面。
  5. 關掉浏览器缓存與 Cookie,用無痕窗口手工复現一次。

處理建议

  • 入口頁的正文與核心連結尽量做成無狀態輸出,不依赖 Cookie。
  • 彈窗、提示條放在前端渲染,避免占用服務端的正文輸出。
  • 必须用 Cookie 做分流时,给蜘蛛 UA 一條明确的放行分支,並保持内容與目标頁一致。
  • 別把 Cookie 当防采集手段,它拦不住采集,却容易誤伤蜘蛛。
判断标准很简單:關掉 Cookie 打開入口頁,如果看到的和你希望蜘蛛看到的不一样,那蜘蛛看到的也不是你希望的那一版。