不少站点会同时维护移动版和桌面版,或者用同一个 URL 返回两套 HTML。蜘蛛来的时候只带一个 UA,它看到的是其中一版。搞清楚它默认抓哪一版、站内链接又该指向哪一版,能省掉很多“明明有内容却抓不到”的麻烦。
蜘蛛默认带着移动 UA 来敲门
Google 已经切换到移动优先索引,主要抓取身份是智能手机 UA(Googlebot Smartphone),桌面 UA 的抓取占比在下降。Bing 也推出过类似的移动优先策略。这意味着:如果移动版内容比桌面版少、被 robots 挡住,或者干脆返回错误,蜘蛛看到的就是这个残缺版本。
所以判断标准不是“桌面用户看到什么”,而是“移动 UA 请求时服务器返回了什么”。
三种移动化方案,抓取表现不一样
响应式设计:最省事的一种
同一套 URL、同一份 HTML,靠 CSS 适配屏幕。蜘蛛无论带哪个 UA 拿到的都是同一份内容,不存在版本选择的问题,也最不容易出错。
动态服务:同一个 URL 返回不同 HTML
服务器根据 UA 判断设备类型,返回不同的 HTML。这里的关键是让缓存层知道响应随 UA 变化,否则 CDN 可能把桌面版缓存下来返回给移动蜘蛛,或者反过来。响应头里的 Vary: User-Agent 是常见做法,但很多 CDN 默认不按它区分缓存键,需要额外配置。
另外,两个版本的正文、内链和结构化数据应保持一致,只改排版相关的部分。
独立移动 URL:最容易出岔子
m.example.com 或 /m/ 这类独立地址,需要成对的标注:移动页用 link rel="canonical" 指向桌面版(或配合 alternate 指向自身),桌面页用 link rel="alternate" media="only screen and (max-width: 640px)" 指向移动页。两个方向只写一边、或者互相指错,蜘蛛就容易在两套地址之间反复横跳,把抓取预算花在确认版本上。
几个常见的走错路场景
- 移动版 robots.txt 禁止抓取 CSS、JS 或某些目录,导致移动版被判为内容稀疏。
- 移动版缺少桌面版上的正文、内链或分页入口,蜘蛛顺着移动版爬不到深层页面。
- 移动版返回 5xx 或长时间超时,桌面版正常,抓取统计里一半是失败。
- UA 识别写得太粗,把 Googlebot Smartphone 当成普通手机用户,重定向到精简页面或 App 下载页。
- 站内链接一部分指向桌面版、一部分指向移动版,两套地址都在消耗抓取量。
内链和 Sitemap 应该指向哪一版
原则是只暴露一个规范版本。如果采用独立移动地址,站内链接最好统一指向桌面版(或统一指向移动版),再用 alternate 与 canonical 声明对应关系,而不是让两种链接混在同一个页面里。Sitemap 里同样只放规范版本,不必把 m 站地址再列一遍。
导航、面包屑、分页、相关推荐这些承担爬取路径的模块,两个版本要么内容一致,要么至少保证移动版也能走通同一条路径,别让蜘蛛在移动版上走进断头路。
怎么自查
- 用移动 UA 和桌面 UA 分别请求同一个 URL,对比返回的 HTML,看正文、内链、canonical 是否一致。
- 在服务器日志里按 UA 分组,看移动蜘蛛的抓取量、状态码分布,以及失败集中在哪些目录。
- 检查 CDN 缓存是否按 UA 区分,避免不同节点返回不同版本。
- 确认移动版没有在 robots.txt、meta robots 或登录墙后面被挡住。
移动优先不是“再做一个手机站”,而是让蜘蛛在移动身份下,看到和桌面等价的内容与链接。
把这两件事对齐之后,剩下的抓取问题通常就回到常规的内链、Sitemap 和服务器响应上了。