mobile first indexing 怎么查:手机拿到的那一份,才是 Google 留下的那一份
mobile first indexing 的意思是 Google 拿手机版内容去收录和排名。这一章给一套两次抓取的对照流程:同一个地址分别以 Googlebot Smartphone 和 Googlebot Desktop 抓一遍,再比正文长度、结构化数据、robots meta 与图片 alt 四项,附 Google 官方那份七行一致性清单。

mobile first indexing 的意思是 Google 拿手机版那一份内容去收录和排名。所以要检查的不是你屏幕上这一版完不完整,而是手机拿到的那一版有没有少东西。这一章给一套两次抓取的对照流程:同一个地址抓两遍,一遍报 Googlebot Smartphone,一遍报 Googlebot Desktop,再比 Google 自己那份清单点名的四项。一个页面一分钟。
读这篇前你要有什么
一台能跑 curl 的机器,加一个 Python 3 用来做对比。不想开终端的话,AI 爬虫检测 会替你发这些请求并把各家拿到的东西列出来。另外还有一件事决定这一章对你适不适用:如果页面的正文是在浏览器里才组装出来的,那要比的就不是服务器投递的 HTML,这一档整个交给 AI 爬虫拿到空页面。
手机上明明看得见,Google 那边却没有
出海站最常见的报修就是这一句。它其实是三种完全不同的毛病共用了同一个症状,而三种的排查入口不一样。先按下面这张表分一次类,再决定要不要往下读 —— 本篇只解决第一行那一种。
| 症状 | 多半是什么 | 用什么查 |
|---|---|---|
| 手机浏览器打开一切正常,Google 那边就是没有 | 服务器对爬虫 UA 返回了另一份东西 | 本篇的两次抓取对照 |
| 浏览器里有,原始 HTML 里没有 | 正文在浏览器里才组装出来 | 渲染检查,不是本篇 |
| 两次抓取完全一致,还是没被收录 | 和内容投递这一层无关 | 这套流程答不了 |
第一行之所以在出海站上高发,是因为大陆团队在移动端做的那些优化本身没错:首屏要快,就把长文案折进「查看更多」;要省流量,就给小屏另发一套精简模板;国内外访问速度差得远,就在边缘按 UA 分流。三件事单独看都合理,合起来的结果是手机那一份和桌面那一份不再是同一份内容 —— 而 Google 留下的偏偏是手机那一份。
mobile first indexing 是什么时候改完的
迁移已经结束了。Google 在 2024 年 6 月 3 日那篇博客里写:「the small set of sites we've still been crawling with desktop Googlebot will be crawled with mobile Googlebot after July 5, 2024」,以及「After July 5, 2024, we'll crawl and index these sites with only Googlebot Smartphone」(Mobile-indexing-vLast-final-final.doc,2026-09-06 访问)。同一篇把后果写得没有余地:「If your site's content is not accessible at all with a mobile device, it will no longer be indexable.」
迁移完成之后还有两处容易被误读。一是 Googlebot Desktop 并没有下线:「You may still find Googlebot Desktop in your server logs and reporting. For example, among a few other Search features, Googlebot Desktop is sometimes used when crawling for product listings and Google for Jobs.」日志里还能看到它,不代表你的站被落下了。二是这两个爬虫你分不开控制,官方文档写得很直白:「both crawler types obey the same product token (user agent token) in robots.txt, and so you cannot selectively target either Googlebot Smartphone or Googlebot Desktop using robots.txt」(Googlebot,2026-09-06 访问)。
| 爬虫 | 请求占比 | 还在哪儿出现 |
|---|---|---|
| Googlebot Smartphone | 大多数 | 多数站点的收录与排名都用它 |
| Googlebot Desktop | 少数 | 商品信息、Google for Jobs,以及另外少数几个功能 |
Google 只留一份,桌面独有的那块等于没写过
官方那句话很短:「Google uses the mobile version of a site's content, crawled with the smartphone agent, for indexing and ranking」(Mobile-first indexing best practices,2026-09-06 访问)。桌面模板渲染了而手机模板没渲染的那一块,不是一个弱一点的版本,它压根没有到过那份被留下的内容里。
Google 留下的是手机拿到的那一份。只在桌面上存在的那一块,不是信号弱,是根本不存在。
这句话会改掉一句大家随口就说的话。「我们移动端做得薄一点」描述的不是一个次要版本,它描述的就是 Google 手上的全部。同样算在里面的还有:为了首屏体积把 JSON-LD 从手机版的 head 里摘掉;小屏专用的图片组件把 alt 清成空串;两套模板里只有一套吐了 noindex,而没人比对过它们。
Google 要求保持一致的七件事
官方把清单列出来了,条数少到可以逐条手查。下面这张表把每一条官方要求,对上你在两份抓取结果之间要比的东西,再对上出事时它长什么样。
| Google 要求 | 你比什么 | 出事时长这样 |
|---|---|---|
| 内容与桌面版一致 | 两份文件里的可见正文长度 | 手机版只有桌面版的三分之一 |
| 结构化数据一致 | application/ld+json 块的数量 | 桌面三块,手机零块 |
| 图片 alt 文本一致 | 带非空 alt 的 img 数量 | 手机版的 alt 被清空了 |
| 提供高质量图片 | 图片地址与像素尺寸 | 手机版只发缩略图 |
| 正文别等交互后才加载 | 点击之前正文在不在 | 要点一下「查看更多」才出现 |
| robots meta 标签一致 | robots meta 的 content 串 | 桌面可收录,手机是 noindex |
| 让 Google 抓到资源文件 | robots.txt 对 CSS 与 JS 的规则 | 手机版样式表被 disallow 掉 |
有三行值得回到原文看。图片那一行的原话是「Provide high quality images. Don't use images that are too small or have a low resolution.」;懒加载那一行比多数人记得的窄,原话是「Don't lazy-load primary content upon user interaction.」—— 图片随滚动进入视口再加载,不在这句话说的范围里,被点名的是要读者先动手才肯出现的正文。最后一行「Let Google crawl your resources」根本不在页面里面,它要靠读 robots.txt 来查,不是靠比对 HTML。
七行里最容易在出海站上出事的是结构化数据和图片 alt 这两行,原因是它们都不影响肉眼观感。手机版少了一块 JSON-LD,页面看上去和桌面版一模一样;小屏专用的图片组件把 alt 清成空串,视觉上同样没有任何提示。正文长度掉一半会有人发现,这两样不会有人发现,只能靠数出来。robots meta 那一行相反,它罕见,但一旦出现就是全有全无 —— 桌面版可以收录、手机版带着 noindex,Google 留下的是带 noindex 的那一份。它便宜到每次都该比一遍。
动手做:七步,每步都有完成标志
先把一个页面从头到尾跑通,再按模板铺开 —— 每种模板挑一个页面就够,不必全站跑。
- 挑一个真在挣钱的页面:商品页、文档页,或者已经有排名的那篇。开始之前它在普通浏览器里应该返回 HTTP 200。
- 新建一个空目录,在里面干活。两份文件都不小,放一起做完好删。
- 用两条官方原文的 user agent 串把同一个地址抓两遍,记得跟随跳转。看到磁盘上躺着两个非空文件,这一步就算完成。
- 先比可见正文长度。它最粗,但也最能抓住最大的那种事故;两个数字差在百分之几以内算过。
- 数两份文件里的结构化数据块。数量相同就算过,两边都是零也算过。
- 把两份的 robots meta 标签读出来。两串一模一样算过,两边都没有这个标签同样算过。
- 数两份里带非空 alt 的图片。两个比值要一致,分母也要一致。
整块命令,直接复制走
整块复制。它会存下两个文件,然后打四行结果,每行最后一列写 same 或 DIFFERENT。写着 DIFFERENT 的那几行才是你要看的。
# 1. 两条 user agent 串,逐字抄自官方文档。
# W.X.Y.Z 是 Google 自己留的 Chrome 版本占位符,原样留着即可。
UA_M='Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.X.Y.Z Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
UA_D='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/W.X.Y.Z Safari/537.36'
URL='https://example.com/你要查的那个页面'
# 2. 同一个地址抓两遍。-L 跟随跳转,跳到独立移动站也能跟过去。
curl -sSL -A "$UA_M" "$URL" -o mobile.html
curl -sSL -A "$UA_D" "$URL" -o desktop.html
# 3. 比官方清单点名的那四项。
python3 - <<'PY'
import re
def read(p): return open(p, encoding='utf-8', errors='replace').read()
def text(h):
h = re.sub(r'(?is)<(script|style|noscript|template)\b.*?</\1>', ' ', h)
h = re.sub(r'(?s)<!--.*?-->', ' ', h)
return len(re.sub(r'\s+', ' ', re.sub(r'(?s)<[^>]+>', ' ', h)).strip())
def ldjson(h): return len(re.findall(r'(?i)application/ld\+json', h))
def robots(h):
m = re.search(r'(?is)<meta[^>]+name=.robots.[^>]*content=.([^"\']*)', h)
return m.group(1).strip() if m else '(none)'
def alts(h):
t = re.findall(r'(?is)<img\b[^>]*>', h)
return '%d of %d' % (sum(1 for x in t if re.search(r'(?is)alt=.[^"\'>]', x)), len(t))
m, d = read('mobile.html'), read('desktop.html')
for name, fn in [('visible text chars', text), ('ld+json blocks', ldjson),
('robots meta', robots), ('img with alt', alts)]:
a, b = fn(m), fn(d)
print('%-19s %-26s %-26s %s' % (name, a, b, 'same' if a == b else 'DIFFERENT'))
PY
# 通过的时候长这样。astro.build,2026-09-06 实跑:
# visible text chars 6761 6761 same
# ld+json blocks 0 0 same
# robots meta max-image-preview:large max-image-preview:large same
# img with alt 34 of 43 34 of 43 same
末尾那四行注释是 2026-09-06 对一个站实跑一次的结果,它只证明这套命令能跑通、通过的时候是什么样子。它不是调研,也说明不了任何别的站的情况。你自己跑出来的数字才算数。
跑出四行 same 之后,把这两个文件留一份存档,日期写进文件名。下一次改完模板再跑一遍,你比的就不只是手机版和桌面版,还有改动前后 —— 移动端的内容缺失几乎都是某次「优化首屏」带进来的,而那种改动上线时没有人会想到它跟收录有关。存一份基线,成本是两个文件。
这套流程答不了的三件事
三条边界,第三条最容易被当成诊断结论。
- 拿 Googlebot Smartphone 的 user agent 串去抓,不等于被 Googlebot 抓过。它证明的是你的服务器面对这个字符串返回了什么,是关于你服务器的事实,不是关于 Google 渲染结果的事实。谁都能发这个字符串。反过来确认某次请求真的来自 Google,是另一套做法,在 googlebot ip 怎么查。
- 这段命令不执行 JavaScript,它比的是服务器投递的 HTML,不是渲染完的页面。正文在浏览器里才组装的站,两边会同时少报同样多的东西,四行全绿却什么也没告诉你 —— 那种情况要换成渲染检查。
- 查出差异不等于查出了掉排名的原因。这套流程只能告诉你两份响应之间存在差异,这个差异有没有代价它答不了。把一行红当成流量下滑的解释,很可能让你去重写一个从头到尾都没出过问题的模板。
三种会把结果读错的情况
三种都会给你一张看着很干净的表,而那张表描述的不是你以为的东西。
- 你比的是跳转,不是页面。去掉
-L,curl 存下来的是跳转响应体 —— 常常只有几十个字符。正文长度那一行报出来的差异,于是和你的内容毫无关系,或者是两个空文件之间的「一致」。 - 回你话的是边缘的拦截规则,不是你的站。有些配置会对一切自称爬虫的请求返回一个挑战页。两份文件都很小、还很像,表格报出一致,而这份一致是两个都不是你页面的页面之间的一致。信任任何一行之前,先把文件打开看一眼。
- 页面比被抓走的那部分还大。官方写明「Googlebot crawls the first 2MB of a supported file type」。两套模板完全可以在这条界线之后保持一致,所以在体量很重的页面上,两个数字对上了,说服力比它看起来的要弱。
常见问题
有没有 mobile first indexing checker 这种工具
上面那块命令就是一个,而且它对任何页面都能跑,不需要账号。这种场景下一个只给状态的工具反而不如一个差异表 —— 你要的答案不是通过或不通过,而是七行里哪一行动了,好知道该去开哪一套模板。
日志里还有 Googlebot Desktop,是不是我的站没迁完
不是。官方明说迁移之后你仍然可能在服务器日志和报表里看到它,并且举了商品信息和 Google for Jobs 两个例子,另外还有少数几个功能。看到它属于正常,不代表你被排除在外。
能不能只放 Googlebot Smartphone 进来、把 Googlebot Desktop 挡掉
不能。两者在 robots.txt 里认的是同一个 product token,给其中一个写的规则对另一个同样生效。想让两者行为不同,robots.txt 不是那个能做到的文件。
我们移动端就是故意少放一些字,这算问题吗
这正是官方那句话针对的情况:「Make sure that your mobile site contains the same content as your desktop site.」把文字折进折叠面板是排版决定,字还在 HTML 里;小屏上直接渲染一段更短的文案是内容决定,而被收录的就是那段更短的。
mobile first indexing best practices 归结起来是什么
手机版和桌面版的内容一致,再加两件不算内容的事:robots meta 标签一致,以及资源文件允许 Google 抓。上面那张七行表就是官方清单,只是按最好查的顺序排了一遍。
本文属于 QueryWin 实操手册 · 第 2 阶


