先给有条件的结论:如果静态 HTML 里已有正文,而浏览器执行脚本后才出现另一份内容,优先把静态响应当作百度抓取与索引的主要依据,把脚本渲染结果当作补充证据。只有当脚本渲染出的内容才是页面主体、静态响应只是占位骨架时,这个结论才需要反过来。下面给出一套可核对的定位顺序。
不要一上来就改页面。先分别保存三份材料:不带 Cookie 的原始响应、禁用脚本后的可见文本、允许脚本后的可见文本。把三者放进同一个文本对比工具,只看差异类型,不急着判断对错。常见差异有四类:
这四类对应的处理方向完全不同。第一类要查脚本是否覆盖了服务端输出;第二类要查服务端是否漏渲染;第三类要查模板条件;第四类通常与收录判断无关,不必投入排查。
取一个具体 URL,用命令行请求原始响应并保存到本地文件,例如:
curl -s -A "Mozilla/5.0" https://example.com/page > static.html
再在浏览器中禁用 JavaScript 打开同一 URL,另存为 nojs.html;然后开启 JavaScript 再另存为 withjs.html。对三个文件做文本比对,记录差异出现在正文区、标题区还是链接区。
这个动作的价值在于把“我看到的不一样”变成“哪一段文本在哪个阶段出现”。如果差异集中在正文区,下一步就查数据来源;如果只在链接区,下一步查路由或懒加载。动作结果直接决定后续排查对象,避免在无关模板上反复改动。
同一组差异往往有多种解释,需要逐条排除:
判断方法很直接:在脚本执行前后分别记录网络请求。如果脚本渲染后的正文来自某个接口,而静态响应里已有同样文本,说明服务端本来就能输出,问题在渲染策略;如果静态响应里没有该文本,接口又返回了数据,说明服务端漏了这一步。
假设某页面静态响应只有“加载中”,脚本执行后出现完整正文,且该正文只存在于接口响应中。这时前面“静态响应优先”的结论就不成立,因为静态响应并没有承载页面主体。正确做法是先让服务端能够输出同一份正文,再谈脚本增强;否则百度抓取到的可能只是占位文本。
反过来也有反例:静态响应有完整正文,脚本执行后却把正文替换成“请开启 JavaScript”。这种替换如果覆盖了原有内容,会让原本可被抓取的信息消失。此时应检查脚本的挂载逻辑,而不是继续增加渲染依赖。
确定差异来源后,只改一个变量并复测。若判断是脚本覆盖,先让脚本在挂载前检测容器是否已有正文,有则跳过替换;若判断是服务端漏渲染,先让服务端输出与接口一致的核心正文,再保留脚本增强。改完后重新执行前面的三份材料比对,确认静态响应与脚本渲染在正文区一致。
需要提醒的是,robots.txt 限制抓取并不等于可靠的索引移除,站点地图也不保证收录。差异修复后,百度近日收录查询的结果仍可能受抓取预算、页面质量和重复内容影响,不能把一次响应一致当作收录已经完成的证据。下一步应继续观察同一批 URL 的抓取与索引状态,而不是只盯单次响应文本。