有些站点在浏览器里访问一切正常,但从抓取日志看,蜘蛛大量落在 /login、/verify 这类地址上,目标内容页的抓取量始终上不去。这种“路径偏移”很多时候不是链接写错,而是会话状态在作怪。
一、常见的偏移表现
- 蜘蛛请求内容页,返回 302 或 307,最终落到登录页、验证页或地区选择页;
- 同一个内容地址每次被抓取都带上不同的会话参数,一个入口被拆成很多份;
- 目录页对未登录用户开放,但列表与分页链接只在登录后才输出,蜘蛛看不到后续入口。
二、为什么会发生
服务端若用 Cookie 判断访问者身份,而蜘蛛通常不携带站点 Cookie,就会被当成“未登录访客”。如果规则写得过粗,比如“未登录访问内容目录一律跳登录”,自然抓取也会被一并拦下。另一种情况是框架在首次响应时下发 Set-Cookie,并把会话号写进 URL;这些带参数的链接一旦被复制到页面里,就会形成一批带会话串的入口,既浪费抓取量,也让入口归并变得混乱。
三、排查顺序
- 用不带 Cookie 的请求访问几个典型内容页,记录状态码与最终地址;
- 在抓取日志里筛 3xx,统计 Location 指向的域名与路径分布,确认是否集中指向登录或验证页;
- 检查页面中出现的链接,是否带 sid、jsessionid、token 一类参数;
- 确认 CDN、WAF、反向代理层是否也存在基于 Cookie 的跳转或人机校验规则;
- 对比登录前后的 HTML,判断分页与列表链接是否属于登录后才渲染的部分。
四、处理方式
- 把公开内容页从“必须登录”的规则里摘出来;确需权限的内容用明确的 403 回应,而不是跳转登录页;
- 关闭 URL 重写中的会话串附加,避免带参数链接被复制扩散;
- 分页与列表尽量在未登录状态下输出可抓取的链接,需要交互的部分再交给脚本;
- 确实不想被抓取的路径,用 robots 规则明确排除,减少无效请求占用。
跳转到登录页并不会隐藏内容,只会让抓取预算花在一个没有正文的地址上。
五、验证与持续观察
调整后不要只看一天的数据。观察目标目录的状态码分布是否从 3xx 转为 200,落到登录页的请求占比是否下降,带会话参数的 URL 数量是否收敛,以及内容页的单日抓取次数是否回到合理区间。同时留意新上线的功能是否又引入了 Cookie 判断,把“无 Cookie 访问内容页返回 200”作为上线前的固定自检项,会比事后翻日志省事得多。