搜索抓取

重定向链与抓取:每多一跳,URL 发现就慢一拍

站点改版、换域名、加 HTTPS,都会留下 301。单独一条重定向不算问题,但多条串成链后,蜘蛛要跳好几次才能拿到内容,抓取路径就被拖长了。本文讲清重定向链怎么形成、对 URL 发现有什么实际影响,以及如何把多跳压回一跳。

搜索抓取

重定向链与抓取:每多一跳,URL 发现就慢一拍

站点做上几年,URL 总会变。换域名、上 HTTPS、栏目改名、统一去掉末尾斜杠,每一次调整都可能留下一条 301。单独一条重定向不是问题,问题在于它们会串起来:A 跳到 B,B 跳到 C,C 才是真正的内容页。蜘蛛要拿到这份内容,得先把这几跳走完。

一次跳转,蜘蛛实际做了什么

对蜘蛛来说,跳转不是免费的。每遇到一个 301 或 302,它都要单独发起一次请求,拿到响应头里的 Location,再对新地址发起下一次请求。也就是说,一条三跳的链,蜘蛛要发三次请求,才摸到第一段 HTML。

  • 每一跳都占用一次抓取配额,链条越长,单位时间内能抓的页面越少;
  • 每一跳都增加一次超时和出错的机会,中间任何一环抖动,整条路径就断在这里;
  • 跳转目标如果是跨域或跨协议,蜘蛛还要重新判断这份内容归谁所有。

内容本身没问题,但发现它的成本被人为抬高了。站点规模小的时候感觉不出来,URL 到几万、几十万量级时,这些多出来的请求会实实在在占掉一批抓取额度。

链是怎么越接越长的

几乎没有站点会主动设计一条五跳的重定向。链是在一次次改版里被动接上的。

常见成因

  • 逐级替换域名:先 http 换 https,再旧域名换新域名,两次操作各留一条规则,就叠成了两跳;
  • 栏目分批改名:老栏目跳到过渡名,过渡名又跳到现在的名字,中间那一段没人清理;
  • URL 规范化没做全:带斜杠的跳到不带的,带大写字母的跳到小写的,大小写和斜杠各自一条规则,互相叠加;
  • 内容合并后没回头改:几篇旧文章合并成一篇,旧地址逐条跳过去,后来那篇又被合并了一次,链就长了。

多跳带来的实际损失

  1. URL 发现变慢:新页面本来可以一跳到位,现在要先经过几层中转,进入待抓队列的时间被推后;
  2. 抓取配额被稀释:同样的额度,一部分花在跳转上,真正抓内容的次数就少了;
  3. 链路脆弱:三跳里任意一环返回 5xx 或超时,蜘蛛这次就白跑一趟,下次未必马上回来重试。

把链压回一跳的做法

  • 直接指向终点:旧地址的 301 目标写成最终 URL,不要写成中间那一版;
  • 站内链接用最终地址:导航、面包屑、正文内链、相关推荐里如果还留着旧的跳转地址,蜘蛛每次都要多走一步,直接改成最终地址最省事;
  • Sitemap 只放最终 URL:Sitemap 里混入会跳转的地址,等于主动给蜘蛛派了一堆中转任务;
  • 不要串跳:发现 A 跳到 B、B 又跳到 C,就把 A 的规则改成直接到 C,而不是继续往后接;
  • 少用链式跳转做临时活动:短期活动的 302 链结束后记得撤掉,别让它沉淀成长期路径。

怎么排查现有的链

不需要复杂工具,抓一份站内链接清单,逐个请求看响应头就能看出来。重点看三类入口:旧栏目的目录级地址、历史文章的旧 URL、以及带参数或大小写变体的地址。

  1. 抽取站内被链接最多的那批 URL,看它们返回的是 200 还是 301/302;
  2. 对返回跳转的地址,手工跟一次响应头,记录跳了几次、终点是谁;
  3. 把跳了两次以上的地址单独列出来,逐条改成直达终点;
  4. 改完之后,回头检查站内链接和 Sitemap 有没有还在引用中间地址。
重定向本身是正常手段,问题只出在层数上。把每一段跳转都压成一跳,蜘蛛拿到内容的路径就短了,省下来的额度才能用在真正的新页面上。

这件事不需要一次做完,按入口的重要程度分批处理就好。优先收拾被内链引用最多的那批地址,收益最明显。