入口页被爬,不等于目标页被爬。中间往往隔着一次跳转——跳得顺,蜘蛛顺着往下走;跳得别扭,它可能就停在入口页不动了。这篇文章把几种常见的跳转方式放在一起对比,说明各自对爬虫的实际影响,以及运营时容易踩的坑。
先分清跳转和内链
很多人把这两件事混着说,但它们的机制并不一样。
- 内链:入口页本身承载内容,正文里放一个指向目标页的链接。蜘蛛要先解析入口页,再决定跟不跟。
- 跳转:入口页基本不呈现内容,直接把自己的位置让给目标页。只要蜘蛛识别到跳转,就会继续走。
内链更自然,但依赖蜘蛛愿不愿意点;跳转更直接,但会把入口页本身的位置让出去。选哪种,取决于入口页是长期存在的入口,还是临时过桥的踏板。
几种跳转方式的实际表现
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。
- 上线后翻日志,确认目标页有没有被抓取记录,而不是只盯着入口页的响应码。
跳转做得好,只是让蜘蛛更有可能走到目标页;至于目标页最终会不会被收录,还要看内容质量、站点整体情况和搜索引擎自己的判断,没有哪种跳转方式能替代这些。
把跳转当成一条路来看:路短、路直、路标清楚,蜘蛛才愿意走。运营中更值得花时间的,其实是入口页本身有没有可看的内容,以及目标页值不值得被继续抓下去。