排查内容加载差异,最容易犯的错是只盯着“页面能不能打开”。在时间和人手有限时,更有效的做法是先把差异缩小到具体来源:是服务器返回的HTML不同,是浏览器执行脚本后不同,还是搜索引擎拿到的那份内容不同。只有先分清差异发生在哪一层,后面的处理顺序才不会浪费。
很多人用浏览器打开页面,看到正文完整,就认为搜索引擎抓取时也一样。但浏览器展示的是最终渲染结果,中间可能经过脚本注入、接口请求、懒加载、地区判断或登录状态判断。搜索引擎抓取时拿到的可能是原始HTML,也可能经过渲染,但两者并不总是同一份内容。于是会出现“用户看得到、抓取结果里没有”或“两个入口显示不同”的情况。
判断时不要先猜原因,先做对照:用同一设备、同一网络、未登录状态分别查看页面源代码和渲染后的DOM。如果源代码里没有目标正文,而DOM里有,差异可能来自客户端渲染;如果两者都有但文本不同,差异可能来自接口或模板条件;如果两者都缺,问题更可能在服务端输出或抓取权限。
人手有限时,优先处理影响面大、验证成本低的问题。可以按下面顺序安排:
如果只有某个栏目出问题,先查该栏目的模板和数据源;如果全站都出问题,再查公共脚本、CDN缓存或服务端渲染开关。这样安排的好处是,一次改动可以覆盖更多页面,而不是逐页修补。
下面这组检查项可以直接执行,不需要复杂工具:
判断结果时注意:源代码中有正文,不代表渲染后一定相同;渲染后有正文,也不代表抓取时一定执行了脚本。若正文只出现在接口响应里,而原始HTML为空,就要考虑渲染依赖是否稳定。若不同设备返回不同正文,要判断这种差异是否属于合理适配,还是把主要内容藏在了某一端。
如果确认差异来自客户端渲染,且希望抓取端稳定获得正文,可以考虑服务端渲染或预渲染,但前提是页面内容确实需要被索引,且维护成本可接受。如果差异来自地区或登录状态,先区分哪些内容应对所有访问者一致,哪些内容可以个性化;对需要索引的正文,尽量让未登录、无特殊参数的请求也能获得完整内容。
如果差异来自缓存,先确认缓存键是否包含设备、语言或登录状态。缓存键过粗,可能把移动端页面返回给桌面端;缓存键过细,又可能增加回源压力。处理时要结合流量规模和更新频率,不能只看一次测试结果。
比较改动前后时,还要考虑季节、搜索需求变化和数据采集差异。例如同一页面在活动期和非活动期,正文本来就可能不同;抓取频率变化也会让样本不具可比性。因此,判断改动是否有效,应尽量固定测试页面、测试时间和对照页面,而不是只看某一天的总量。
接下来可以列出最近需要处理的页面,按“模板—URL示例—原始HTML是否有正文—渲染后是否有正文—是否依赖登录或参数”五列记录。填完后再决定先修模板、先修接口,还是先调整缓存规则。这样能把有限的时间用在影响面最大的差异上,也能避免把正常个性化误判为故障。