搜尋抓取

重定向鏈的收敛:让蜘蛛少跳几趟就能拿到内容

重定向看起来只是多跳一次,對蜘蛛却意味着多一次請求、多一次等待。本文拆解蜘蛛處理 301 的動作顺序、跳轉鏈變長的常见原因,以及多跳對 URL 發現和抓取效率的實际影响,並给出一套先统一最终地址、再更新内鏈與 Sitemap 的收敛顺序。

搜尋抓取

重定向鏈的收敛:让蜘蛛少跳几趟就能拿到内容

站内出現重定向很常见,但重定向鏈的長度,往往决定了蜘蛛拿到一個頁面内容要花多少次請求。一次跳轉能到最终地址,和跳三次、四次才到,對抓取来说是完全不同的两件事。

蜘蛛遇到重定向时的動作顺序

蜘蛛請求某個 URL 後,如果返回 301 或 302,它不會立刻拿到正文,而是讀取 Location 响應头里的新地址,再對這個新地址發起一次請求。只有最终地址返回 200 並带回 HTML,才算真正完成一次内容抓取。

  1. 請求舊 URL,收到 3xx 與 Location;
  2. 對新地址再次發起請求;
  3. 如果新地址仍然是 3xx,重复第二步;
  4. 直到拿到 200,才開始解析正文和其中的連結。

也就是说,一次跳轉等于两次請求,两次跳轉等于三次請求。鏈條越長,單位時間内能抓的頁面越少,這在抓取预算有限的站点上体現得比較明顯。

鏈條通常是怎样變長的

多數跳轉鏈不是有意设計,而是一次次改動叠加出来的。常见的叠法包括:

  • http 跳 https,https 又跳带 www,两跳才到最终頁;
  • 早期改版留下的舊路径,没有直接指向最终地址,而是先跳到上一版路径;
  • 结尾斜杠、大小寫、參數寫法不统一,服務器先跳一次規范形式,應用层又跳一次;
  • CDN 或负载层配置了額外的規范化跳轉,與源站規則叠加;
  • 多個域名合並时,中間域名仍然在线並參與跳轉。

這些規則單獨看都合理,叠在一起就形成了三跳以上的鏈條。

多跳带来的三個實际成本

  • 請求次數成倍增加:同样的抓取額度,能到達的頁面更少。
  • 發現被推迟:新 URL 只出現在鏈條末端,中間任何一环返回 404、500 或超时,蜘蛛就停在原地,後面的地址根本不會被發現。
  • 信号分散:中間地址也會被记錄為一次訪問,日誌里 3xx 占比偏高时,很难判断蜘蛛到底抓到了什么。
如果鏈條中出現环,比如 A 跳 B、B 又跳回 A,蜘蛛通常會直接放弃,這個 URL 相当于不存在。

怎么排查站点的跳轉鏈

不需要复杂工具,抽一批典型 URL 逐個看响應头就够用:

  1. 用 curl 的 -I 參數看單次响應,再用 -L 跟随跳轉,看最後落在哪個地址、经過几跳;
  2. 首頁、栏目頁、詳情頁、舊連結各抽几個,覆盖不同模板;
  3. 對照服務器配置、CDN 規則和應用层路由,找出重复的規范化規則;
  4. 看抓取日誌里 3xx 狀態的占比,占比持續偏高,說明鏈條還没收敛干净。

收敛顺序:先定唯一地址,再改入口

顺序反了容易白做一遍。建议先把每個頁面的最终地址确定下来,把分散的跳轉規則合並成一步直達,然後再更新指向:

  • 内鏈直接寫最终地址,不再经過中間层;
  • Sitemap 只提交最终地址,不提交會跳轉的舊地址;
  • canonical 指向最终地址,與實际返回 200 的地址一致;
  • 舊的跳轉規則保留一段時間,確認日誌中舊地址請求下降後再清理。

和外部入口配合时的注意点

無论外部入口带来多少訪問,只要落地的是會跳轉的舊地址,蜘蛛還是要多跑几趟。跳轉只能作為過渡手段,不适合当作 URL 發現的主要方式。更稳定的發現路径,仍然是内鏈直達加上 Sitemap 提交,同时保持服務器响應正常,把不必要的那几跳省掉。