排查内容加载差异,核心是判断同一URL在不同环境、不同抓取方式下返回的正文是否一致。做法是固定测试条件,分别记录服务器直连、搜索引擎抓取工具视角和普通浏览器视角下的HTML内容,再对比差异出现的位置。只有先确认差异发生在哪一层,才能决定是修模板、改渲染方式还是调整缓存策略。
很多排查一开始就混了对象。内容加载差异至少涉及三类结果:服务器返回的原始HTML、浏览器执行脚本后的DOM、以及抓取工具实际拿到的内容。三者不一致时,问题可能出在服务端渲染、客户端渲染或中间缓存,不能一概而论。
curl或抓取工具请求URL,看返回的HTML里有没有目标正文。如果服务器直连没有正文、浏览器有,说明内容依赖客户端渲染;如果两者都有但内容不同,重点查缓存和A/B测试逻辑;如果抓取结果与服务器直连不同,重点查抓取工具是否执行脚本以及是否有屏蔽规则。
下面每一项都按“检查对象—操作方法—结果解读”组织,可以按顺序执行,也可以根据已观察到的现象跳查。
要查的是正文是否存在于初始响应中。用浏览器打开页面,右键查看网页源代码,搜索正文中的一段独特文字;再在开发者工具Elements面板搜索同一段文字。
如果源代码搜不到、Elements能搜到,说明正文由JavaScript生成。结果说明:需要确认抓取工具是否执行脚本,或者考虑服务端渲染、预渲染。如果两处都能搜到但文字不同,说明存在两套内容输出,重点查模板条件判断和缓存。
要查的是CDN、反向代理或页面缓存是否返回了旧版本或不同版本。用curl -I查看响应头中的缓存相关字段,再用curl请求同一URL多次,观察正文是否变化。
如果多次请求返回不同正文,且响应头显示命中缓存,说明缓存键设计可能没有区分设备、语言或登录状态。结果说明:需要检查缓存键是否包含会影响内容的维度,例如User-Agent、Cookie或查询参数。
要查的是不同设备类型是否拿到不同正文。分别用桌面和移动User-Agent请求同一URL,对比返回HTML中的正文部分。
如果移动端正文明显更少或结构不同,说明站点可能做了动态内容裁剪。结果说明:要确认这种差异是有意设计还是模板缺陷,并检查抓取工具使用的User-Agent对应哪个版本。
要查的是渲染依赖的脚本是否稳定执行。在开发者工具Network面板刷新页面,筛选JS请求,观察是否有失败、被阻止或耗时过长的请求。
如果某个脚本失败后正文缺失,说明内容加载依赖该脚本。结果说明:需要评估该脚本是否必须阻塞渲染,以及失败时是否有降级内容。注意,脚本成功执行也不代表抓取工具一定会执行它。
要查的是权限或个性化逻辑是否改变了正文。用无痕窗口和已登录窗口分别访问同一URL,对比正文差异。
如果登录后正文不同,说明内容受用户状态影响。结果说明:要确认抓取工具以未登录状态访问时,看到的是否是完整公开内容;如果核心正文只在登录后出现,公开抓取视角就会缺失。
要查的是同一URL是否被实验分组改写。多次无痕访问同一URL,观察正文是否随机变化;或在代码中搜索实验相关标识。
如果不同访问返回不同正文,说明存在实验分流。结果说明:要确认抓取工具是否被分到某个实验组,以及实验是否影响可索引内容。一次改动前后比较时,还要考虑季节和搜索需求变化,不能只凭单日数据下结论。
把每次检查的结果填进对照表,能减少反复猜测。下面是一个假设示例,用于说明填写方式,不代表真实项目数据。
判断顺序建议是:先确认差异是否存在,再确认差异发生在哪一层,最后才决定改什么。不要因为一个现象就断言唯一原因,例如“抓取不到正文”可能是脚本未执行,也可能是服务端根据User-Agent返回了不同内容。
选一个具体URL,固定设备类型、登录状态和请求方式,分别保存服务器直连、浏览器渲染后和抓取工具视角的正文片段。把三份结果并排放在一起,标出第一处不一致的位置,再回到上面的清单定位对应检查项。这样得到的结论比直接改模板更可靠,也方便在改动后做前后对比。