定位差异的关键不是先猜百度更喜欢哪一份,而是先确认两份内容的生成链路:静态响应由服务端直接输出,脚本渲染结果通常经过浏览器执行后再形成 DOM。若两者正文、链接或状态码不一致,优先用可复核的抓取证据判断百度拿到的是哪一份,再决定保留双份、改写输出,还是退出脚本渲染方案。这个判断会直接影响后续改模板、改渲染方式还是改内容源,顺序错了很容易白改。
不要用肉眼打开页面就下结论。先固定一个 URL 和一组请求条件,例如相同的 User-Agent、相同的 Cookie 状态、是否执行 JavaScript。可以用 curl 取静态响应,再用带渲染能力的抓取方式取执行后的 DOM,把两次结果分别保存。比较时只看四类字段:HTTP 状态码、标题、正文主体、内链 href。若静态响应里正文为空但脚本渲染后有完整段落,说明差异发生在客户端执行阶段,而不是服务端路由。
这一步的实际动作是保存两份快照并标注抓取时间。结果会影响下一步:如果静态与渲染后的标题和正文一致,只是资源加载顺序不同,通常不需要大改;如果正文或链接明显不同,才进入取舍判断。
第一种是内容注入。静态 HTML 只有壳,正文由接口返回后写入 DOM。此时要检查接口是否要求登录态、是否被 robots.txt 限制、是否返回与页面主题无关的默认文案。第二种是条件渲染。服务端根据 UA 或地域返回不同模板,脚本再覆盖一部分区块。第三种是链接改写。静态响应里是 <a href="/a">,脚本执行后变成带追踪参数的地址,甚至改成按钮点击事件。三者的处理方式不同:内容注入要改数据获取时机,条件渲染要统一判定条件,链接改写要保证最终 href 可被抓取。
这里要说明一个容易误判的点:抓取量下降或某条日志里脚本请求归零,不能单独证明静态响应就是百度采用的版本。还可能是抓取配额调整、页面重要性变化或请求合并。要结合多天的样本和同一 URL 的多次抓取记录一起看。
保留双份输出适用于静态响应已包含核心正文和主要内链,脚本只做增强交互。此时百度即使只取静态响应,也能理解页面主题。前提是静态与渲染后的标题、正文主体、主要链接指向一致。若一致,保留脚本渲染不会造成索引层面的冲突,后续只需监控两版是否长期分叉。
改写为服务端输出适用于正文完全依赖脚本、且该正文是页面主要价值的情况。做法是把数据获取移到服务端或构建阶段,让静态响应直接包含正文。实际动作是选一个代表性 URL 改造,再用同样的抓取方法对比改造前后的静态响应。若静态响应已能覆盖主要段落,下一步才是批量推广;若仍为空,说明数据源或模板层级还没改对。
退出脚本渲染方案适用于脚本渲染带来的差异无法稳定收敛,且页面本身不需要复杂交互。比如列表页、详情页的正文和链接本可以直出,却为了统一前端框架改成客户端渲染。退出的前提是业务上能接受交互降级,并且有替代的静态或服务端方案。若页面强依赖登录后个性化,退出脚本渲染未必成立,应优先考虑是否本就不该作为公开索引对象。
假设某详情页静态响应返回 200,标题正确,但正文区域只有“加载中”;脚本渲染后正文完整,内链却变成 javascript:void(0)。按前面的顺序:先保存两份快照,确认差异在正文和链接;再判断属于内容注入加链接改写;然后选择改写为服务端输出,因为正文是主要价值。改造后重新抓取静态响应,若正文出现且内链恢复为可抓取 href,说明方向正确;若正文出现但链接仍是脚本事件,则下一步只处理链接输出,不必回退整个渲染方案。
这个例子里没有真实站点数据,数字和现象仅用于说明比较方法。实际判断时,应以你自己保存的抓取样本为准,不要用单次请求的结果推断长期状态。
无论选择保留、改写还是退出,都要在改动后复查同一组字段:状态码、标题、正文主体、内链 href。若静态响应与脚本渲染结果仍不同,先确认差异是否落在可接受范围内,例如仅装饰性模块不同。若差异涉及正文或链接,继续按上面的来源分类处理。robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录;这些工具不能替代对两份响应本身的比对。把比对样本留档,下一次出现相反结果时才有可核对的依据。