在蜘蛛池里,入口页通常承担两件事:一是自己能被蜘蛛抓到,二是把蜘蛛引向更多 URL。列表页和分页链是第二件事的主力——一个入口页放上一组翻页链接,理论上就能把成百上千个 URL 铺出去。但实际运营中,分页也是最容易失控的地方:翻页参数无限增长、每页链接堆得太密、翻到几十页之后没有任何收敛,结果抓取预算被消耗在一堆低价值页面上。
先明确分页在蜘蛛池里的角色
分页页本身不是最终目标,它更像一条通道。你需要想清楚三件事:每一条通道通向哪里、一共允许多少条通道、蜘蛛走完通道之后能不能落到有价值的页面。如果分页链接指向的还是分页,或者翻到第 20 页之后内容已经高度重复,那这些 URL 被发现的边际收益就很低。
一个常见的判断标准是:如果某个分页 URL 上的列表项,和前一页、后一页几乎没有差异,那它就属于可收敛的部分,不必每一页都做成独立可抓的地址。
翻页形态:选可被抓取的那种
常见的翻页实现有几种,对蜘蛛的友好度差别很大。
- 静态页码链接:/list/2/、/list/3/ 这类写进 HTML 的地址,最容易被发现和跟踪。
- 参数分页:/list?page=2 也能被抓,但要注意参数不要叠加出无穷组合,比如同时带排序、筛选、时间范围,URL 会迅速膨胀。
- 按钮式加载更多:如果按钮背后是 AJAX,且在原始 HTML 里没有对应的链接,蜘蛛往往看不到后续内容。
- 无限滚动:对访客体验好,但对 URL 发现基本没有帮助,除非你有额外的静态分页地址作为兜底。
如果站点必须用 JS 加载,至少要在 HTML 里保留一组可点击、可跟踪的翻页链接,让蜘蛛顺着链接走到后面的页面。
每页放多少条链接
列表页每条链接都会消耗一点抓取注意力。把 200 条链接塞进一页,和分成 10 页每页 20 条,最终被发现的 URL 数量可能差不多,但后者对服务器更友好,也更接近正常站点的形态。
比较稳妥的做法是:列表页每条目控制在几十条以内,翻页数量设置一个上限。超过上限的历史内容,可以用归档页、标签页或者站点地图的方式单独处理,而不是让它继续挂在翻页链末尾。
分页链的深度怎么收敛
蜘蛛顺着翻页往下走,深度越深,到达的概率越低。一个实用的做法是控制三层结构:
- 入口页指向若干个列表首页;
- 列表首页通过翻页链指向后续分页;
- 分页里的条目指向目标详情页。
到了第四层、第五层,收益通常已经很小。如果你发现日志里深层分页几乎没有被抓过,说明这条链路的实际有效性有限,与其继续加深,不如把资源转到更靠前的页面上。
分页页的规范化与去重
同一份列表内容往往会通过多条路径到达:默认排序、按时间排序、带筛选参数的版本。这些地址如果都返回 200 且内容相近,很容易形成重复页面。处理方式上有两个方向:
- 能合并的,用 canonical 指向主分页地址;
- 不打算被单独抓取的筛选组合,用 robots.txt 或 meta robots 挡掉,而不是让它自由扩散。
需要注意,被挡掉的 URL 仍然可能出现在外链或历史记录里,只是不参与抓取。挡与不挡要按页面价值来定,不要一刀切。
用日志验证翻页链是否真的生效
设计完不代表蜘蛛就会照做。打开访问日志,看几个指标:
- 分页 URL 有没有被请求过,请求频率是否集中在最前面几页;
- 翻页请求返回的状态码是不是 200,有没有大面积的重定向;
- 从分页页出发的详情页,是否也有对应的抓取记录。
如果只看到入口页被反复抓取,分页却几乎没人访问,多半是链接没写进 HTML、被 robots 挡了,或者翻页地址本身不可访问。
分页链的价值不在于铺得多,而在于蜘蛛愿意顺着走下去,并且走到的页面值得看。数量堆到一定程度之后,真正决定效果的是结构与稳定性,而不是页数。
几个容易踩的坑
- 翻页参数里带上会话 ID 或时间戳,导致每次生成的 URL 都不一样;
- 分页链接用 JS 拼接,原始 HTML 里完全没有锚点;
- 列表页只放标题文字,链接本身是空的或指向首页;
- 翻页页数没有上限,蜘蛛一直能翻到更深的空页面;
- 分页被设成 noindex 的同时,又指望它传递 URL,逻辑上自相矛盾。
把这几处理顺之后,再去观察抓取记录的变化,通常比单纯增加入口页数量更有意义。