蜘蛛池知识

蜘蛛池入口页的移动端适配:爬虫用手机 UA 来抓时,你给它看了什么

搜索爬虫越来越多以移动 UA 抓取页面。入口页如果只做了桌面版,或者移动版被砍掉了关键链接,抓取效率会直接打折。本文讲清响应式、独立 m 域、UA 动态返回三种做法的差别与坑位,并给出几个可以自己动手的检查方法。

蜘蛛池知识

蜘蛛池入口页的移动端适配:爬虫用手机 UA 来抓时,你给它看了什么

移动优先不是只影响排名

很多人把移动优先理解成“排名层面的事”,其实更靠前的一层是抓取。现在主流搜索爬虫在抓取和渲染时,默认使用的 UA 大多偏向移动设备,渲染视口也按手机来。也就是说,你的入口页在爬虫眼里,很可能压根不是你在电脑上看到的那个样子。

对蜘蛛池来说这影响很直接:入口页的作用是让爬虫顺着链接往下走,如果爬虫拿到的移动版里把链接砍了、把正文换成了图片、或者干脆跳到一个抓不到的地方,那这个入口页在池子里的价值就打了对折。

爬虫实际看到的是哪个版本

入口页的移动端实现方式不同,爬虫拿到的 HTML 也不同。常见的三种做法,差别不小。

响应式布局

一套 HTML,靠 CSS 适配不同宽度。这是最省事也最稳的做法:链接、文本、结构在桌面和移动端都是同一份,爬虫抓到的就是完整内容。需要留意的是别用 display:none 把一整块导航或链接列表在窄屏下藏起来——部分渲染引擎会按计算后的样式判断可见性,藏起来的链接可能就不算数了。

独立 m 域

比如 m.example.com,通过跳转或 UA 判断把手机访客导过去。这里最容易出问题的是跳转本身:如果入口页做的是 JS 跳转,或者服务端对移动 UA 返回 302 到 m 域,而 m 域又不可访问、又被 robots 挡住、或者需要额外的 cookie 才能渲染,爬虫就可能卡在第一步。另外要保证桌面版和移动版之间的互相指向关系明确,别让爬虫发现两个版本内容对不上。

按 UA 动态返回不同 HTML

同一个 URL,判断 UA 后返回不同模板。这种做法灵活,但风险在于“返回的差异太大”。如果移动返回的 HTML 里只剩几条链接甚至空空如也,而桌面版内容丰富,就有伪装嫌疑,抓取端可能直接降低对这个 URL 的信任。真要这么做,至少保证两边的主体内容、标题层级和链接集合基本一致。

入口页最容易踩的几个坑

  • 移动版把链接列表砍了。桌面版底部有几十条链接,移动版折进“查看更多”里,而那个按钮是 JS 加载的。爬虫不点按钮,链接就等于不存在。
  • 正文换成图片。移动端为了排版把一段文字做成图,爬虫读到的是空节点。
  • 首屏全屏遮罩或弹窗。订阅弹窗、App 下载引导盖住内容,渲染时正文被判定为不可见。
  • 字体和视口问题导致排版错乱。不加 viewport meta 时,移动渲染宽度按默认处理,元素可能被挤到布局外。
  • m 域和主域状态码不一致。主域 200,m 域 404 或者 503,爬虫拿到的就是一个死入口。

可以自己动手的检查方法

  1. 用移动端 UA 抓一次入口页(命令行 curl 加上手机 UA 头即可),把返回的 HTML 存下来。
  2. 对比桌面 UA 抓到的 HTML,看链接数量和正文文本量差多少。差得离谱就要改。
  3. 把返回的 HTML 渲染一遍(浏览器手机模式即可),看首屏有没有遮罩、链接能不能点到。
  4. 检查移动版本里目标链接是否还在,锚文本是否和桌面版一致。
  5. 确认 robots 没有误伤 m 域或移动版路径。
  6. 如果用了跳转,手动跟一遍完整链路,看最后落地的页面是不是可抓取、可渲染的。

几个使用建议

如果入口页是你自己可控的模板,优先选响应式,一套 HTML 走到底,省去大量对齐工作。如果因为历史原因已经有 m 域,至少保证两边内容一致、链接一致、状态码正常,跳转用服务端 301 而不是 JS 或 meta 兜底。

另外别把移动端当成“简化版”。入口页的核心任务是让爬虫发现并沿着链接走下去,链接和文本是它的资产,不是可以为了美观删掉的东西。手机上排版可以更紧凑,但结构不要缺胳膊少腿。

判断一个入口页的移动端做得行不行,有个很土但有效的标准:用手机 UA 抓下来,把标签去掉只留文字和链接,如果剩下的东西还够看懂这页在讲什么、还找得到要推的目标链接,那基本就合格了。

移动端适配不是什么高深技术,它更像是入口页的基本卫生。池子规模一旦上去,每个入口页都因为移动版少了几条链接,累积起来的抓取损失是实打实的。花半小时统一模板,比事后一个个排查划算得多。