搜索抓取

蜘蛛跟不跟跳转:3xx 链路太长时,抓取路径会发生什么

站内跳转看似无害,但每一次 3xx 都是蜘蛛的一次额外请求。本文从抓取路径的角度拆解跳转链的代价:协议与主机名连环跳、尾斜杠变体、参数回跳、JS 跳转,以及怎么用日志和内链把链路压到一跳以内。

搜索抓取

蜘蛛跟不跟跳转:3xx 链路太长时,抓取路径会发生什么

站内出现跳转很常见,https 改造、域名切换、目录重构都离不开 3xx。但跳转不是零成本的:蜘蛛每跟一次跳转,都要重新发起请求、重新读响应头,必要时还会重做 DNS 与 TLS。链路一长,抓取效率就悄悄往下掉。

蜘蛛遇到 3xx 时到底做了什么

蜘蛛请求一个 URL 后,如果收到 301 或 302,它会读取 Location 头,把目标地址放进自己的抓取队列,然后按节奏再去请求一次。这个过程不是“瞬间跳过去”,而是一次新的抓取任务。对单条 URL 来说,多一跳就是多一次请求;对整站来说,成千上万个链接都多一跳,消耗就叠加起来了。

一跳的代价,比想象中多

  • 多一次 HTTP 请求,抓取预算按请求计算,不是按最终页面计算
  • 目标主机不同时,要重新做 DNS 解析;HTTPS 还要重新握手
  • 服务器日志里多出一条 3xx 记录,统计时容易被误算成“已抓取”
  • 链路中某一跳超时或返回 5xx,蜘蛛可能直接放弃,终点页始终拿不到

常见的几种“越跳越长”

协议与主机名连环跳

http://example.com 跳到 https://example.com,再跳到 https://www.example.com,这是三跳,只有最后一跳才算有效抓取。站点若能一次 301 直接指向最终地址,就省掉中间一段。

尾斜杠与大小写反复跳

/list 与 /List、/list/ 之间互相跳,往往来自服务器配置和代码拼接规则不统一。内链里混着几种写法,蜘蛛就会把这些变体都走一遍。

参数回跳到干净地址

带跟踪参数的地址先跳回不带参数的地址,表面上是统一了 URL,实际是让蜘蛛多抓一次。内链直接写干净地址会更省事。

JS 跳转与 meta refresh

这类跳转蜘蛛不一定跟,或者跟得比 3xx 慢得多。能用服务端 301 讲清楚的事情,尽量不要留给前端脚本。

怎么查自己站上的跳转链

  1. 在服务器日志里筛 3xx 状态码,看哪些路径出现频率高、Location 指向哪里
  2. 抽几个核心 URL 手动跟一遍,数一数经过几跳才返回 200
  3. 检查内链与导航,确认它们指向的是终点 URL,而不是跳转入口
  4. Sitemap 里写的应该是终点地址,不是需要跳转的旧地址
  5. 确认链路里没有环,A 跳 B、B 又跳回 A 是最糟的情况

跳转什么时候必须保留

旧地址已经对外发布过、有外链指向,这种跳转要留着,而且尽量用 301 做永久指向,不要中途改来改去。真正该收敛的是“新链接也在走跳转”这种情况——新生成的 URL 本身就应该是一个能直接返回 200 的终点,不需要经过任何中转。

跳转是给旧地址收尾用的,不是给新地址开头用的。

顺手检查的几个细节

把跳转链压短,其实是在替蜘蛛省掉一部分无效往返。除了跳转本身,也可以顺便看一眼服务器:跳转响应如果经常慢于正常页面,或者高峰期有超时,蜘蛛跟到一半退出的概率会变高。抓取路径上的问题往往不是单点,跳转、响应时间、内链写法经常一起出现,一起处理效率更高。

小结

把跳转链控制在一跳以内,是抓取路径上比较容易做、收益也比较稳的调整。它不需要改模板、不需要动内容,只要让内链和 Sitemap 直接指向终点,就能把蜘蛛花在中转上的那部分时间省回来。