很多站点接入蜘蛛池后会发现一个现象:入口页日志里能看到蜘蛛来过,但只抓了一个 URL 就再没动静,或者每次抓取都被当成“新访客”,反复请求同一个地址。排除服务器响应慢、robots 拦截这些常见原因后,还有一个经常被忽略的变量——Cookie。
蜘蛛对 Cookie 的处理和浏览器不一样
搜索引擎蜘蛛通常不会像浏览器那样长期保存 Cookie。多数情况下,它对 Cookie 的态度是“这次请求带上一次响应里给的 Set-Cookie,但换一个抓取批次或换一个出口 IP,这些 Cookie 就丢了”。如果入口页的逻辑依赖 Cookie 判断“你是不是已经来过”,蜘蛛就可能永远停留在第一步。
更麻烦的是,部分站点把会话状态写进了 URL 参数,比如 jsessionid=xxx。蜘蛛抓到的每一个链接都带一个随机串,会被当成成千上万个不同页面,既浪费抓取预算,也容易形成大量近似重复的内容。
几种常见的 Cookie 干扰形式
1. 首次访问先种 Cookie 再跳转
入口页打开后不是直接输出内容,而是先 Set-Cookie,再通过 JS 或 302 跳到带参数的地址,真正的正文在第二跳。这类做法在防采集场景里很常见,但用在蜘蛛池入口页上,等于给蜘蛛加了一道门。
2. Cookie 墙与弹层
合规提示、年龄确认、地区选择这类弹层,如果需要点击才能继续并且挡住了正文,蜘蛛拿到的就是没有内容的页面。较稳妥的做法是把这类逻辑放在首屏渲染之后,或者对无 Cookie 的请求直接放行正文。
3. 按 Cookie 返回不同内容
登录用户看到 A 版,未登录看到 B 版。如果 B 版是登录引导页,蜘蛛拿到的就是无内容页面。接入前要确认未登录状态下的输出版本本身是完整、可抓取的。
4. Cookie 影响缓存命中
CDN 或反向代理如果按 Cookie 做缓存键,蜘蛛每次请求都会回源,TTFB 变高,抓取效率下降。可以考虑配置“无 Cookie 请求走缓存”的规则,让入口页的静态部分尽量命中缓存。
怎么排查
- 用 curl 或搜索引擎提供的抓取测试工具,不带任何 Cookie 请求入口页,看返回的 HTML 里有没有正文。
- 对比带 Cookie 和不带 Cookie 两次请求的响应体差异,差异越大风险越高。
- 检查日志里的 URL 是否出现 jsessionid、PHPSESSID 之类的会话串。
- 看同一个入口 URL 在不同时间被抓取时,返回的内容是否稳定。
配置上的几条建议
- 入口页尽量无状态,正文直接输出,不依赖任何 Cookie 判断。
- 会话 ID 不要拼进 URL,用 Cookie 承载或者干脆不用。
- Set-Cookie 加上合理的 Path 和 SameSite,避免污染整个域名下的其他路径。
- 对静态入口页,考虑让无 Cookie 的请求直接命中缓存。
- 如果业务上确实需要 Cookie,就给蜘蛛一个明确的放行分支,而不是让它自己猜。
提示:Cookie 只是影响抓取的一个环节,调整之后还需要结合日志观察一段时间,看抓取深度和入口页覆盖有没有变化,不要只看单次请求的结果。
把 Cookie 这条线理顺,蜘蛛在入口页上的“第一步”才走得下去,后面的内链分发、目标页引导才有实际意义。