入口页最核心的职责,是把蜘蛛带到真正的目标 URL。除了在页面上摆链接,跳转是另一种常见做法。但跳转方式选得不对,蜘蛛可能到了门口就停下,或者把入口页当成一个没有价值的中间层。
先想清楚跳转要达成什么
在挑方式之前,先把三件事对齐:
- 可发现:蜘蛛能顺着跳转链走到目标页,而不是停在入口页。
- 信号去向:原本指向入口页的链接与抓取记录,是留在入口页还是转给目标页。
- 可回退:入口页将来换目标、下线或改结构时,改动成本是否可控。
这三点的优先级不同,选出来的跳转方式往往也不同。
几种跳转方式的差异
301 永久跳转
301 的语义是“这里以后都不在了,请去新地址”。对蜘蛛来说,这是一条明确的迁移信号,多数情况下会把入口页的记录逐步转移到目标 URL。它适合固定映射的场景:一个入口页长期只指向一个目标页,且不打算频繁更换。
要注意的是,301 链条不宜过长。入口页 → A → B → 目标页这种多级跳转,会消耗抓取预算,也容易在某一环断掉。尽量一跳到位。
302 与 307 临时跳转
临时跳转告诉蜘蛛“位置暂时变了,但原地址还算数”。蜘蛛通常仍会保留入口页,抓取力度是否跟过去,取决于它对临时性的判断。这类跳转适合活动页、短期专题这种会更换目标的场景。
如果长期用 302 指向一个稳定目标,等于一直在告诉蜘蛛“这只是临时的”,信号传递就会变得模糊。这种情况不如直接给链接,或者换成 301。
JS 跳转
用 JavaScript 做 location 跳转,依赖蜘蛛是否执行脚本。主流搜索蜘蛛基本具备渲染能力,但渲染是有成本的,入口页本身如果没有实质内容,可能排不进渲染队列。
所以 JS 跳转更适合作为补充路径,而不是唯一路径。页面上同时保留一个可点击的普通链接,是成本很低的保险。
meta refresh
meta refresh 是写在网页头部的声明式跳转,解析成本低,各类爬虫的兼容度也比较好。缺点是延迟时间不好把握:设为 0 秒最干脆,设成几秒又会让蜘蛛在入口页多停一会儿。另外,这种方式对信号传递的表达比较弱,通常被理解为“页面自己主动换个地方”,而不是严格的迁移声明。
常见误区
- 一个入口页同时用多种跳转方式,比如既有 302 又有 JS 跳转,指向的还不是同一个地址。蜘蛛可能只走其中一条,另一条就成了无效路径。
- 跳转目标带一堆参数或会话 ID,每跳一次生成的 URL 都不一样,结果目标页被拆成多个版本。
- 把跳转页当中转层,一层套一层,每层只写一句“正在跳转”。这类页面本身没有内容,蜘蛛走到最后往往什么也没拿到。
- 把 404、410 和跳转混着用,入口页状态时好时坏,状态码来回变,蜘蛛很难建立稳定的抓取印象。
按场景选,而不是按习惯选
- 入口页与目标页是长期一对一关系:优先直接链接,其次 301。
- 目标页会周期性更换:用 302 或 307,换的时候同步更新,别留旧跳转。
- 目标页不在同一域名下,且你希望信号转移:301 更合适,同时确认目标页能正常访问、不需要登录。
- 入口页本身有内容、想让蜘蛛留下做二次发现:直接给链接,跳转只作为辅助。
- 只是临时切换几分钟做维护:用 302 或 503,别去动 301。
跳转方式没有绝对的好坏,关键是它和你的长期意图是否一致。反复横跳,比一次选错更伤抓取关系。
用日志验证跳转是否按预期工作
改完跳转后,观察几天的访问记录:入口页是否还在被抓、目标页出现频次是否上升、有没有冒出明显不该存在的中间 URL。如果入口页访问量没下降、目标页也没变化,多半是跳转没被识别,或者跳转链在某一环被拦下了。
同时留意跳转响应本身的耗时。跳转页如果响应慢,蜘蛛可能在拿到跳转指令之前就超时离开,前面所有设置都白做。
最后提醒一句:跳转只是路径设计的一部分,真正决定目标页能不能被稳定抓取的,还是目标页自身能否正常访问、内容是否可读。跳转做对了,也只是把门打开。