搜尋抓取

重定向鏈與跳轉深度:蜘蛛跟到第几跳會停下

重定向本身不算問题,多跳鏈條、循环跳轉和長期存在的临时跳轉,才是蜘蛛抓取时容易掉進去的坑。本文說明不同跳轉類型给蜘蛛的信号差异、鏈條如何拖慢抓取节奏,並给出收敛跳轉、让内鏈直指最终地址的排查思路。

搜尋抓取

重定向鏈與跳轉深度:蜘蛛跟到第几跳會停下

蜘蛛拿到一個 URL,服務器返回 301,跟過去又是一個 301,再跟一次才是 200。這样的鏈條在很多站点里都存在,平时没人注意,直到抓取資料對不上、頁面迟迟不更新,才會被翻出来。跳轉不是错誤,错誤在于鏈條的長度和跳轉類型传递出去的信号。

一跳與多跳:抓取成本不一样

蜘蛛每跟一次跳轉,就要多發起一次請求。如果内鏈直接指向最终地址,一次抓取就拿到内容;如果内鏈指向的是一個中間過渡地址,蜘蛛就得把整條鏈走完。鏈條越長,單頁消耗的抓取次數越多,留给其他 URL 的額度就越少。

更麻烦的是中間地址的處理。蜘蛛會记住這些 3xx 响應,在後續抓取里反复確認,尤其是当跳轉目标是临时的、不确定的地址时,確認的频率會更高。

跳轉類型传達的信号

301 和 308 表示永久迁移,蜘蛛倾向于把原地址的權重和抓取需求轉移到新地址,之後逐渐减少對原地址的訪問。302 和 307 表示临时跳轉,蜘蛛會保持對原地址的抓取,同时在两邊来回確認。

常见的誤用场景

  • 用 302 做 HTTP 到 HTTPS 的迁移:协议统一應该是永久的,用临时跳轉會让蜘蛛長期在舊协议上做無效抓取。
  • 用 302 做 www 與非 www 的统一:同样是長期结构問题,應该用 301 固定下来。
  • 活動頁用 302 指向临时落地頁,活動結束後忘记清理:鏈條残留,原地址會一直被抓。
  • 内鏈寫成中間地址,让每一次点击都要多走一跳,抓取和用戶都多绕一圈。

循环與自跳轉

A 跳到 B,B 又跳回 A,或者某個地址不断跳向自己,這類情况蜘蛛通常會在若干跳之後放弃,本次抓取不产生任何有效结果。日誌里會表現為同一個地址反复出現 3xx,却始终看不到 200。

還有一種隐性的循环:跳轉目标依赖 Cookie、User-Agent 或地区判断,蜘蛛拿不到對應條件,于是被彈回原地址。這類問题靠浏览器訪問往往看不出来,需要在服務器日誌里核對返回狀態。

跳轉對抓取节奏的影响

跳轉鏈的問题不只是浪費一次請求,它會叠加几层影响:

  • 抓取額度被摊薄:本该用来發現新内容的次數,被消耗在確認舊地址上。
  • 响應時間叠加:每一跳都要建立连接、等待响應,鏈條越長,整体耗时越明顯。
  • 索引里留下歷史地址:中間地址可能被记錄,搜尋结果里出現不该出現的版本。
  • 更新信号被稀释:抓取落点在跳轉上,頁面本身的改動不容易被及时感知。

怎么排查並收敛

排查可以從日誌入手,看 3xx 响應集中在哪些路径、跳轉目标的分布如何,再配合站点爬虫把整條鏈列出来。處理思路大致是固定的:

  1. 协议、域名、尾斜杠這類结构性差异,统一用 301 固定到最终形態,只保留一跳。
  2. 内鏈、Sitemap、分享連結一律直接寫最终地址,不再指向中間過渡路径。
  3. 临时的活動跳轉设定明确的失效時間,到期後清理,不要让 302 變成長期狀態。
  4. 定期复查重定向規則,刪除已经合並或失效的舊規則,避免規則之間互相指向。
  5. 對依赖客戶端條件判断的跳轉,確認蜘蛛訪問时能拿到确定的目标,而不是被彈回。
跳轉是迁移期的過渡手段,不适合作為站点的常態结构。把鏈條压缩到一跳、让連結直接指向终址,是成本最低也最容易被忽略的一步。