先给一个有条件的结论:如果服务端返回的 HTML 里已经包含正文、标题和主要链接,而浏览器执行脚本后这些内容被替换、删除或改写,那么差异的根源通常在渲染阶段,而不是抓取阶段。定位时应先固定“以哪一份结果为准”,再逐项核对两份 HTML 的结构差异。反例是:如果静态 HTML 本身就只有空壳容器、正文完全依赖脚本注入,那么问题可能出在内容生成链路,而不是渲染后的覆盖,此时只比较两份结果会得出错误方向。
多个角色对同一事实理解不同,往往是因为各自看到的不是同一份响应。要定位差异,先统一比较对象,通常需要三份材料:
把这三份结果放在一起,逐项核对标题、正文段落数、主要链接的 href、结构化数据。差异出现在哪一项,后续排查就锁定哪一项,而不是笼统地说“页面收录不好”。
口头争论“页面到底有没有内容”很难收敛。更有效的做法是把差异拆成可勾选的字段,让每个角色对同一字段给出证据。例如:
<h1>,文本是什么;<a href>,还是由脚本插入;当每个字段都有两份取值时,分歧就从“我觉得”变成“这份取值不同”。下一步动作也随之明确:如果只有链接字段不同,优先查链接注入逻辑;如果标题和正文都不同,优先查前端路由或模板覆盖。
假设某列表页服务端返回 20 条带链接的条目,脚本执行后只保留 8 条,其余被懒加载或条件渲染移除。这个假设下,两份结果的差异集中在条目数量和链接上。此时合理的下一步不是立刻改抓取规则,而是先确认脚本移除条目的条件:是视口判断、登录态判断,还是数据接口返回变少。因为如果是接口返回变少,改前端渲染顺序不会解决原始 HTML 与最终结果不一致的问题;如果是视口判断,则需要让首屏之外的条目在原始 HTML 中保留可抓取的链接。
这个例子的数字只用于说明比较方法,不代表任何真实站点的表现。关键是:差异字段决定排查方向,而不是差异本身的大小。
抓取量下降、某段时间日志里该 URL 归零,都不能单独证明是渲染差异导致的。合理的其他解释包括:抓取预算被其他路径占用、robots.txt 规则变化、站点地图更新滞后、服务器对特定 UA 返回不同内容。robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。要排除这些解释,需要把日志、原始 HTML 和渲染结果按时间对齐,看差异是否与抓取变化同步出现。同步出现只是相关,仍要检查是否有第三个变量同时变化。
定位完成后,需要明确以哪份结果为基准。若业务依赖脚本交互,可让原始 HTML 保留核心正文与链接,脚本只做增强,这样两份结果的差异被压缩到可接受范围。若内容确实只能由脚本生成,则应保证数据接口稳定、首屏关键内容尽早出现,并分别核查不同搜索引擎对脚本执行的支持情况,而不是假设所有引擎都会执行同样的脚本。
下一步动作建议是:选一个代表性 URL,记录原始 HTML 与渲染后 DOM 在标题、正文、链接三个字段上的取值,连续观察几次抓取日志,确认差异是否稳定复现。稳定复现后再改模板或渲染逻辑,改完用同一组字段重新核对,而不是只看收录数量是否变化。