先给结论:不要用“换个设备看看”当作对照方法。对同一地址在不同设备或登录状态下返回不同内容的情况,正确做法是固定一个抓取身份,把变量逐个分离,先确认差异是服务端返回还是浏览器端渲染造成的,再决定按哪个版本判断收录。下面用一个假设情境把决策过程走完。
假设你负责一个内容站,某个详情页在桌面浏览器里能读到完整正文,在手机浏览器里只显示摘要加一个“展开全文”按钮,未登录时还额外出现一段登录引导。此时你打开搜索引擎的抓取工具,看到的又是第三种结果。三个版本都真实存在,但你不能同时拿它们去判断收录状态。
先做一个动作:用不带登录态的请求访问该地址,保存原始响应体,记录状态码、响应头和正文长度。这个动作的结果决定下一步——如果原始响应体里根本没有完整正文,那么手机端看到的展开内容来自前端脚本,问题在渲染层;如果原始响应体里已有完整正文,只是显示被折叠,那么问题在样式或交互层,收录风险低得多。
同一地址返回不同内容,通常来自以下变量的叠加。对照时一次只放开一个,否则你无法知道是哪一项造成了差异。
固定变量的动作本身会产生一个可复查的结果:同一地址、同一身份、同一设备类型下重复请求两次,若响应体一致,说明差异来自你切换的那个变量;若仍不一致,说明存在缓存或动态注入,需要先处理缓存再谈对照。
确认差异来源后,会面临一个取舍:按服务端原始返回判断收录,还是按浏览器渲染后的结果判断收录。两种做法都成立,但适用条件不同。
按服务端原始返回判断,适用于正文完整出现在 HTML 里的情况。代价是你可能忽略前端脚本补充的关键信息,例如由脚本注入的价格、库存或评论。如果这些信息对页面主题判断重要,只按原始返回就会低估页面实际呈现的内容。
按渲染后结果判断,适用于主体内容依赖脚本生成的情况。代价是对照成本高:你需要保证渲染环境与抓取环境一致,包括是否执行脚本、等待多久、是否带登录态。渲染等待时间不同,得到的 DOM 也可能不同,这时“渲染后结果”本身就不是一个稳定基准。
选择条件可以简化成一句:正文是否在原始响应体中完整可读。可读,就以原始返回为主、渲染结果为辅;不可读,就以渲染结果为主,同时检查脚本是否被 robots.txt 或响应头阻止。需要提醒的是,robots.txt 的抓取限制不等于可靠的索引移除,限制抓取和内容不被索引是两件事,不能互相替代。
回到前面的假设情境,执行下面的对照序列,每步都记录结果:
结果分三种。第一种,第 1 步就命中,说明差异只是显示层,收录判断以原始返回为准即可,后续不必再纠结设备差异。第二种,第 1 步未命中但第 4 步命中,说明内容依赖脚本,此时要确认脚本和接口没有被抓取限制挡住,否则渲染结果只是你本地能看到、抓取方看不到。第三种,第 3 步与第 1 步响应体不同,说明存在按身份分流,需要分别核查每种身份下的模板,不能用一个版本推断另一个版本。
站点地图不保证收录,提交它只是提供发现路径,不能用来证明某个版本已被采用。HTTPS 也不保证页面安全无漏洞或获得更好排名,它不解决内容版本不一致的问题。
对照完成后,复查收录状态应看与内容版本对应的信号,而不是只看“有没有被收录”这一个结论。可以关注:抓取工具返回的 HTML 中是否含主体内容、索引状态描述是否指向你预期的那个版本、以及不同身份请求下响应体是否已收敛为一致。
需要注意,请求量、抓取量或某项统计归零,不能单独证明你的处理正确。它还可能来自抓取预算调整、站点整体抓取频率变化、缓存导致抓取方拿到旧版本,或者抓取方暂时降低了对该路径的访问。把这些替代解释列出来,再结合响应体是否含正文来判断,才不会把统计波动误当成处理生效。
如果最终确认多个版本长期并存,且主体内容确实不同,优先收敛为服务端返回一致内容、显示差异交给样式处理;若业务上必须按设备分流,则要为每个版本分别核查抓取与索引状态,并接受对照成本上升这一代价。