搜尋抓取

蜘蛛沿重定向鏈走:一次跳轉和连着跳五次,差別在哪

蜘蛛抓到 3xx 响應时會顺着 Location 繼續抓,單跳看起来没什么代價,但一條三跳的鏈就等于三次請求。本文讲清蜘蛛在跳轉鏈上的動作、多跳對抓取的實际消耗、容易被忽略的跳轉来源,以及用响應头和日誌排查、把鏈條收短的具体做法。

搜尋抓取

蜘蛛沿重定向鏈走:一次跳轉和连着跳五次,差別在哪

蜘蛛抓一個 URL,拿到的不一定總是 200。很多时候它先看到的是 301、302 這類跳轉响應,然後顺着 Location 再抓一次。單跳看起来没什么代價,但如果一個地址要连跳三四次才能到终点,蜘蛛花在這條鏈上的請求數就翻了几倍,而且中間任何一环出問题,整條鏈就断了。

蜘蛛遇到跳轉时的基本動作

從抓取的角度看,跳轉不是“错誤”,而是一次額外的請求。蜘蛛拿到 3xx 响應头之後,會把 Location 指向的地址当作新目标,通常立刻跟進一次,直到拿到终点頁面的内容,這一趟才算完成。有几個细节值得记住:

  • 永久跳轉(301、308):蜘蛛倾向于把终点地址当作規范地址,後續再遇到舊地址,可能直接按新地址處理。
  • 临时跳轉(302、303、307):蜘蛛一般照走不誤,但不會因此認定舊地址失效,索引里的地址可能還留在原處。
  • 跳轉目标本身又跳:蜘蛛會繼續跟,但每一跳都要重新發一次請求。

所以判断一段跳轉是否划算,标准很简單:蜘蛛從入口到拿到内容,中間發了几次請求。

多跳重定向鏈的真實代價

最常见的多跳鏈條長得並不复杂:http 版本跳 https,https 的非 www 再跳 www,带尾斜杠的版本再跳一次,中間某一环還夹着一次大小寫归一化。用戶那邊几乎感觉不到,浏览器几毫秒就跳完了,但蜘蛛是按請求計數的,一條三跳的鏈等于三次抓取。

代價体現在三個地方:一是抓取額度被摊薄,同样一次抓取机會,拿到的内容變少了;二是鏈條上任何一跳返回 404、超时或者形成循环,後面的内容就抓不到;三是日誌里會出現一堆 3xx 记錄,把真實的抓取情况盖住,排查起来更麻烦。

跳轉本身不伤站,伤站的是没人知道自己在跳,也没人知道跳了几次。

几種容易忽略的跳轉来源

  • 短鏈與推廣連結:站外投放用的短鏈通常先跳一次,如果落点的地址本身還要跳,鏈條就更長。
  • CDN 或邊缘規則:為了统一域名在邊缘层寫的跳轉規則,可能和源站的重定向叠加,拼成两段鏈條。
  • 語言與地区判断:按 IP 或 UA 跳語言版本时,蜘蛛拿到的往往是預設版本,来回跳容易造成不同爬虫看到不同地址。
  • JS 跳轉與 meta refresh:蜘蛛通常能识別,但多在渲染阶段處理,發現速度比 3xx 慢,也更依赖渲染是否成功。

怎么查、怎么收

自查办法不复杂,看一下响應头就能把鏈條拉出来:

  1. 對代表性 URL 执行 curl -I -L,數一數中間出現几次 3xx,確認终点是不是稳定的 200。
  2. 在服務器日誌里按狀態碼筛 3xx,看哪些地址被反复跳,尤其是被蜘蛛 UA 請求的那些。
  3. 把 Sitemap 和站内連結统一寫成终点地址,別让蜘蛛從跳轉入口進来,這是成本最低的一步。
  4. 合並重复規則:能一跳解决的,不要因為規則分散變成两三跳;確認没有循环跳轉,也没有跳到 404 的情况。
  5. 改版或換域名时,给舊地址留一條清晰的單跳路径,而不是层层轉接。

几個常见誤区

一是把跳轉当成“權重開關”,指望靠一條 301 解决所有歷史問题。跳轉主要帮蜘蛛把地址對齐,索引和排序是另一套逻辑,不该预设结果。二是觉得 302 無所谓,長期用临时跳轉代替永久跳轉,索引里的地址可能長期停在舊版本。三是只检查首頁,詳情頁、篩選頁、分頁里的重定向鏈往往更長,也更容易被忽略。

把跳轉鏈控制在两跳以内、尽量單跳直達,是站内抓取路径里性價比很高的一項整理工作。整理完再回看日誌里的 3xx 數量,通常能直观看到抓取路径變短了。