先把同一个内链目标分别用静态响应和脚本渲染结果各取一份,再逐项比对链接的 href、锚文本、是否可点击、是否出现在 DOM 里。若两份结果不同,不要急着判定哪份是错的,而要判断差异发生在哪一层:服务端返回的 HTML、脚本执行后的 DOM、还是抓取工具看到的渲染快照。缺少完整日志或后台权限时,这个比对仍然能做,只是结论只能停在“差异存在且位置明确”,不能推出收录或排名会怎样。
选一个具体页面,例如某个栏目列表页或详情页,记录它的完整 URL、请求时是否带参数、是否登录、是否走了 CDN 或缓存。然后用两种方式各取一次结果:一种只取原始 HTML 响应,另一种等脚本执行完再取渲染后的 DOM。两次请求尽量用同一网络环境、同一 User-Agent、同一时刻附近,减少无关变量。
可执行的最小动作是:把两次结果里所有 <a> 标签的 href 抽出来,按出现顺序做一份对照表。对照表里至少标出三种情况:只在静态 HTML 里出现、只在渲染后出现、两边都有但 href 或锚文本不同。这个动作的结果直接决定下一步——如果差异集中在“只在渲染后出现”,问题多半在脚本注入;如果集中在“只在静态 HTML 里出现”,要看脚本是否在运行时删除或替换了节点。
静态响应与渲染结果不同,常见来源可以按下面顺序排查,每一步都能给出可观察的证据:
这三种来源对应的处理方向不同。第一种要回到服务端逻辑或缓存策略;第二种要确认脚本是否把链接放在了用户和抓取都能到达的位置;第三种要检查渲染等待条件,而不是改页面结构。把来源判断错,后续动作会全部跑偏。
在缺少完整日志和后台权限时,仍可做两组对照。第一组:同一页面分别在不执行脚本和执行脚本的条件下取 DOM,看目标内链是否出现、href 是否一致。第二组:在渲染模式下把等待时间从默认值延长,观察链接是否从“缺失”变为“出现”。
假设一个页面初始 HTML 里有一个指向详情页的 <a href="/detail/1">,脚本执行后该节点被替换成 <div data-href="/detail/1">。那么静态响应里能抽到链接,渲染结果里抽不到可点击链接。这个例子只用于说明比对方法,不代表任何真实站点。它的意义是:差异位置一旦落到具体节点,就能判断是脚本改写而非服务端缺失。下一步应确认脚本改写是否必要,以及改写后的元素是否仍能被识别为链接。
如果延长等待后链接出现,说明渲染时机是主因;如果延长等待后仍不出现,而禁用脚本后也不出现,则问题更可能在服务端输出或数据接口,而不是渲染等待。这两种结果指向不同的下一步动作,不能混为一谈。
能下的结论是:在给定请求条件和给定渲染条件下,该内链的呈现确实不同,且差异发生在可定位的层级。这个结论足以支撑一次修复或一次复测。
不能下的结论包括:不能因为静态响应里有链接就断定它会被收录;不能因为渲染结果里链接缺失就断定整站内链失效;不能因为某次抓取快照没看到链接就断定脚本方案不可用。请求量、抓取量或某个统计归零,也不能单独证明处理正确,因为缓存、请求头、采样方式和渲染排队都可能是别的解释。robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,这些都不能拿来当作差异定位的替代证据。
把差异定位清楚后,下一步才是决定改哪一层:改服务端输出、改脚本注入方式,还是改渲染等待条件。每次只改一层,再用同一组对照复测,才能知道是哪一步真正影响了内链的呈现。