做入口页时,很多注意力放在链接、状态码和服务器上,Cookie 和 Session 这类服务端会话机制常被忽略。它们不直接“吸引”蜘蛛,却会改变蜘蛛每次请求看到的内容和 URL 形态。如果处理不当,入口页可能出现同一内容被多个 URL 指向、蜘蛛拿不到核心链接、日志里爬虫记录被误判等情况。
蜘蛛通常不保留 Cookie
绝大多数搜索引擎蜘蛛在抓取时不会像浏览器那样维护长期 Cookie。一次请求结束后,服务器下发的 Set-Cookie 往往不会被后续请求带回。也就是说,如果入口页把关键链接或正文放在“必须带某个 Cookie 才显示”的逻辑之后,蜘蛛很可能只看到一个空壳页面。
不同搜索引擎对 Cookie 的支持程度不一致,有的蜘蛛在单次会话内可能短暂保留,但这不能作为设计前提。更稳妥的做法是:入口页对不带 Cookie 的请求也返回完整的可抓取内容。
Session ID 写进 URL 会制造重复
一些服务端环境在客户端禁用 Cookie 时,会把 Session ID 拼到 URL 里,例如出现 ;jsessionid=... 或 ?PHPSESSID=... 这类参数。蜘蛛大多数时候不带 Cookie,正好会触发这种回退逻辑。结果就是同一个入口页出现大量带不同 Session ID 的 URL。
对 URL 发现来说,这相当于人为增加了重复入口:抓取预算被分散,日志里同一路径反复出现,后续分析也容易失真。建议检查 Web 容器和框架配置,关闭通过 URL 传递会话 ID 的选项,让会话只走 Cookie。
Set-Cookie 与缓存、回源的关系
入口页如果每次响应都带上 Set-Cookie,尤其当 Cookie 值每次不同,CDN 和反向代理通常会更谨慎地缓存该响应,回源次数随之上升。静态资源如果也被下发 Cookie,问题更明显。对入口页而言,不必要的 Set-Cookie 能省则省;确实需要时,可以区分路径,避免影响整站缓存策略。
另外,蜘蛛每次请求都会收到新的 Set-Cookie,但它一般不会在后续请求中携带,所以不要指望用 Cookie 给蜘蛛“记状态”。
不要把 Cookie 当成真人识别依据
有些站点用“是否有 Cookie”来判断访客是不是真人,然后把无 Cookie 的请求当成异常。这个逻辑并不可靠:蜘蛛大多没有 Cookie,部分用户也会禁用或清理 Cookie。如果依据这条规则去封禁,很容易误伤抓取。更合理的识别方式是结合 UA、IP 反查和访问行为,而不是单看 Cookie。
可以落地的检查清单
- 用 curl 不带任何 Cookie 请求入口页,确认返回的 HTML 里包含核心链接和正文。
- 检查日志中是否存在带 ;jsessionid=、PHPSESSID 等会话参数的 URL;有的话先关闭 URL 会话传递。
- 确认入口页不依赖登录态或验证 Cookie 才展示可抓取内容。
- 减少入口页响应中的 Set-Cookie,静态资源尽量不设 Cookie。
- 对已经产生的带 Session ID 重复 URL,用 canonical 或 301 收敛到规范地址。
- 不要用 Cookie 存在与否做蜘蛛封禁判断,避免误伤正常抓取。
Cookie 和 Session 不决定蜘蛛来不来,但会决定蜘蛛“看见什么”。把入口页对无 Cookie 请求的响应理顺,是 URL 发现和日志分析少踩坑的一步。
整体思路不复杂:入口页要允许匿名、无状态地访问,会话机制只服务于真实用户,不干扰抓取端。改完配置后,隔几天看一次访问日志,确认带会话参数的 URL 是否消失、蜘蛛请求是否还能拿到完整链接,再决定下一步调整。