蜘蛛池知识

蜘蛛池入口页的 Cookie 与 Session:蜘蛛访问时会带上什么

很多入口页用 Cookie 做分流、限次或判断老访客,但对搜索引擎蜘蛛来说,这些逻辑基本不生效。蜘蛛的抓取请求通常不带 Cookie,也不保存 Set-Cookie,因此每次访问都等同于全新用户。本文说明这种差异会导致哪些抓取偏差,以及需要会话判断时该怎么和蜘蛛共存。

蜘蛛池知识

蜘蛛池入口页的 Cookie 与 Session:蜘蛛访问时会带上什么

不少做蜘蛛池的站长会在入口页上做用户分流:第一次来给 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 状态下也输出一致的值。

几个可以马上做的自测

  1. 用 curl 或浏览器隐私窗口访问入口页,观察返回的 HTML 与正常访问是否一致。
  2. 在访问日志里按蜘蛛 UA 过滤,看这些请求是否携带 Cookie、是否命中了分流分支。
  3. 把服务端的分流命中结果单独记录一段时间,确认蜘蛛请求的返回是否稳定。
入口页的设计逻辑,最好建立在“蜘蛛每次都是全新访问”这个前提上。凡是依赖会话状态才成立的分流、限次、跳转,都要先问一句:无 Cookie 的第一次访问,它会看到什么。

说到底,Cookie 和 Session 是给人用的工具,不是给蜘蛛用的。把它们用在登录、购物车、用户偏好上没问题;一旦用来决定蜘蛛能看到哪些内容、能不能继续往下走,就等于在抓取链路上加了一道随机闸门。先把这个闸门拆掉或者对蜘蛛放行,再谈入口页的内容和链接结构,思路会清楚很多。