你代码里那行 window.location.href = 'https://xxx',百度可能根本没看见——不是它不想看,是它压根没等到你执行完。

别急着重写逻辑,先看看百度爬虫到底在你页面上“看到”了什么。我帮上百个站点调过 JS 跳转问题,从下载站、工具站到本地生活服务,踩过的坑比你写的跳转逻辑还多。今天不讲虚的,只说百度真正在意的几条硬规则。

百度到底怎么识别你的JS跳转?

百度爬虫用的是自研渲染引擎,能跑大部分常见 JS,比如 window.location.hrefwindow.opensetTimeout 这些基础操作,它都认识。

但它不执行所有 JS。它只跑它觉得“靠谱”的部分:比如同步执行的跳转,它大概率能抓到;但如果你把跳转塞进 window.onload 里,而页面资源又加载慢,它可能等不及就走了——就像你刷新一个卡住的页面,手动关掉一样。

异步跳转更麻烦。setTimeout 设个 3 秒?百度爬虫通常只等 1 秒左右。之前有个电商站,用 setTimeout 延迟跳转到移动端页,结果百度一直抓 PC 版,移动端流量几乎归零。

真实案例:一个下载站用 window.location.replace 做防盗链跳转。第一次抓取时跳转成功,第二次百度发现这个 URL 总是跳走,直接标记为“虚假页面”,整站自然流量掉了很久。

你常用的3种JS跳转,百度最讨厌哪种?

  1. window.location.href:能识别,但有前提。如果你在页面加载后动态改它(比如等某个按钮点击才赋值),百度很可能只记下初始 URL。有个优惠券聚合页就是这么被拒收的——爬虫看到原始 URL 和最终跳转目标不一致,判定为“桥页”,不收录。

  2. window.open:基本白写。百度爬虫不模拟用户交互,onclick 里调用 window.open,它大概率当没看见。之前一个旅游站靠这个跳转到预订页,结果所有相关关键词排名全掉。

  3. setTimeout:风险最高。延迟跳转不仅百度难抓,用户也烦——等着等着页面突然跳走,体验很差。百度算法明确反感这种行为。有个内容聚合站用 setTimeout 跳回主站,2021 年算法更新后,直接被标为“垃圾页面”,流量断崖式下跌。

最危险的就是第 3 种。不是因为它技术多难,而是它同时踩中了百度的两个雷区:爬虫抓不到 + 用户体验差。

为什么你的JS跳转总被百度判定为“恶意跳转”?

核心就两点:跳得太勤,或者跳得不明不白。

百度对跳转链长度有限制,一般最多跟 3–5 次。你搞 A→B→C→D,它走到 C 就停了,后面全丢。

另一个高频翻车点:用 navigator.userAgent 做设备判断再跳转。问题在于,百度爬虫的 UA 经常伪装成手机端,你一检测就跳,它反而以为你在“骗它”。之前有个新闻聚合站就这么干,PC 和移动版内容完全两套,被判定为“欺骗性跳转”,整站被降权。

还有个细节容易被忽略:跳转目标是不是自家域名。如果 JS 跳的全是第三方链接(比如联盟推广页),百度会直接怀疑你在导流垃圾外链。一个流量分发站就因此全站不被收录。

真实案例:一个本地生活服务站,每次 JS 跳转都重新计算目标页,没做任何缓存。百度发现同一个 URL 每次跳转结果不同,直接打上“动态跳转”标签,排名掉了很久才拉回来。

想让百度爬虫乖乖跟你的JS走?试试这2个保命方法

方法1:加个 <noscript> 备胎。在 </head> 里放一段 <meta http-equiv="refresh" content="0;url=目标地址">。这样就算 JS 不执行,百度也能通过 meta 找到最终页面。之前一个行业门户站用了这招,收录率从不到三成,翻了几倍。

方法2:把跳转逻辑搬到服务端。用 PHP 或 Node.js 做设备识别和跳转,返回给爬虫的就是最终页面。不用它费劲执行 JS,它打开就是对的内容。一个电商站这么改完,移动端搜索流量明显提升。

注意:这两个方法别一起上。我见过有人既写 JS 跳转,又塞 meta 刷新,结果百度有时抓 meta 目标,有时又执行 JS,最后跳到两个不同页面,内容对不上,直接被降权。

百度爬虫到底能执行多复杂的JS逻辑?

它的 JS 引擎能力大致相当于 Chrome 80。能跑:

  • 基础变量、if/else、for 循环
  • document.querySelector 这类 DOM 查询
  • fetchXMLHttpRequest(但跨域请求经常被拦)
  • Promiseasync/await(不过超时风险高)

但它搞不定:

  • WebSocketCanvasWebGL
  • 大量依赖 requestAnimationFrame 的动画逻辑
  • 第三方 iframe 里的 JS 调用

真实教训:一个数据可视化站,把跳转逻辑写在 requestAnimationFrame 回调里,百度爬虫直接跳过,所有详情页都没被收录。

还有个隐形坑:localStoragesessionStorage。爬虫读不到这些存储里的值。之前一个工具站用 localStorage 记录用户是否同意跳转,结果百度每次抓取都读不到状态,跳转永远不触发。

跳转后页面内容不匹配?百度已经盯上你了

百度会比对跳转前后的页面内容。如果跳转前满屏关键词、简介、SEO 文案,跳转后却是一片空白、或全是广告、或内容完全无关,它就会怀疑你在“挂羊头卖狗肉”。

2022 年上线的“内容一致性检测”,专门盯这事。一个小说站就栽在这儿:跳转前是正版简介页,跳转后是盗版全文页,内容差异太大,整站被 K。

另一个隐形杀手:跳转后页面加载太慢。百度会记录整个跳转链耗时,如果超过 3 秒,它可能直接放弃。之前一个视频站跳转到第三方源,加载慢,爬虫等不到就走了;后来换成自建 CDN,跳转快了,收录率也上来了。

今天就能执行的3个自检步骤

别等明天,现在就打开你正在维护的网站,花 30 分钟做完这三件事:

第一步:打开 Chrome 开发者工具(F12),切到 Network 标签页,右键刷新按钮 → “Edit User Agent”,粘贴百度 UA:Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html),然后刷新页面,看控制台有没有报错,跳转是否正常执行。

第二步:登录百度搜索资源平台(就是你天天用的那个站长后台),进“抓取诊断”,输入你那个 JS 跳转页的 URL,点抓取。看返回状态码——如果是 302301,说明百度看到了跳转;如果是 200 但页面内容不对,大概率 JS 没跑起来。

第三步:打开你网站的 JS 文件(或者内联脚本),搜 setTimeoutsetInterval。如果有,把延迟时间改成 500 以内,或者干脆删掉,换成 window.location.href 直接跳。

做完这三步,观察一周收录和排名变化。如果没起色,欢迎回来找我一起看日志。