检查移动端与桌面端的robots.txt规则差异,核心不是看文件有没有两份,而是看同一份文件里,不同User-agent分组是否对移动爬虫和桌面爬虫给出了不同指令。如果移动爬虫使用的User-agent名称没有单独分组,它就会落到通配符User-agent: *分组,此时移动端与桌面端规则一致;如果存在独立分组,就必须逐条比对Allow与Disallow,并确认移动爬虫实际命中的是哪一组。
不是所有站点都存在差异。以下条件会提高分端检查的必要性:
/m/或独立子域。如果站点只有一份静态robots.txt,且只写了User-agent: *一个分组,那么移动端和桌面端读到的规则内容相同,差异风险主要来自路径本身是否被禁止,而不是来自端差异。这种情况下优先检查规则是否误封移动路径,而不是花时间做逐端比对。
直接打开robots.txt只能看到一份内容,无法反映动态返回的情况。可行的做法是发送带指定User-agent的请求,观察返回正文。假设你的站点对移动爬虫有单独分组,可以用命令行工具模拟,例如:
curl -A "Googlebot" https://example.com/robots.txt
curl -A "Googlebot-Image" https://example.com/robots.txt
把User-agent换成你关心的移动爬虫名称,对比两次返回的正文。判断结果分三种:
注意,User-agent字符串是爬虫自我声明的,不能仅凭字符串就认定对方身份。这里的目的是复现规则匹配结果,不是验证访问者真伪。
robots.txt的匹配规则是:爬虫先找与自己User-agent名称最匹配的分组,匹配到后就不再读取其他分组。因此检查差异时,重点不是“文件里有哪些Disallow”,而是“移动爬虫会命中哪一组”。
假设文件内容如下(示例为假设场景):
User-agent: * 下 Disallow: /searchUser-agent: MobileBot 下 Disallow: /如果移动爬虫名称确实是MobileBot,它会命中第二组,整个站点被禁止抓取;桌面爬虫命中第一组,只禁止了/search。这就是典型的端差异,而且后果严重。反过来,如果移动爬虫名称不在文件中出现,它会落到User-agent: *,与桌面端一致。
比对清单可以按这个顺序执行:
Disallow: /这类全站禁止,以及是否被更具体的Allow覆盖。如果只能做一件事,先检查移动爬虫命中的分组里有没有全站级禁止或关键路径禁止。原因是一旦移动爬虫被整体屏蔽,移动端页面无法被抓取,后续的索引和展现都无从谈起,修复代价远高于逐条规则微调。相比之下,某一条次要路径的Allow差异影响范围小,可以排后处理。
判断依据可以简化为两个问题:移动爬虫命中的分组是否禁止了整站或主要目录;移动端与桌面端的内容是否依赖同一批可抓取资源。两个答案都是“是”,就优先修这一项。如果移动爬虫根本没有独立分组,那么端差异不存在,把时间转向检查路径规则是否误封移动资源更划算。
robots.txt的抓取限制不等于可靠的索引移除。即使你在规则里禁止了某个路径,已经收录的页面仍可能出现在结果中,移除需要配合其他方式。另外,站点地图不保证收录,HTTPS也不保证安全无漏洞或排名。检查端差异解决的是“爬虫能不能抓”的问题,不要把它当成收录或排名的保证。
下一步:用你实际关心的移动爬虫User-agent名称,对生产环境的robots.txt发送一次请求,把返回正文与桌面爬虫的返回正文并排保存,然后按上面的分组比对清单逐条核对。发现全站级禁止时,先修复再考虑其他优化。