不少站点做入口頁时,习惯把連結指向一個中轉地址,再靠 301、302 或 JS 跳轉送到真正的目标 URL 上,理由通常是統計点击、做分發或者绕開某些限制。随之而来的問题很實际:搜尋蜘蛛跟不跟?能跟到哪里?
先说结论
搜尋蜘蛛一般會跟進跳轉,但存在跳轉次數上限和成本。HTTP 3xx 跳轉最稳定,meta refresh 次之,JS 跳轉最不保證。跳轉层級越多,最终目标 URL 被發現的概率越低,被完整抓取的概率也越低。
搜尋蜘蛛是怎么處理跳轉的
- 遇到 301、302、307、308 时,會讀取 Location 响應头,把新地址放進待抓取队列,再發起一次請求。
- 這個過程會重复,直到拿到 200,或者触達跳轉次數上限(常见在 5 次上下),或者碰到循环跳轉、超时、错誤狀態。
- HTML 里的 meta refresh 多數情况下也會被解析,但延迟時間设得太長时可能被直接忽略。
- JS 跳轉依赖渲染能力,不同引擎、不同渲染策略下表現不一致,不适合当作可靠通道。
多級跳轉會带来哪些损耗
- 抓取配額被摊薄。每一次跳轉都是一次請求,原本一次能完成的抓取變成三四次。
- 鏈條越長,断点越多。中間任意一环超时、返回 5xx、被 robots.txt 屏蔽,後面的目标 URL 就發現不了。
- 耗时增加,超时概率上升,尤其是跳轉目标本身响應慢的时候。
- 跳轉地址也可能被当成獨立 URL 處理,产生重复抓取和狀態分散。
- 部分引擎對跳轉鏈長度有硬性限制,超出後就不再跟進。
所以「能跟進」和「能稳定跟進」是两件事,中間隔着鏈條長度和每一环的健康度。
几種跳轉形式的表現差异
301 與 302
301 表示永久,信号更明确,蜘蛛更容易把它视作地址變更並更新索引里的地址;302 表示临时,蜘蛛一般會繼續保留原地址。對入口頁通往目标 URL 這個场景,如果目的只是让蜘蛛發現目标地址,两種都能做到;如果希望目标 URL 直接成為抓取和收錄對象,直连連結會更干净。
meta refresh
延迟建议设為 0,並在頁面里同时保留一個可点击的普通連結,這样即使引擎不處理 refresh,也能通過連結發現目标。延迟设成 3 秒、5 秒甚至更長,被忽略的概率會明顯上升。
JavaScript 跳轉
依赖渲染,可以在 noscript 里或頁面其他位置补一個静態連結作為兜底,避免整條路走不通。
實操上怎么降低损耗
- 入口頁直接寫最终目标 URL,需要統計就用參數或服務端日誌区分,而不是多加一层跳轉。
- 确實要跳轉时,控制在一跳,用 301,Location 指向可直接訪問並返回 200 的頁面。
- 检查最终 URL:robots.txt 是否允许、是否有 noindex、canonical 是否指向自己、是否需要登入或 Cookie 才能打開。
- 避免跳轉鏈、循环跳轉,以及跳到 404、5xx 或驗證碼頁面。
- 跳轉目标尽量使用稳定、不带临时參數的地址,减少同一内容出現多個 URL 的情况。
怎么確認蜘蛛确實跟到了最终 URL
看服務器日誌:先找入口頁的請求记錄,再找紧接着出現的跳轉目标請求记錄,观察狀態碼序列,例如 200 → 301 → 200,或一路 302 直到 200。如果日誌里只有入口頁的請求,没有後續跳轉請求,多半是跳轉形式不被支持,或者鏈條中間某环断掉了。用抓取模拟工具检查时,注意看它最终「呈現的 URL」和 HTTP 狀態碼,而不是只看入口頁的返回。
跳轉不是不能用,而是它把一次發現拆成了多次請求,每多一层就多一個可能失敗的地方。能直连就別绕路,必须绕就只绕一步。