搜索抓取

重定向链的收敛:让蜘蛛少跳几趟就能拿到内容

重定向看起来只是多跳一次,对蜘蛛却意味着多一次请求、多一次等待。本文拆解蜘蛛处理 301 的动作顺序、跳转链变长的常见原因,以及多跳对 URL 发现和抓取效率的实际影响,并给出一套先统一最终地址、再更新内链与 Sitemap 的收敛顺序。

搜索抓取

重定向链的收敛:让蜘蛛少跳几趟就能拿到内容

站内出现重定向很常见,但重定向链的长度,往往决定了蜘蛛拿到一个页面内容要花多少次请求。一次跳转能到最终地址,和跳三次、四次才到,对抓取来说是完全不同的两件事。

蜘蛛遇到重定向时的动作顺序

蜘蛛请求某个 URL 后,如果返回 301 或 302,它不会立刻拿到正文,而是读取 Location 响应头里的新地址,再对这个新地址发起一次请求。只有最终地址返回 200 并带回 HTML,才算真正完成一次内容抓取。

  1. 请求旧 URL,收到 3xx 与 Location;
  2. 对新地址再次发起请求;
  3. 如果新地址仍然是 3xx,重复第二步;
  4. 直到拿到 200,才开始解析正文和其中的链接。

也就是说,一次跳转等于两次请求,两次跳转等于三次请求。链条越长,单位时间内能抓的页面越少,这在抓取预算有限的站点上体现得比较明显。

链条通常是怎样变长的

多数跳转链不是有意设计,而是一次次改动叠加出来的。常见的叠法包括:

  • http 跳 https,https 又跳带 www,两跳才到最终页;
  • 早期改版留下的旧路径,没有直接指向最终地址,而是先跳到上一版路径;
  • 结尾斜杠、大小写、参数写法不统一,服务器先跳一次规范形式,应用层又跳一次;
  • CDN 或负载层配置了额外的规范化跳转,与源站规则叠加;
  • 多个域名合并时,中间域名仍然在线并参与跳转。

这些规则单独看都合理,叠在一起就形成了三跳以上的链条。

多跳带来的三个实际成本

  • 请求次数成倍增加:同样的抓取额度,能到达的页面更少。
  • 发现被推迟:新 URL 只出现在链条末端,中间任何一环返回 404、500 或超时,蜘蛛就停在原地,后面的地址根本不会被发现。
  • 信号分散:中间地址也会被记录为一次访问,日志里 3xx 占比偏高时,很难判断蜘蛛到底抓到了什么。
如果链条中出现环,比如 A 跳 B、B 又跳回 A,蜘蛛通常会直接放弃,这个 URL 相当于不存在。

怎么排查站点的跳转链

不需要复杂工具,抽一批典型 URL 逐个看响应头就够用:

  1. 用 curl 的 -I 参数看单次响应,再用 -L 跟随跳转,看最后落在哪个地址、经过几跳;
  2. 首页、栏目页、详情页、旧链接各抽几个,覆盖不同模板;
  3. 对照服务器配置、CDN 规则和应用层路由,找出重复的规范化规则;
  4. 看抓取日志里 3xx 状态的占比,占比持续偏高,说明链条还没收敛干净。

收敛顺序:先定唯一地址,再改入口

顺序反了容易白做一遍。建议先把每个页面的最终地址确定下来,把分散的跳转规则合并成一步直达,然后再更新指向:

  • 内链直接写最终地址,不再经过中间层;
  • Sitemap 只提交最终地址,不提交会跳转的旧地址;
  • canonical 指向最终地址,与实际返回 200 的地址一致;
  • 旧的跳转规则保留一段时间,确认日志中旧地址请求下降后再清理。

和外部入口配合时的注意点

无论外部入口带来多少访问,只要落地的是会跳转的旧地址,蜘蛛还是要多跑几趟。跳转只能作为过渡手段,不适合当作 URL 发现的主要方式。更稳定的发现路径,仍然是内链直达加上 Sitemap 提交,同时保持服务器响应正常,把不必要的那几跳省掉。