不少人在看蜘蛛池日志时会遇到一种情况:同一个入口页,桌面蜘蛛来过,移动蜘蛛也来过,但两边的抓取结果不一样,有的甚至只有一方能顺着链接继续往下走。问题往往不在蜘蛛池本身,而在入口页对设备与 UA 的处理方式。
同一张页面,为什么会出现两个版本
差异主要来自两处:一是页面内容按设备做了区分输出;二是页面加载后由脚本再补出链接。前者是服务端返回不同的 HTML,后者是返回同一份 HTML,但链接要等脚本执行完才出现。对蜘蛛来说,后者的风险更隐蔽,因为日志里会显示抓取成功,实际能拿到的链接却可能为零。
常见的三种设备处理方式
- 响应式:同一套 URL、同一份 HTML,靠 CSS 适配。对蜘蛛最友好,链接在源码里就能看到。
- 动态服务:同一 URL,服务端按 UA 或屏幕信息返回不同 HTML。省事但容易出错,一旦判断逻辑有偏差,蜘蛛可能拿到空白页或降级版本。
- 独立移动域名:如 m 开头或另用域名。需要额外的互指与跳转关系,链路一长,蜘蛛跟丢的概率就上去了。
蜘蛛池入口页最容易踩的几个坑
- 链接全部由 JS 渲染,且没有服务端兜底。蜘蛛拿到的是空壳,日志好看,URL 发现为零。
- 按 UA 把疑似移动爬虫的请求挡在门外,返回 403 或空页,蜘蛛几次之后就会降低来访。
- 移动端页面只保留导航与广告位,把正文链接放进需要交互才展开的折叠区。
- 桌面与移动两版内容差异过大,一边有链接一边没有,等于把一半抓取机会浪费掉。
- m 站跳转链路过长,中途丢参数,或者最终落到登录页、验证页。
用日志把两个版本对照起来
比较务实的做法是:在访问日志里按 UA 分组,把同一入口页的抓取记录拉出来,对比三件事——返回码是否一致、返回体积是否接近、后续是否有点击其它链接的记录。如果移动蜘蛛的记录明显偏少,或返回体积只有桌面版的三分之一,基本可以判断是适配层出了问题,而不是入口页本身不行。
也可以手动用不同 UA 请求同一 URL,直接看返回的 HTML 里链接是否齐全。这一步比翻统计数据更直接,也更快定位。
给入口页的几点建议
- 链接尽量放在服务端输出的 HTML 里,脚本渲染只做增强,不做唯一来源。
- 移动端不要单独砍掉链接区,折叠可以,但源码里要保留。
- UA 判断只用于体验上的微调,不要用来决定是否输出链接。
- 同一入口页的桌面版与移动版,链接集合尽量保持一致。
- 改动适配方式后,先观察一轮抓取日志,再决定是否扩量。
入口页对蜘蛛的核心价值是能被读到、能被跟下去。设备适配做得再精细,只要链接没进 HTML,对 URL 发现就没什么帮助。