入口頁被爬,不等于目标頁被爬。中間往往隔着一次跳轉——跳得顺,蜘蛛顺着往下走;跳得別扭,它可能就停在入口頁不動了。這篇文章把几種常见的跳轉方式放在一起對比,說明各自對爬虫的實际影响,以及运营时容易踩的坑。
先分清跳轉和内鏈
很多人把這两件事混着说,但它們的机制並不一样。
- 内鏈:入口頁本身承载内容,正文里放一個指向目标頁的連結。蜘蛛要先解析入口頁,再决定跟不跟。
- 跳轉:入口頁基本不呈現内容,直接把自己的位置让给目标頁。只要蜘蛛识別到跳轉,就會繼續走。
内鏈更自然,但依赖蜘蛛愿不愿意点;跳轉更直接,但會把入口頁本身的位置让出去。選哪種,取决于入口頁是長期存在的入口,還是临时過桥的踏板。
几種跳轉方式的實际表現
301 永久跳轉
信号最明确。蜘蛛抓到响應头後,通常直接去抓目标頁,不會在入口頁上浪費第二次請求。代價是入口頁本身會被逐步合並掉,如果你還需要它作為可被訪問的入口,就不合适。它适合那種目标頁才是真正落地頁、入口頁只是過渡的场景。
302、307 临时跳轉
蜘蛛一般也會跟,但會反复回来確認入口頁是否恢复原状。這種回訪會持續占用抓取预算,入口頁數量一多,预算就被回訪吃掉了,目标頁反而摊得少。
meta refresh
寫在 HTML 里,蜘蛛必须先拿到入口頁的 HTML 並解析,才能看到這條跳轉。延迟秒數建议设得很短,比如 0 到 1 秒;设成几十秒,部分爬虫可能不等就离開了。
JavaScript 跳轉
依赖渲染能力。具备渲染能力的爬虫才會执行脚本、拿到新地址;不具备的,可能只看到一張空壳頁面。如果入口頁 HTML 里连一條可跟的連結都没有,這一跳很容易断在這里。
跳轉鏈條不要拉太長
A 跳 B、B 跳 C、C 跳 D,每多一跳,被中途放弃的概率就叠加一次。尽量一跳到位。如果确實需要多跳,中間不要把 301、meta、JS 混着用——不同方式在不同爬虫上的执行顺序不一致,最终落在哪一层很难预判。
几個常见誤区
- 所有入口頁 301 到同一個目标頁:信号過度集中,看起来更像批量制造而非真實推荐。
- 入口頁做成空頁面加 JS 跳轉:等于把能不能走到目标頁完全交给對方的渲染能力。
- 跳轉目标频繁更換:蜘蛛刚记住一條路径,下次来又變了,来回几次就不太愿意再跟。
- 只看入口頁狀態碼:入口頁返回 200、301 都正常,但不代表目标頁真的被抓了。
相對更稳的做法
- 入口頁保留少量真實内容,把主要出口放在正文内鏈上,跳轉只作為兜底手段。
- 确實需要跳轉时優先 301,明确、一次到位,不做层层接力。
- 控制指向同一目标頁的入口頁數量,避免全部收束到一個 URL。
- 上线後翻日誌,確認目标頁有没有被抓取记錄,而不是只盯着入口頁的响應碼。
跳轉做得好,只是让蜘蛛更有可能走到目标頁;至于目标頁最终會不會被收錄,還要看内容质量、站点整体情况和搜尋引擎自己的判断,没有哪種跳轉方式能替代這些。
把跳轉当成一條路来看:路短、路直、路标清楚,蜘蛛才愿意走。运营中更值得花時間的,其實是入口頁本身有没有可看的内容,以及目标頁值不值得被繼續抓下去。