常见问题

入口页用跳转把搜索蜘蛛送往目标页,301、302、meta refresh 各有什么坑

入口页用跳转把搜索蜘蛛引到目标页,301、302、meta refresh 和 JS 跳转的表现并不一样。本文说明各类跳转的跟随情况、常见误用,以及如何从日志判断跳转是否被真正抓到。

常见问题

入口页用跳转把搜索蜘蛛送往目标页,301、302、meta refresh 各有什么坑

做蜘蛛池入口页时,有人不直接放目标 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 就能解决的事变成三次请求,抓取预算本来就紧张的话,损失很明显。能一跳到位就别做两跳。

实操建议

  1. 优先用普通的 a 标签直接指向目标 URL,这是最容易被发现的形态。
  2. 确实需要跳转时,先想清楚要的是“临时引导”还是“永久迁移”,再选 302 还是 301。
  3. meta refresh 的延迟写 0,不要写几秒。
  4. 不要设置多级跳转链,也不要让跳转依赖 Cookie 或 UA 判断做差异化返回。
  5. 不要给搜索蜘蛛和真实用户返回不同的跳转目标,这类差异化处理一旦被识别,风险远大于收益。

怎么从日志确认跳转有没有被跟到

看入口页日志里的状态码分布:如果只有 200 而看不到 3xx,说明搜索蜘蛛可能压根没请求这个入口页;如果入口页有 3xx 记录,再去目标 URL 的日志里找同一来源 IP、时间相近的请求。两者对得上,说明跳转被跟随了;只看到入口页的 3xx 却始终没有目标 URL 的请求,就要回头检查跳转方式或中间环节是不是被拦住了。