在蜘蛛池里,入口页本身只是一个中转点,真正要送出去的是目标 URL。而这个中转动作用什么方式实现,会直接影响蜘蛛读到的信号:它把这当成永久迁移、临时跳转,还是页面上一个普通的链接。很多人只关心入口页能不能打开,却忽略了跳转本身也是一段会被解析、也可能被解析失败的内容。
四种常见跳转的基本行为
301 永久跳转
服务器返回 301 时,蜘蛛会认为源地址已经作废,把信号按一定比例转移到目标地址,并在后续抓取中逐渐用目标地址替换源地址。对蜘蛛池来说,这意味着入口页会慢慢从索引里退出,池子的入口数量被消耗掉。如果你希望入口页长期活着、持续带新目标,301 并不是合适选择。
302 与 307 临时跳转
临时跳转保留源地址的身份,蜘蛛会继续抓入口页,同时把目标地址放进待抓取队列。对池子而言这是比较常用的一种:入口还在,目标也能拿到曝光。307 更严格地保留请求方法,对普通 GET 请求来说,两者差别不大。
meta refresh
写在 HTML 的 head 里,等待时间设为 0 时基本等同于即时跳转。它需要蜘蛛先把 HTML 下载完才能发现目标地址,多了一步解析成本。好处是不用碰服务器配置,适合纯静态托管、改不了响应头的场景。
JS 跳转
常见写法是 location.href 或 window.open。能不能被识别,取决于抓取端是否执行 JS,不执行就什么都看不到。即使会执行,这类跳转通常也被当作较弱的信号,优先级低于服务器端返回的跳转。
实际使用建议
- 入口页要长期存活、持续带新目标:优先用 302,或者干脆在页面上放一个可点击的 a 标签链接。
- 入口页确认要弃用,把信号收拢到主站某个页面:用 301,并确保目标页可访问、内容相关。
- 静态托管、动不了响应头:用 meta refresh 兜底,同时页面里补一个 a 标签链接。
- 需要到达最终落地页:让跳转链路尽量只有一跳,避免 302 接 302 再接一段 JS。
几个容易踩的坑
把跳转当成隐藏目标地址的手段,其实只是把它往后挪了一层。蜘蛛顺着跳转读下去,最终地址一样会被记录,反而多了一次解析失败的机会。
另一个高频问题是跳转目标返回 404 或 5xx。蜘蛛会认为这次跳转失败,降低对入口页的抓取频率,严重的会直接放弃。跳转链路上的每一跳都要能稳定返回 200。
还有一种情况是把入口页做成跳转后又立刻用 robots 屏蔽目标地址,等于自己把路堵死。抓取开关和跳转方向要一起看,别各配各的。
上线后怎么验收
- 用 curl 看响应头,确认状态码与 Location 是不是你预期的那个。
- 关闭 JS 再访问一次,看看不执行脚本时页面还剩什么。
- 用抓取工具模拟一遍,观察从入口页到目标地址的完整链路,数清楚有几跳。
- 在日志里筛出来访记录,看蜘蛛实际走的是哪条路径,跟设计的是否一致。
跳转不是越花哨越好。对池子来说,稳定、一跳、目标可访问,比用什么技巧更重要。把跳转方式固定成一套规则,批量生成时统一执行,后续排查问题时也容易定位到是哪一环出了偏差。