排查抓取问题时,很多人只盯着状态码是 200 还是 404,却忽略了中间那几次跳转。蜘蛛拿到一个 URL,如果服务器返回 301 或 302,它不会停下,而是顺着 Location 继续请求下一个地址,直到落到最终内容。这条路径上有几次跳转、每次跳到哪、跳转环节稳不稳定,都会影响这个 URL 被发现和抓取的效率。
蜘蛛遇到重定向时会做什么
HTTP 跳转是蜘蛛能直接读懂的信号,但不同类型的跳转,处理方式并不一样。
- 301 / 308:表示永久迁移。蜘蛛通常会把索引中的地址逐步替换为目标地址,后续抓取直接走新地址。
- 302 / 307:表示临时跳转。蜘蛛一般保留原 URL 的索引状态,但仍会跟随到目标页面,相当于每次抓取都要多走一步。
- meta refresh 与 JS 跳转:这两种方式比 HTTP 响应头弱。蜘蛛需要先拿到 HTML,再去解析跳转目标,进入路径的时间会往后推,遇到渲染队列时还会更慢。
另外,跳转链不是无限的。跟随若干次之后仍拿不到最终页面,这条路径往往会被放弃。也就是说,链越长,终页被成功抓到的概率越低。
跳转链为什么会越来越长
多数长链不是一次设计出来的,而是几次改动叠加的结果。常见来源包括:
- 站点改版时用中转页承接旧目录,旧目录又跳新目录,形成两跳甚至三跳。
- HTTP 到 HTTPS、带 www 到不带 www、缺尾斜杠到补尾斜杠,几种规范化规则同时生效。
- 推广用的短链、带追踪参数的跳转地址被直接写进内链或 Sitemap。
- 历史迁移留下的中转页面没有清理,链接仍然指向它们。
多一跳,成本高在哪里
每一次跳转都是一次独立的请求,会占用服务器的响应时间和蜘蛛的抓取额度。单看一条 URL 好像无所谓,但当成千上万个页面都多走一到两步,压力就体现在整体上。
更麻烦的是稳定性。跳转链上只要有一个环节超时、返回 5xx 或连接被重置,整条路径就断了,蜘蛛这一次抓取拿不到任何有效内容。反过来,日志里会出现多个 URL 被反复请求的记录,看数据时容易误判成重复抓取或抓取异常,实际原因只是链路太长。
如果内链和 Sitemap 指向的是中间地址而不是终页,蜘蛛每次访问都要重走一遍这条链,这部分开销是完全可以省掉的。
自查和整理的建议顺序
- 从服务器日志里筛出返回 3xx 的 URL,按跳转目标分组,先看清全貌。
- 挑出跳转次数达到两次以上的,逐个确认每一步是否真的有必要,能合并的合并。
- 把内链、导航、Sitemap 中的地址直接改成终页地址,不再经过中转。
- 统一规范化规则,明确协议、域名和尾斜杠的唯一形式,避免多套规则互相叠加。
- 给临时中转页设定保留期限,到期后改成 301 或直接下线,并同步更新引用它的链接。
- 观察一段时间后回看 3xx 的数量变化,确认链路确实在变短。
跳转期间的服务器稳定性
跳转响应本身也可能出问题。如果 301 的返回需要经过较重的业务逻辑、查询数据库或等待上游接口,响应就会变慢,超时概率随之上升。比较稳妥的做法是让跳转规则尽量轻量,集中在一处配置里维护,出现问题时也方便快速回滚。
重定向本身不是错误,它只是路径上的一次转折。真正需要关注的是:这条路径有没有必要绕这么远,以及绕的每一段是否足够稳定。
把跳转链当作抓取路径的一部分来管理,比单纯统计 3xx 数量更有意义。链路短、终点明确、环节稳定,蜘蛛才能把有限的抓取次数花在真正的内容上。