先把同一URL的两种结果都留证:用禁用脚本的抓取拿到静态HTML,再用能执行脚本的方式拿到渲染后的DOM,然后逐项对照标题、正文、链接和状态码。差异通常来自三种可区分原因——内容只在脚本执行后注入、脚本因资源或接口失败而未完成、以及两种结果读取的其实是不同版本(缓存或重定向)。定位顺序应是先确认差异是否稳定复现,再判断差异发生在哪一层,最后才决定改静态输出还是改渲染路径。
单次对比不足以支撑判断。对同一URL连续取几次静态结果和渲染结果,记录每次的标题、首段文字、主要链接数量和HTTP状态。如果静态结果每次都一样、渲染结果时好时坏,问题更可能出在脚本依赖的外部资源上;如果两者都稳定但内容不同,问题更可能在内容注入方式本身。
这里要留意一个反常现象:渲染结果里出现了静态结果没有的内容,不等于静态版本“错”。如果这些内容由接口异步返回,接口超时、被限流或需要登录态时,渲染结果同样会缺失。所以要把“渲染成功”和“接口成功”分开记录,否则会把接口故障误判为渲染配置问题。
建议按下面四层顺序核对,每层只回答一个是非问题,避免同时改动多个变量:
一个假设例子:某列表页静态HTML里只有<div id="list"></div>,渲染后出现20条条目。若把接口地址单独请求一次返回空数组,那么渲染结果里的条目可能来自缓存或上一次会话,而不是当前接口。此时改渲染方式不会解决问题,应先查接口返回条件。
取静态结果,把其中的脚本引用全部移除后再看剩余HTML;再取渲染结果,把脚本执行后的DOM序列化保存。对比两者的标题和首段:
这个动作的结果会直接决定下一步:属于版本不同的,先统一缓存与重定向规则;属于脚本注入的,再评估是否需要在服务端预输出关键内容;属于接口问题的,先修接口可用性,而不是改前端渲染策略。
两种处理都成立,但适用条件不同。若关键内容本就可以在服务端生成,且改动成本可控,把它直接输出到静态HTML里,能减少对脚本执行环境的依赖;若内容必须依赖用户态或实时接口,改渲染路径(例如让渲染请求带上必要凭据、等待接口完成)更合理。
判断依据不是“哪种更先进”,而是内容是否对未执行脚本的访问者有意义。如果一段内容对用户和抓取方都应有意义,却只在脚本执行后出现,那么优先考虑服务端输出;如果它只对已登录用户有意义,就不必强求静态可见。
还要注意,robots.txt的限制只约束抓取行为,不等于可靠的索引移除;站点地图也不保证收录。因此定位差异时,不要把“已提交站点地图”或“已写robots”当作内容可见性的证据,它们和静态、渲染差异不是同一层问题。
改动后仍用原来的对照方法复查:同一URL、同样的静态与渲染取法、同样的记录字段。只有两次对照里差异项减少,才说明改动命中了原因。若差异项没变,应回到四层拆解中重新确认是哪一层没被覆盖,而不是叠加更多改动。复查的目的是让“差异是否消失”可被第三方按同样步骤复现,而不是凭一次观察下结论。