搜索抓取

重定向链与跳转深度:蜘蛛跟到第几跳会停下

重定向本身不算问题,多跳链条、循环跳转和长期存在的临时跳转,才是蜘蛛抓取时容易掉进去的坑。本文说明不同跳转类型给蜘蛛的信号差异、链条如何拖慢抓取节奏,并给出收敛跳转、让内链直指最终地址的排查思路。

搜索抓取

重定向链与跳转深度:蜘蛛跟到第几跳会停下

蜘蛛拿到一个 URL,服务器返回 301,跟过去又是一个 301,再跟一次才是 200。这样的链条在很多站点里都存在,平时没人注意,直到抓取数据对不上、页面迟迟不更新,才会被翻出来。跳转不是错误,错误在于链条的长度和跳转类型传递出去的信号。

一跳与多跳:抓取成本不一样

蜘蛛每跟一次跳转,就要多发起一次请求。如果内链直接指向最终地址,一次抓取就拿到内容;如果内链指向的是一个中间过渡地址,蜘蛛就得把整条链走完。链条越长,单页消耗的抓取次数越多,留给其他 URL 的额度就越少。

更麻烦的是中间地址的处理。蜘蛛会记住这些 3xx 响应,在后续抓取里反复确认,尤其是当跳转目标是临时的、不确定的地址时,确认的频率会更高。

跳转类型传达的信号

301 和 308 表示永久迁移,蜘蛛倾向于把原地址的权重和抓取需求转移到新地址,之后逐渐减少对原地址的访问。302 和 307 表示临时跳转,蜘蛛会保持对原地址的抓取,同时在两边来回确认。

常见的误用场景

  • 用 302 做 HTTP 到 HTTPS 的迁移:协议统一应该是永久的,用临时跳转会让蜘蛛长期在旧协议上做无效抓取。
  • 用 302 做 www 与非 www 的统一:同样是长期结构问题,应该用 301 固定下来。
  • 活动页用 302 指向临时落地页,活动结束后忘记清理:链条残留,原地址会一直被抓。
  • 内链写成中间地址,让每一次点击都要多走一跳,抓取和用户都多绕一圈。

循环与自跳转

A 跳到 B,B 又跳回 A,或者某个地址不断跳向自己,这类情况蜘蛛通常会在若干跳之后放弃,本次抓取不产生任何有效结果。日志里会表现为同一个地址反复出现 3xx,却始终看不到 200。

还有一种隐性的循环:跳转目标依赖 Cookie、User-Agent 或地区判断,蜘蛛拿不到对应条件,于是被弹回原地址。这类问题靠浏览器访问往往看不出来,需要在服务器日志里核对返回状态。

跳转对抓取节奏的影响

跳转链的问题不只是浪费一次请求,它会叠加几层影响:

  • 抓取额度被摊薄:本该用来发现新内容的次数,被消耗在确认旧地址上。
  • 响应时间叠加:每一跳都要建立连接、等待响应,链条越长,整体耗时越明显。
  • 索引里留下历史地址:中间地址可能被记录,搜索结果里出现不该出现的版本。
  • 更新信号被稀释:抓取落点在跳转上,页面本身的改动不容易被及时感知。

怎么排查并收敛

排查可以从日志入手,看 3xx 响应集中在哪些路径、跳转目标的分布如何,再配合站点爬虫把整条链列出来。处理思路大致是固定的:

  1. 协议、域名、尾斜杠这类结构性差异,统一用 301 固定到最终形态,只保留一跳。
  2. 内链、Sitemap、分享链接一律直接写最终地址,不再指向中间过渡路径。
  3. 临时的活动跳转设定明确的失效时间,到期后清理,不要让 302 变成长期状态。
  4. 定期复查重定向规则,删除已经合并或失效的旧规则,避免规则之间互相指向。
  5. 对依赖客户端条件判断的跳转,确认蜘蛛访问时能拿到确定的目标,而不是被弹回。
跳转是迁移期的过渡手段,不适合作为站点的常态结构。把链条压缩到一跳、让链接直接指向终址,是成本最低也最容易被忽略的一步。