入口页本身只是一个中转站,它的任务是把蜘蛛带到目标站。但带过去的方式不止一种:有 301、302 这样的 HTTP 跳转,有 meta refresh,也有 JavaScript 跳转,还有最朴素的可见链接。不同方式在蜘蛛眼里并不是等价的,处理方式和跟不跟、跟多远都不一样。
为什么跳转方式值得单独拿出来看
蜘蛛抓到一个入口页后,会先看响应,再决定下一步。如果响应里明确写着这个地址换到另一个地址,蜘蛛通常会继续请求新地址;如果跳转藏在脚本里,或者信号不够明确,蜘蛛可能停在入口页,也可能把入口页当成最终页面。入口页数量一多,跳转方式选得不对,就会表现为入口页抓了、目标站没动静。
几种常见跳转方式的蜘蛛表现
301 永久跳转
301 传递的是旧地址永久换成新地址的信号。蜘蛛一般会较快地把新地址纳入抓取范围,并且后续再遇到旧地址时,也可能直接按新地址处理。对入口页来说,如果入口页本身不打算承载内容,只是把蜘蛛引向目标站,301 是相对干净的选择。但要注意:一旦大量入口页都用 301 指向同一个目标地址,目标站会集中承受抓取压力,而不是被分散。
302 与 307 临时跳转
302 表示临时跳转,蜘蛛通常也会跟,但保留旧地址的抓取记录,不会立刻用新地址替换。307 类似,只是更严格地保持原请求方法。用 302 做入口页跳转,好处是后续调整目标地址时改动成本低;坏处是蜘蛛可能反复回到入口页确认,入口页的抓取次数会比 301 多一些。如果入口页只是临时测试,302 没问题;如果长期固定指向某个目标站,302 容易让抓取在入口页上多绕一圈。
meta refresh
meta refresh 写在 HTML 的 head 里,浏览器和蜘蛛都能识别,但优先级低于 HTTP 跳转。它的优点是实现简单,不需要改服务器配置;缺点是跳转意图不够强,蜘蛛可能先把入口页当普通页面处理,再决定跟不跟。如果入口页只有一条 meta refresh,没有其他链接,蜘蛛漏跟的概率会比 HTTP 跳转高一些。
JavaScript 跳转
通过 JS 改 location 的方式,对部分蜘蛛来说并不总是能可靠执行。搜索引擎对 JS 的渲染能力在提升,但抓取阶段和渲染阶段是分开的,蜘蛛可能先拿到一个没有目标链接的页面就走了。把跳转完全交给 JS,等于把能不能到目标站这件事押在渲染上,入口页数量多的时候不太划算。
直接可见的链接
最朴素的方式是在入口页正文里放一个普通链接,让蜘蛛自己决定跟不跟。这种方式没有跳转信号,但对蜘蛛来说路径是明确的,也方便入口页保留一点自己的内容。缺点是它更像引导而不是跳转,蜘蛛不一定会优先跟。适合入口页本身有一定内容、不急于把蜘蛛立刻送走的情况。
选择跳转方式时的几个判断点
- 目标地址是否长期固定:长期固定优先 301;需要频繁调整则考虑 302 或可见链接。
- 入口页是否保留内容:只做中转,HTTP 跳转更直接;想保留一点页面信息,可见链接更自然。
- 蜘蛛的渲染能力:不确定对方是否执行 JS 时,不要把跳转只放在脚本里。
- 抓取压力的落点:跳转会让目标站承接更多请求,入口页再多,压力也不会凭空消失。
一个容易忽略的细节:跳转链的长度
有些入口页不是一步到位,而是 A 跳到 B,B 又跳到 C,最后才到目标站。每多一层跳转,蜘蛛就多一次请求,也多一个可能中断的环节。链路过长时,蜘蛛可能在中间某一跳停下来,或者把中间的地址当成最终页。比较稳妥的做法是让入口页直接跳到目标地址,减少中间层;如果确实需要中间层,至少保证每一跳都是 HTTP 跳转,而不是 HTTP 跳转接一段 JS 再接 meta refresh。
落地建议与排查顺序
- 先确认入口页返回的跳转类型:是 301、302,还是 200 页面里藏着 meta refresh 或 JS。
- 用抓取工具或日志看蜘蛛是否真的请求了目标地址,而不是只看入口页有没有被抓。
- 如果目标站没有动静,优先把混合跳转改成单一 HTTP 跳转,减少中间层。
- 如果目标站抓取量突然变大,检查是否大量入口页同时 301 到同一个地址,必要时分散目标。
- 跳转方式调整后,观察一段时间再判断,不要一两天没变化就反复改。
跳转方式是入口页和蜘蛛之间的指路方式。指得越直接、越稳定,蜘蛛越容易走到目标站;指得太绕或者太依赖渲染,入口页就容易被当成终点。