搜索抓取

重定向链与抓取成本:跳数过多时如何收敛落地 URL

重定向本身不是问题,链式重定向才是。本文说明为什么一次跳转等于一次抓取请求,列出 http 到 https、裸域到 www、CDN 回源等常见多跳来源,并给出一套用命令行、抓取日志和配置抽查来数跳数、把多跳收敛成一次落地的方法与核对清单。

搜索抓取

重定向链与抓取成本:跳数过多时如何收敛落地 URL

重定向是域名统一、协议切换、栏目改版时的常规手段,本身没有问题。真正麻烦的是“链”:一个地址先 301 到 A,A 再 302 到 B,B 又补一次尾斜杠修正才落到 C。对用户来说只是多等一会,对搜索蜘蛛来说,这是三次独立的 HTTP 请求、三次抓取配额、三次超时或中断的机会,而它最后只拿到一份内容。

为什么跳数会变成抓取成本

抓取配额不是无限资源,它取决于站点整体响应速度、服务器承载能力和历史抓取表现。链式重定向带来的额外消耗,主要体现在三个方面:

  • 请求次数成倍增加。每跳一次就是一个完整请求,包含 DNS、TLS 和响应头,蜘蛛要重复走一遍。
  • 失败概率叠加。链上任何一环超时或返回 5xx,整条路径就断了,URL 可能被标记为抓取异常。
  • URL 身份变模糊。中间地址如果被别处引用,蜘蛛会同时记住多个版本,落地页之外的地址也可能被当成独立 URL 处理。

所以“一次跳转就落地”和“三次跳转才落地”,消耗差别是实打实的。

多跳链常见的几个来源

  • 协议与域名层层收口。http 先跳到 https,https 的裸域再跳到 www,最后才到真正的落地页。
  • 迁移时没有做一一映射。旧栏目整体跳到新栏目首页,再由栏目首页跳到详情,形成两跳。
  • CDN 与源站各配了一层规则。边缘节点跳一次,回源后源站又跳一次,蜘蛛看到的就是两跳。
  • 参数清理用了 302。带参数的 URL 先 302 到去参版本,去参版本又因大小写或尾斜杠再修正一次。
  • 用 JS 跳转或 meta refresh 代替 301。蜘蛛需要先拿到页面内容再解析,成本比服务端跳转更高,而且不一定会跟随。

用三步把跳数核出来

  1. 命令行走一遍。用支持跟随跳转的命令请求几个代表性 URL,把每一跳的状态码和 Location 打印出来,数清一共几次。重点抽查:首页、栏目页、被外链最多的详情页、带参数的列表页。
  2. 在抓取日志里找连续请求。同一个蜘蛛 IP、同一时间段内,针对同一来源路径出现多次请求,且目标地址逐次变化,通常就是一条跳转链。把这类路径整理成清单。
  3. 对照配置抽查。拿清单去核对 CDN 规则、源站伪静态、反向代理和框架路由,确认每一跳由哪一层产生。很多时候多跳不是设计出来的,而是几层配置各自加了一跳。

把多跳收敛成一次落地

  • 跳转目标一律写最终 URL,不要先跳到中间页再跳一次。
  • 同一个来源只保留一条规则,边缘层和源站层不要重复配置。
  • Sitemap 里只放落地 URL,不放会跳转的中间地址。
  • 站内链接直接指向最终地址,避免自己制造新的入口跳转。
  • 能用服务端 301 的,就不要用 JS 或 meta refresh 代替。
  • 批量修改前先导出跳转规则表,逐条标注“来源—目标—跳数”,改完再重新数一遍。

改完之后观察什么

改完不必急着下结论,先看现象:同一路径在抓取日志里是否还有连续多次请求,重定向类的抓取异常是否下降,原本卡在中间地址的 URL 是否开始出现对落地页的抓取。

把跳数控制在一次,不只是省一次请求,更是让蜘蛛记录的唯一地址更清晰。中间地址被清掉,后续的 URL 发现、去重和内容保鲜都会顺一些。

小结

重定向不必全部消灭,需要消灭的是“链”。把每一跳确认清楚,让蜘蛛一次请求就拿到最终内容,抓取配额才能用在真正需要更新和发现的 URL 上。