搜尋抓取

重定向鏈上的每一跳:蜘蛛跟随跳轉时在消耗什么

蜘蛛跟随重定向时,每一跳都要重新付出一次請求成本。這篇文章拆解 301、302 等狀態碼在抓取鏈路里的差別,說明跳轉鏈變長後蜘蛛可能中途放弃的原因,並给出從日誌排查跳轉鏈、把站内連結直接指向终点地址的落地做法。

搜尋抓取

重定向鏈上的每一跳:蜘蛛跟随跳轉时在消耗什么

蜘蛛拿到一個 URL 之後,並不總是直接拿到内容。很多时候它先撞上一次 3xx:從 http 跳到 https,從舊域名跳到新域名,從 /page 跳到 /page/。這些跳轉在浏览器里几乎無感,但在抓取這條鏈路上,每一跳都是一次額外的請求、一次額外的等待。

一跳到底要花掉什么

蜘蛛處理一次重定向,至少要新增一轮完整請求:解析地址、建连、發請求、讀响應头。响應头里如果還有新的 Location,它才决定要不要繼續跟。也就是说,一條三跳的跳轉鏈,對蜘蛛来说等于訪問了三個 URL,而只有一個 URL 有真正的内容。

  • 抓取配額:同一批配額被分摊到多跳上,真正需要内容的頁面反而排後
  • 時間成本:每一跳都要重新建连或复用连接,鏈路越長,單頁耗时越高
  • 發現路径:跳轉鏈中間那几跳 URL,往往也會被记進已發現队列

跳轉本身不是错誤,問题在于跳轉是不是必要的、是不是稳定收敛的。如果每次訪問都要绕三圈才落到终点,蜘蛛對這個站点的抓取效率判断就會偏保守。

3xx 里哪些是正常的,哪些值得警惕

301 與 308:告诉蜘蛛“以後就走新地址”

這两個是永久跳轉,蜘蛛一般會把已發現记錄迁移到目标地址,後續再訪問通常直接走新 URL。前提是目标地址稳定,不要今天跳 A、明天跳 B。

302 與 307:临时跳轉,別拿它当長期方案

临时跳轉意味着舊地址仍然存在。如果线上實际是永久的地址變更,却用了 302,蜘蛛可能反复回到舊地址確認,等于把抓取量浪費在確認動作上。307 會保留請求方法,一般出現在表單或接口场景,對頁面抓取的直接影响較小,但同样會拉長鏈路。

鏈太長的时候,蜘蛛可能中途停下

不同搜尋引擎對跳轉次數的容忍度不一样,但趋势是明确的:跳得越多,繼續跟下去的概率越低。常见情形是鏈尾内容長期不被抓,日誌里只看到前面几跳的訪問记錄。

  • 跳轉鏈超過两三跳时,深层内容被抓到的間隔會明顯變長
  • 鏈條中間如果出現 404 或 5xx,整條鏈就断在這里
  • 循环跳轉(A→B→A)會让蜘蛛直接放弃這條路径

容易被忽略的几類自動跳轉

  • 尾斜杠與大小寫:/Page 跳到 /page、/page 跳到 /page/,單獨看没什么,叠在一起就是两跳
  • 移動端跳轉:按 UA 判断後跳到 m 域名,若两套地址都對外暴露,就多出一條鏈
  • 登入或地区判断:未登入、非目标地区被跳到首頁,蜘蛛看到的就不是原頁面内容
  • CDN 或负载均衡层的規則跳轉:站点代碼里看不到,但日誌里全是 301

在日誌里怎么看跳轉鏈

抓取日誌里,3xx 狀態碼的數量和分布能說明不少問题。建议按狀態碼分组,把 301 和 302 的請求地址、Location 目标分別列出来,再人工串一下鏈條。

  1. 找出所有 3xx 請求,按来源地址去重
  2. 顺着 Location 收一遍,标记出鏈條長度超過两跳的路径
  3. 核對這些路径是否有對應的内鏈或 Sitemap 记錄,能改内鏈的就直接改成终点地址
  4. 確認永久變更的用 301,临时跳轉保留 302,別混用

一個比較實用的做法是:内鏈和 Sitemap 里只寫终点地址,把跳轉留给那些外部已经發出去、改不了的舊連結。這样蜘蛛顺着站点内部走的时候,不需要為跳轉額外付費。

跳轉是给外部舊地址兜底的,不是站内導航的常規走法。站内每多一跳,都是把有限的抓取机會分给了没有内容的响應。