很多站点在开发阶段默认用户已经登录,登录态下页面结构完整、链接齐全;而搜索蜘蛛访问时不带任何 Cookie,拿到的往往是另一套响应。这类“同 URL 两种内容”的问题不会报错,也不会返回异常状态码,却会直接决定蜘蛛能看到多少入口。
一、会话依赖的常见表现
- 入口被砍:未登录态下导航、分类树、相关推荐不渲染,页面只剩正文骨架,内链数量骤减。
- 跳转到登录页:需要登录才能看的路径直接 302 到登录页,蜘蛛跟随跳转后停在同一个落点,重复消耗抓取次数。
- 返回空列表或占位文案:接口在无会话时返回空数组,前端渲染出“暂无数据”,页面看起来是 200,实际没有可发现的 URL。
- 内容随会话变化:价格、库存、地域信息按会话计算,蜘蛛抓到的版本与用户看到的版本长期不一致。
二、排查顺序
建议从外到内逐层收窄,避免一上来就改代码。
- 日志确认身份:在访问日志中筛出搜索引擎 UA,同时用反向 DNS 或 IP 段做二次校验,避免把普通爬虫当成搜索蜘蛛。
- 比对响应体:把同一 URL 在“带 Cookie”和“无 Cookie”两种情况下的响应分别保存,去掉时间戳等动态字段后对比正文长度、链接数量与结构化数据的差异。
- 检查状态码与跳转:看无 Cookie 请求是否被 302、403,或用 200 伪装登录页。软性跳转比硬跳转更难发现,重点看最终落地 URL。
- 定位判断条件:在模板或中间件里搜索会话判断,区分“必须登录”和“登录后体验更好”两类逻辑,后者应给出可抓取的降级版本。
- 核对缓存层:CDN 或页面缓存可能把某个会话的页面缓存后返回给蜘蛛,也可能把蜘蛛的降级页缓存给用户。检查缓存键是否包含 Cookie 或会话标识。
三、容易被忽略的细节
- 验证码与风控:无 Cookie 请求更容易触发风控,返回验证页。这类页面通常状态码正常,但正文里没有任何有效入口。
- UA 判断导致的差异:有些站点只对搜索蜘蛛放开内容,结果普通用户和第三方工具看到的页面与蜘蛛完全不同,排查时容易误判。
- 接口域名与主站不一致:内容由无 Cookie 的接口异步取回,服务端渲染时抓到的是空壳。
- 语言与地域重定向:按会话或 IP 跳转到不同语言版本,同一入口分裂成多条路径。
判断标准很简单:把 Cookie 全部清空,用普通请求访问一次,如果拿不到和登录用户一致的链接结构,就要考虑是否存在会话依赖。
四、长期收敛的做法
- 把“可见内容”和“个性化内容”分层,公共部分服务端直出,个性化部分前端补全。
- 需要登录的路径统一用明确的状态码表达,并在地图中区分可抓与不可抓范围。
- 让站点地图只收录无会话也能正常渲染的 URL,避免把蜘蛛引向登录墙。
- 定期用日志抽样,对比不同 UA 与无 Cookie 请求的响应差异,作为上线检查的一部分。
会话依赖不会立刻表现为抓取量下跌,但随着入口减少、抓取回访变慢,覆盖缺口会慢慢显现。把它当作一次常规的抓取路径核对,比等到收录停滞再排查要省力得多。