先以未登录、无个性化痕迹的访客视角抓取一份原始响应,再分别用登录态和移动设备访问同一地址,把三份响应并排比较。差异集中在服务端返回的HTML正文,而不是浏览器渲染后的界面,才需要进入下一步处理;如果只是脚本注入或缓存造成的显示差异,处理方式完全不同。
选一个你真正关心的地址,用命令行工具请求一次,保存状态码、响应头和正文。命令可以写成 curl -sS -D headers.txt -o body.html "https://example.com/page",其中 -D 保存响应头,-o 保存正文。这一步的关键是关闭 Cookie 和登录态,让请求尽可能接近普通访客。
把 body.html 当作基准。后续所有比较都以它为参照,而不是以你在浏览器里看到的样子为参照。浏览器开发者工具的“查看源代码”和“元素”面板经常不一致,前者更接近服务端实际返回的内容,后者包含脚本执行后的结果。
如果基准响应本身已经是空的、跳转到登录页或返回验证页,那么问题不在于设备差异,而在于这个地址对匿名访客本来就不开放。这种情况下先确认该地址是否应该公开,再谈其他对照。
同一地址在不同设备上返回不同内容,常见来源有三类,处理动作各不相同:
Vary: User-Agent,正文结构明显不同。需要判断这是有意的移动适配,还是旧系统遗留的判断逻辑。Age、X-Cache 一类字段。需要先确认缓存键是否包含设备维度。判断方法很简单:把三份响应的正文做文本对比。如果正文主体一致,只有样式或脚本不同,问题在渲染层;如果正文主体不同,问题在服务端或缓存层。
登录后看到的内容和未登录看到的内容不一致,有两种性质完全不同的情况。一种是同一篇内容增加了编辑按钮、草稿状态或个性化推荐,主体信息不变;另一种是登录后才解锁正文,未登录只看到摘要或提示。
对前一种,公开版本仍然是完整的,收录判断以未登录版本为准即可。对后一种,需要明确这个地址是否打算让搜索引擎看到完整内容。如果打算,就要让未登录请求也能拿到主体正文;如果不打算,就不要期待它在公开搜索结果里有完整呈现。
这里有一个容易踩的坑:用登录态访问看到内容正常,就认为页面没问题。实际抓取通常不带你的登录凭证,看到的可能是另一套结果。所以对照时必须把未登录响应单独保存,不能只凭登录后的印象下结论。
假设你手上有一个旧产品页,未登录访问返回的是“该产品已下线”提示,登录后作为内部账号仍能看到历史资料。这个地址已经不适合作为公开内容保留,但历史资料还有内部参考价值。可以按下面的顺序处理:
robots.txt 的抓取限制不等于可靠的索引移除,已经进入索引的地址仍可能出现在结果里,必要时配合页面级的移除手段处理。这个动作的结果会直接影响下一步:如果原地址返回 301 且目标页面可正常访问,后续观察重点放在目标页面的抓取和收录状态;如果原地址返回 410,后续重点变成确认它是否从公开结果中逐步消失,而不是继续为它补内容。
设备或登录态差异有时会被误读成收录问题。以下几种解释需要先排除:
把这些误判排除之后,你面对的才是真正的设备或登录态分流问题。此时再决定是统一返回内容、按设备做合理适配,还是让旧地址有序退出,依据都会比只看浏览器界面时充分得多。