入口页或蜘蛛池中的 URL,很多时候并不是最终要展示的页面,而是需要把蜘蛛引导到另一个地址。跳转方式选得不对,蜘蛛可能停在入口页,也可能跟到一半就放弃。下面按常见跳转方式拆开讲,重点看蜘蛛会怎么处理,以及实际运营中怎么取舍。
蜘蛛遇到跳转时的基本处理逻辑
蜘蛛抓取一个 URL,拿到响应后先看状态码。如果是 301、302、307、308 这类 3xx,会读取 Location 响应头,把目标地址放进待抓队列。但“放进队列”不等于马上抓,也不等于一定会抓,还要看目标地址的历史质量、入口页的抓取频率和整体配额。
如果返回 200,页面里用 JavaScript 做跳转,蜘蛛需要执行 JS 才能看到目标地址。不同蜘蛛的渲染能力不一样,有的会渲染,有的只抓原始 HTML。meta refresh 虽然写在 HTML 里,部分蜘蛛能识别,但它的信号强度通常弱于服务端跳转。也就是说,跳转方式越靠前、越明确,蜘蛛跟进成本越低。
几种跳转方式的取舍
301 永久跳转
301 表示入口页已经永久迁移到目标地址。蜘蛛通常会较快跟进,并把入口页的链接关系逐步转移到目标页。适合确定不再保留入口页内容的场景,比如老 URL 换新 URL、域名合并。但如果你还想让入口页本身继续被索引,就不要轻易做 301,否则入口页可能逐渐从索引里消失。
302 与 307 临时跳转
302 表示临时跳转,蜘蛛一般会继续保留入口页,同时可能去抓目标页。307 与 302 类似,但会保留原始请求方法。临时跳转适合活动页、短周期导流页,或者你还在观察目标页表现、不想立刻放弃入口页的情况。注意不要用 302 做长期跳转,也不要把 302 串成一条链,蜘蛛跟几次之后可能就不跟了。
JavaScript 跳转
JS 跳转在前端项目里很常见,比如 window.location.href 或路由重定向。蜘蛛如果执行 JS,就能发现目标地址;如果不执行或渲染超时,目标地址就不会被发现。这种方式还会消耗更多抓取资源。实际操作中,最好在 HTML 里同时放一个可点击的普通链接作为兜底,别把发现路径只押在 JS 上。
meta refresh
meta refresh 写在 HTML 的 head 里,设置几秒后跳转。它对蜘蛛来说是一个弱信号,容易被当成低质量跳转。如果非要用,延迟尽量设短,并且页面里要有真实内容或普通链接。不要用 meta refresh 把入口页做成“空白过渡页”,蜘蛛看到空页面后继续跟进的意愿会降低。
服务端 200 + 内容内链接
最稳妥的方式其实是入口页返回 200,在正文里放清晰、可点击的链接,让蜘蛛自然爬过去。这样入口页本身也有内容可读,蜘蛛不会只看到一个跳转指令。对于蜘蛛池入口页来说,如果目标是让蜘蛛发现更多 URL,优先考虑这种方式,跳转只作为辅助。
实际使用建议
- 跳转目标要和入口页主题相关,别把蜘蛛引到完全无关的页面。
- 跳转链路尽量不超过一跳,避免 301 接 302、再接 JS 的层层嵌套。
- 不要用跳转来隐藏链接,蜘蛛对异常跳转的容忍度有限。
- 如果入口页要长期存在,优先用 200 加内链;如果要彻底换地址,再用 301。
- JS 跳转记得保留 noscript 或普通链接兜底。
常见误区
把跳转当成“万能通道”,以为只要设置跳转,蜘蛛就会立刻抓目标页。实际上跳转只是发现路径之一,目标页本身是否可抓、是否重复、是否有价值,同样影响最终结果。
- 302 当 301 用,导致入口页和目标页的关系一直不清晰。
- 跳转目标返回 404 或 503,蜘蛛跟过去也是白跑。
- meta refresh 延迟设成几十秒,蜘蛛可能直接放弃。
- 同一入口页同时放多个跳转指令,蜘蛛不知道以哪个为准。
用日志检查跳转效果
跳转改完之后,可以看服务器日志里对应 URL 的状态码分布:3xx 是否被大量请求、目标页是否出现蜘蛛访问、目标页返回的状态码是否正常。如果入口页一直只有 3xx 记录,目标页却没有被抓,说明蜘蛛没有跟进,需要检查跳转实现方式和目标页的可访问性。如果目标页被抓但很快不再来,可能是目标页内容或结构有问题,和跳转方式关系不大。
跳转不是越复杂越好。对蜘蛛来说,最省事的路径是服务端明确响应加普通链接。把这条做好,再根据是否需要保留入口页来选择 301 或 302,通常比堆叠 JS 和 meta refresh 更可控。