搜索抓取

跳转链与蜘蛛抓取:301、302 背后多走的几步

蜘蛛遇到跳转时,会先请求原地址,再请求跳转目标。一跳还能接受,多级跳转、循环跳转和长期 302 就会拖慢抓取、消耗预算。本文梳理常见跳转类型对抓取的实际影响,并给出排查跳转链、把内链和 Sitemap 直接指向终点地址的做法。

搜索抓取

跳转链与蜘蛛抓取:301、302 背后多走的几步

蜘蛛抓取一个 URL 时,并不总是直接拿到页面。如果这个地址返回的是跳转,它会先请求原地址,读到 Location 头,再去请求下一跳。跳转本身不是错误,网站改版、协议切换、域名统一都离不开它。问题在于,一条链上挂的跳转越多,蜘蛛花在“路上”的时间就越多。

蜘蛛看到跳转时会怎么走

面对 301 和 308,蜘蛛通常理解为永久跳转,会把索引目标逐步转移到新地址。面对 302 和 307,它会先观察一段时间:如果这个跳转长期不变,也可能按永久跳转处理;如果频繁变化,蜘蛛对原地址的信心就会下降。无论哪种情况,蜘蛛都需要额外发起一次请求,才能真正读到内容。

这意味着,一个跳转 URL 也会进入抓取队列。它消耗的抓取预算和普通页面类似,但产出的是一个“去别处”的指令,而不是可索引的内容。

多级跳转链的成本

假设用户点击的旧地址要经过三次跳转才能到最终页,蜘蛛就要发四次请求。常见的叠加场景包括:

  • http 地址先 301 到 https,https 后又跳到带 www 的版本,最后再跳到去掉末尾斜杠的地址;
  • 栏目改版后,旧 URL 指向二级旧 URL,二级旧 URL 再指向新 URL;
  • 移动端地址、AMP 地址或参数版本没有直接指向规范地址,而是先跳到中间页。

链越长,两个问题越明显:一是蜘蛛到达最终页面的时间被推迟,二是中间任何一跳出错,后面都到不了。如果某一跳返回 404 或 5xx,前面的跳转就白做了。

循环跳转更麻烦:A 跳 B、B 跳 A,蜘蛛走几轮后会放弃这个地址,并在后续一段时间内降低对它的抓取意愿。

容易被忽略的几种跳转

meta refresh 与 JS 跳转

这两种方式不是 HTTP 层的跳转,蜘蛛需要先渲染页面才能发现。meta refresh 通常能被识别,但如果延迟时间设为 0 以外,处理方式会更保守。JS 跳转则依赖渲染能力,没有被执行到的脚本,蜘蛛就看不到目标地址。能用 301 解决的,尽量不要用这两种方式代替。

登录、地区与语言选择页

有些站点会先把所有访客跳到地区选择页,再跳到具体内容。对蜘蛛来说,这等于在每条 URL 前面加了一站,抓取效率会明显下降。更稳妥的做法是让内容地址可直接访问,把选择逻辑放在页面内。

怎么排查并收敛跳转链

  1. 抽取一批站内 URL,用 curl -I 或带跟随跳转的请求查看每一跳的状态码和 Location,确认没有三级以上的链。
  2. 在服务器日志中筛选 301、302 记录,看哪些旧地址仍在被频繁请求,判断是内链没改,还是外部链接没更新。
  3. 把内链、导航、Sitemap 和 canonical 全部直接写成最终地址,不要再指向跳转 URL。
  4. 旧地址做一次性 301 到最终地址,不要“先跳到中间地址,再跳一次”。
  5. 定期复核跳转规则,删除已经没必要的旧规则,避免规则之间互相覆盖。

跳转与抓取效率的关系

跳转链不会直接决定页面是否被收录,但它会改变蜘蛛到达页面的路径长度。对于重要页面,尽量让蜘蛛一跳直达;对于历史地址,保留一条清晰的 301 即可。把跳转当成临时桥梁,而不是长期通道,抓取路径会干净很多。