先给结论:当同一个地址用静态抓取拿到的HTML与执行脚本后得到的DOM不一致时,不要急着改代码,先判断差异属于“内容注入型”还是“路由改写型”。前者通常只影响可见文本,后者会改变链接、canonical和分页关系,定位路径完全不同。二级域名与主域名区别在这个场景里之所以关键,是因为两者常被配置成不同的渲染链路——主域名走服务端模板,子域走前端路由,差异往往从子域开始暴露。
把静态响应和脚本渲染结果并排对比时,差异可以归成两类,它们的排查动作不一样。
区分依据很简单:关闭脚本后看静态响应里是否存在可点击的站内链接。如果链接集合基本一致,只是文本缺失,属于内容注入型;如果链接集合本身对不上,属于路由改写型。这个判断决定了后面是查数据接口,还是查路由与预渲染配置。
这是最常见的分裂场景。主域名由服务端输出完整HTML,子域是纯前端应用,静态抓取只拿到挂载点。此时不要先怀疑抓取工具,按下面顺序推进。
一个实际动作是:把子域的关键列表页改为服务端输出首屏链接,脚本只负责后续交互。结果通常是静态响应里的链接集合恢复完整,抓取侧能继续向下发现。下一步就该验证这些链接是否与主域名下的对应页面形成一致的层级,而不是各自为政。
另一种情况更隐蔽:主域名和子域的静态响应都包含完整链接,但执行脚本后,链接被前端路由替换、参数被重写,或canonical被动态修改。这时差异不在“有没有”,而在“变成什么”。
判断依据是看改写是否引入新的URL形态。如果脚本把 <a href="/list?page=2"> 改成带hash或带额外追踪参数的地址,而静态响应里是干净的,就要决定以哪一版为准。取舍条件是:若脚本改写后的地址无法被服务端识别,就应以静态响应为准,并把脚本改写限制在交互层;若改写后的地址有对应的服务端路由,则可以保留,但要确保两边canonical一致。
例外是登录态或个性化内容。这类改写只对已登录用户生效,对抓取侧不可见,不应作为定位差异的主线,否则会把精力耗在抓取工具无法复现的状态上。
面对两种结果,按以下优先级取证据,能减少无效动作:
需要提醒的是,静态响应里出现某个链接,不等于它会被抓取或收录;站点地图也不保证收录。同样,把子域改成HTTPS并不解决渲染差异,也不保证安全或排名。这些现象只能作为线索,不能单独作为判断处理正确的依据。
假设某业务的商品列表在主域名下由服务端输出,在子域下由脚本请求接口后渲染。静态抓取主域名列表页得到20条商品链接,静态抓取子域列表页得到0条,渲染后子域得到20条。按前面的顺序,先确认子域静态响应里没有链接,属于路由改写型;再检查渲染后的链接是否带子域前缀,发现是相对路径;接着把首屏链接改为服务端输出,结果静态响应恢复到20条链接。下一步验证这20条链接的canonical是否指向各自详情页,而不是统一指回列表页——如果指回列表页,差异定位就还没结束。
这个推演里的数字只为说明比较方法,不代表任何真实站点的表现。真正的判断始终来自你自己抓到的两份结果之间的具体差别。