在站点的抓取路径里,列表页往往承担中转站的角色。首页或栏目页把蜘蛛送进列表,列表再把它分发给详情页。问题在于,列表通常不会只有一页,分页链接的写法直接决定了蜘蛛能不能继续往下走,以及能走多远。
分页链接要真的能被跟着走
很多站点把下一页做成按钮,用 JS 动态拼接 URL,或者只在点击时发起请求。视觉上没问题,但蜘蛛拿到的 HTML 里可能只有一个空容器。想让分页进入抓取路径,最简单的方式是保留可点击的 a 标签,href 指向真实 URL。即使同时用 JS 增强,鼠标点击与蜘蛛跟进也不冲突。
常见写法有 /list?page=2、/list/page/2/、/list/2/ 等,都可以,关键是全站保持一致,不要让同一份内容在多种形态之间来回跳。如果分页 URL 里混入会话 ID 或时间戳,每次抓到都像新地址,反而会让蜘蛛反复走同一段路。
rel=next/prev 与 canonical 的常见误用
rel=next/prev 曾经被用来标记分页序列,后来主流搜索引擎不再把它当作强信号,但它本身不影响链接可抓。真正容易出问题的是 canonical:有人为了集中权重,把所有分页的 canonical 都指向第一页,这会让蜘蛛倾向于认为后续页只是第一页的重复版本,抓取价值降低。更稳妥的做法是让每个分页自指 canonical,或者至少不要强行指向第一页。
如果分页内容确实与第一页高度重复,可以考虑用合理的标题与描述做出区分,而不是靠 canonical 掩盖。分页的每一页都应该有自己的位置,而不是被当作第一页的影子。
往下走多远:分页深度与抓取预算
分页是线性延伸的路径:第一页有第二页链接,第二页有第三页链接。路径本身不复杂,但页数一多,蜘蛛要走的步数会明显增加。如果每页还挂着筛选、排序、时间范围等参数,链接组合会快速膨胀,把本来有限的时间消耗在相似列表上。
常见的收敛方法:
- 限制分页层数,超过一定页数后改用归档或按时间切分;
- 过滤无意义的排序参数,只保留有独立价值的入口;
- 筛选结果是否产出可抓链接,按业务价值决定,必要时用 noindex;
- 列表页不要输出大量重复的推荐位链接,减少路径分岔。
无限滚动与加载更多怎么留后路
无限滚动对用户体验友好,但对 URL 发现不友好。如果只靠滚动触发接口,蜘蛛拿不到后续 URL。比较实用的折中方案是:
- 第一屏仍然返回可抓的分页链接,作为兜底;
- 滚动加载的接口返回真实详情页 URL,并确保这些 URL 能从别处被发现;
- 加载更多按钮最好是一个带 href 的链接,JS 只做拦截增强;
- 移动端与桌面端保持同一套 URL,不要额外生成一套仅供爬虫使用的地址。
这些做法不会让蜘蛛一次抓完所有内容,但能让它有一个稳定的入口,逐步把新链接纳入队列。
服务器响应与分页抓取的节奏
分页请求往往比详情页更密集,因为蜘蛛需要在较短时间内连续取多个页面。如果服务器响应慢,或者每页都触发复杂的数据库查询,抓取队列会越排越长,蜘蛛可能降低对本站的访问频率。给列表页做缓存、控制每页输出条数、避免一次查询拉取全部数据,都是比较直接的做法。稳定性比偶尔的一次快速响应更重要。
上线前后的检查清单
- 分页链接是否为可抓的 a 标签,href 指向真实 URL;
- 分页 URL 是否稳定,不随会话或时间戳变化;
- canonical 是否误指第一页;
- 是否存在参数组合导致的无限路径;
- 列表页响应时间是否稳定,是否有缓存;
- 分页内容是否与第一页有足够差异。
分页看起来只是列表的延伸,但它决定了蜘蛛能走多深、走多快。把分页链接做成蜘蛛能理解、能连续跟进的路径,通常比事后调整更容易。
抓取路径不是越深越好,而是每一步都有明确的下一站。