列表页的分页,是蜘蛛从栏目入口走向深层内容的主要通道之一。它决定了一个栏目里有多少条内容有机会被抓到,也决定了蜘蛛在每个列表页上要花多少时间。围绕分页做处理,本质上是让蜘蛛走得动、也走得值。
分页链接的常见形态
同样是翻页,蜘蛛拿到的路径可能完全不同:
- 路径式:/list/page/2/ 这类地址最容易识别,也便于在日志里按前缀区分。
- 参数式:?page=2 或 ?p=2,可以抓,但要留意参数顺序、大小写和附加参数组合出的近似 URL。
- 按钮式:用井号锚点或纯 JS 绑定点击事件的“下一页”,不产生新的可抓 URL,蜘蛛一般不会跟进。
- 无限滚动:滚动或点击后才出现的内容,如果没有对应的分页地址,后续条目通常只能靠 Sitemap 或详情页内链被发现。
蜘蛛沿分页往下走时会遇到什么
分页不是一条无限延伸的通道,实际抓取中常见的约束有几类:
- 深度衰减:页码越靠后,被访问的频率通常越低。第二、三页还算常客,第二十页之后往往很久才来一次。
- 重复度:列表页之间的标题、摘要高度相似,容易被判断为低价值页面,停留时间随之缩短。
- 抓取预算:一个栏目如果有几百页分页,全部走一遍会占掉相当一部分配额,挤压其他页面的机会。
- 空结果页:翻到超出内容范围的页码,若仍返回 200 的空列表,会白白消耗抓取次数。
让分页既好抓又不失控
- 保留真实链接:翻页用普通超链接指向可访问的 URL,而不是只靠 JavaScript 事件。视觉上仍然可以做成按钮样式。
- 控制可翻页深度:把页码收在一个合理范围,例如只保留最近若干页;更早的内容交给归档页、Sitemap 或站内搜索入口去发现。
- 处理空结果页:超出范围时返回 404 或 410,或者干脆不输出下一页链接;也可以用 noindex 让页面保留在站内但不出现在索引中,不过 noindex 并不能减少抓取。
- 用 canonical 收敛参数噪声:排序、筛选、视图切换等参数组合出的页面,指定规范地址,减少同一批内容被当成几十个页面来抓。
- 详情页回链列表页:在文章底部给出返回栏目、上一篇或下一篇,让蜘蛛从深层页面还能回到主干,不至于停在叶子节点。
无限滚动与“加载更多”
这两种交互对用户体验不错,但对抓取并不友好:内容藏在滚动或点击之后,HTML 里没有对应 URL。折中做法是保留一套可访问的分页地址,把无限滚动当作前端增强;或者在页面中放一个指向查看更多、下一页的常规链接,让蜘蛛有路可走。
关于 rel=next 与 rel=prev:它们曾被用来标记分页序列,后来主流搜索引擎公开说明不再将其作为索引信号使用。保留它们通常没有坏处,但不要指望靠这两个标签解决分页抓取问题,真正的入口仍然是页面里的可点击链接。
怎么验证分页有没有被抓
- 在服务器日志里按路径前缀过滤,看分页地址的请求分布,重点关注最深的页码。
- 观察列表页的响应时间,分页查询如果很慢,蜘蛛的抓取节奏也会被拖累。
- 对比 Sitemap 里提交的详情页数量与实际被抓数量,判断是分页深度不够,还是别的地方卡住了。
分页处理的目标不是让蜘蛛把每一页都抓一遍,而是让它在有限的次数里拿到更值得收录的内容。把可走的路径留给蜘蛛,把重复和空转挡在门外,通常比单纯追求翻得更深更有用。