搜尋抓取

蜘蛛遇到跳轉鏈时怎么走:301、302 與 JS 跳轉的處理差异

頁面跳轉是站点运营里的常態,但成鏈的跳轉會让蜘蛛多花几次請求才摸到正文。本文說明 301、302、307 以及 meta refresh、JS 跳轉在抓取過程中的差异,给出跳轉鏈的排查顺序和几處容易忽略的問题,帮助把從入口到正文的路径缩短到可控范围。

搜尋抓取

蜘蛛遇到跳轉鏈时怎么走:301、302 與 JS 跳轉的處理差异

頁面跳轉在站点运营里几乎是常態:http 換 https、換域名、加 www、补尾斜杠、移動端适配、活動頁临时改地址。對用戶来说只是地址變了一下,對搜尋蜘蛛来说,每一次跳轉都是一次額外的請求。跳轉本身不是問题,成鏈的跳轉才是。

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

蜘蛛請求一個 URL,拿到 3xx 狀態碼和 Location 头之後,會按規則去請求新的地址。它不會因為一個跳轉就放弃,但每一跳都會占用一次抓取机會,也會拉長從入口到正文的時間。如果鏈路里出現循环、跳轉到 5xx,或者跳轉到 robots.txt 禁止的地址,這一轮抓取基本就白費了。

  • 301:永久跳轉,蜘蛛一般會把原地址的信号传递到目标地址,並逐步用新地址替換索引里的舊地址。
  • 302 / 307:临时跳轉,蜘蛛仍會跟過去抓取,但通常保留原 URL 作為規范地址;長期使用临时跳轉,會让地址狀態變得模糊。
  • meta refresh 與 JS 跳轉:需要先拿到 HTML 再执行,蜘蛛可能先把它当成一個普通頁面,第二轮或渲染阶段才走到目标地址,鏈路更長也更不稳定。

跳轉鏈太長會带来什么

常见的一條鏈是:http://example.com 跳到 https://example.com,再跳到 https://www.example.com,再到 https://www.example.com/,最後到真正的首頁。五次請求才落地。對少量 URL 無所谓,当成千上萬個内鏈都這样走时,抓取预算就消耗在中間环节上了。

更麻烦的是鏈路中的不确定性:中間某一跳返回 302 到登入頁,跳轉目标被带上了 session 參數,或者中間域名的證书已经過期。蜘蛛不一定每次都能走完,日誌里就會出現同一批 URL 反复請求、却始终不進入目标頁面的情况。

排查跳轉問题时,先看日誌里同一個 URL 的請求次數和最终落点,而不是只確認它有没有被抓過。

按什么顺序梳理跳轉

  1. 用带跳轉跟随的工具,對首頁、栏目頁、詳情頁各取几個样本,记錄完整跳轉鏈和每一跳的狀態碼。
  2. 找出鏈路超過两跳的 URL,優先處理入口級頁面,例如首頁、主導航和 Sitemap 里的地址。
  3. 统一协议與主机名:确定一個規范版本,其他版本直接一次 301 過去,不要串行跳轉。
  4. 把 meta refresh 和 JS 跳轉尽量換成服務端 301,尤其是永久迁移的场景。
  5. 检查跳轉目标是否可抓取:不要跳到 robots.txt 禁止的路径、登入頁或 404。
  6. 確認尾斜杠策略一致,内鏈、Sitemap、canonical 里使用的寫法保持一致,不靠跳轉来补齐。

容易忽略的几處

  • 移動端跳轉:用 JS 判断 UA 再跳 m 站,蜘蛛可能拿到桌面版内容,也可能拿到空白頁;自适應或服務端判断更稳。
  • 营销參數:跳轉时把 utm、session 等參數一路带過去,容易生成大量蜘蛛不愿深抓的地址。
  • HTTPS 證书:中間域證书错誤會让跳轉鏈断在某一跳,日誌里表現為连接失敗而不是 3xx。
  • 循环跳轉:A 跳 B、B 跳 A,蜘蛛在几跳之後就會停止,這一批 URL 長期無法進入正文。

改完怎么驗證

調整完成後,用爬虫工具或日誌观察一段時間:同一 URL 的請求次數是否下降,目标頁面的抓取量是否上升,中間地址是否還频繁出現在抓取列表里。抓取量的變化通常滞後,不要指望改完当天就有明顯区別。也不要把跳轉鏈当成一次性就能解决的開關,站点改版、活動上线时都值得重新跑一遍检查。