做蜘蛛池入口页时,有人不直接放目标 URL 的 a 标签,而是让入口页跳转过去,理由通常是“想控制点击路径”“方便统计”,或者“不想让入口页和目标页在 HTML 里直接产生关联”。跳转本身不是不能用,但不同跳转方式对搜索蜘蛛的意义差别很大,用错了容易白做工,甚至把入口页和目标 URL 绑得更紧。
先分清几种跳转方式
- HTTP 301:永久跳转,搜索蜘蛛通常会把原 URL 的信号归到目标 URL 上,后续可能直接抓目标 URL。
- HTTP 302 / 307:临时跳转,搜索引擎一般保留原 URL,但也会跟随到目标 URL 抓取。
- meta refresh:写在 HTML 的 head 里,延迟为 0 时较容易被跟随,延迟设成几秒以上,很多抓取器可能直接忽略。
- JavaScript 跳转:需要搜索引擎渲染页面后才执行,取决于渲染资源是否分给了这个 URL。
301 和 302 对入口页意味着什么
如果你希望入口页本身不被索引,只作为发现目标 URL 的跳板,那么 301 往往适得其反:搜索引擎会把入口页和目标 URL 看成同一个资源的迁移关系,入口页的历史信号会向目标 URL 转移,入口页本身也可能从索引里消失。而当大量入口页都用 301 指向同一个目标 URL 时,这种“多对一”的跳转关系在抓取和索引数据里是比较显眼的模式。
302 相对温和,搜索引擎一般保留原 URL、同时跟随跳转抓取目标页。但它同样是可被识别的跳转关系,并不是所谓的隐身手段。
跳转只能改变抓取路径,不能改变“这些 URL 之间存在关联”这个事实。想靠跳转伪装链接关系,通常得不偿失。
meta refresh 和 JS 跳转的实际表现
meta refresh 的延迟时间是关键。延迟为 0 的写法被跟随的概率相对高一些,但不同抓取器的处理并不统一;延迟几十秒的写法,搜索蜘蛛基本不会在抓取时等待,等于没写。JS 跳转则依赖渲染,如果这个入口页在抓取队列里没有被安排渲染,跳转就不会执行,目标 URL 自然也不会被发现。
更稳妥的做法是:即使要用 JS 跳转,也在页面里保留一个普通的 a 标签指向目标 URL,让不执行 JS 的抓取器也能发现链接。跳转只是给用户看的体验层,不该成为唯一的发现路径。
跳转链不要拉长
入口页 → 中间页 → 目标页这种多跳结构,每一跳都要消耗抓取资源,而且跳转次数超过一定上限后,爬虫会直接停止。原本一个 URL 就能解决的事变成三次请求,抓取预算本来就紧张的话,损失很明显。能一跳到位就别做两跳。
实操建议
- 优先用普通的 a 标签直接指向目标 URL,这是最容易被发现的形态。
- 确实需要跳转时,先想清楚要的是“临时引导”还是“永久迁移”,再选 302 还是 301。
- meta refresh 的延迟写 0,不要写几秒。
- 不要设置多级跳转链,也不要让跳转依赖 Cookie 或 UA 判断做差异化返回。
- 不要给搜索蜘蛛和真实用户返回不同的跳转目标,这类差异化处理一旦被识别,风险远大于收益。
怎么从日志确认跳转有没有被跟到
看入口页日志里的状态码分布:如果只有 200 而看不到 3xx,说明搜索蜘蛛可能压根没请求这个入口页;如果入口页有 3xx 记录,再去目标 URL 的日志里找同一来源 IP、时间相近的请求。两者对得上,说明跳转被跟随了;只看到入口页的 3xx 却始终没有目标 URL 的请求,就要回头检查跳转方式或中间环节是不是被拦住了。