搜索抓取

重定向链有多长:蜘蛛为一个页面要跳几次

站内留下 301 很正常,但跳转叠成链条后,蜘蛛要发出多次请求才能拿到一个页面,时间、超时风险和抓取额度都会被消耗。本文梳理多跳的常见组合、301 与前端跳转的区别,以及用请求测试、抓取日志和 Sitemap 查出并缩短链条的顺序。

搜索抓取

重定向链有多长:蜘蛛为一个页面要跳几次

站内出现 301 很常见,换域名、换协议、加 www、调整目录结构,都会留下跳转。单看一次跳转没什么问题,蜘蛛能跟过去。麻烦的是链条:当 A 跳到 B、B 又跳到 C,蜘蛛为了拿到一个页面,要发出三次请求,中间任何一环慢一点、错一点,这条路径就可能断在半路。

一次跳转,蜘蛛要付哪些成本

把重定向看成“多花一次请求”是不够的,它牵扯到几件事:

  • 请求次数:每次跳转都是一次完整的 HTTP 往返,换了主机名还要重新做一遍 DNS 解析和连接。
  • 时间叠加:单跳 200ms 不显眼,三跳就是 600ms 以上,还不算排队等待。
  • 超时窗口:抓取器对整条链路通常有时间上限,链路越长,越容易在中途被放弃。
  • 抓取额度:跳转请求同样占用站点被分配的抓取预算,最终页面的抓取机会被稀释。

容易被忽略的多跳组合

多数多跳不是一次配置出来的,而是几次改动叠加的结果,常见的有:

  1. http://example.com/page 跳到 https://example.com/page,再跳到 https://www.example.com/page,协议和主机名各跳一次。
  2. 旧域名跳到新域名,新域名又跳到带尾斜杠的规范地址,域名和路径各跳一次。
  3. 目录改名后,老目录跳新目录,新目录里的链接又指向另一个别名。
  4. CDN 或负载均衡层再做一次跳转,站内配置里看不出,实际路径比预期多一跳。
  5. 大小写或参数顺序不一致,被服务器跳转到“正确”版本。

这些链条单看每一环都正常,合起来就是用三四次请求换一个页面。

301、302 与前端跳转的差别

301 和 308 表示永久,302 和 307 表示临时,蜘蛛对两者的处理倾向不同:临时的跳转更可能被反复确认,永久跳转则更容易被替换成最终地址。更需要留意的是前端跳转——meta refresh 和脚本里的 location.href,蜘蛛不一定都会执行,即使执行,也要先完成页面渲染,成本和不确定性都更高。能用服务端状态码表达的跳转,尽量别交给前端。

怎么把链条查出来

  1. 对重点 URL 跑一遍 curl -IL 之类的请求,把每一跳的状态码和 Location 打印出来。
  2. 在抓取日志里筛 3xx 状态,统计哪些地址反复出现。
  3. 检查 Sitemap:放进去的应该是最终地址,而不是需要跳转的旧地址。
  4. 抽查站内链接,尤其是导航、面包屑和正文里仍然指向旧路径的那些。

缩短链条的处理顺序

  • 先让内链和 Sitemap 全部指向最终地址,这一步收益最直接。
  • 把两次跳转合并成一次,例如 http 直接跳到 https://www 版本,中间不再经过 https:// 裸域。
  • 跳转的终点要是返回 200 的同主题页面;跳到首页或 404,会被判断为无效路径。
  • 隔一段时间复查一遍,避免旧跳转一层层叠加成新的链条。
跳转本身不会让页面掉出抓取范围,但每一跳都在消耗蜘蛛的时间和额度。把链条压到一跳以内,是成本最低的调整之一。