列表页翻到第几页,往往决定了长尾内容能不能被看见。分页看起来只是“上一页、下一页”两个按钮,真正做起来却容易变成两套逻辑:用户看到的是下拉加载和无限滚动,爬虫拿到的只有一个空壳;或者翻页入口全靠脚本在点击时才生成,HTML 里找不到任何可以跟随的地址。
分页常见的几个坑
- 翻页链接写在按钮的点击事件里,页面源码中没有任何可点击的链接。
- 分页参数不统一,page、p、start、offset 混着用,同一批内容出现好几套入口地址。
- “加载更多”把后续内容注入当前页,但地址栏始终停在第 1 页。
- 翻到最后一页之后还能继续翻,返回空列表却仍然是 200 状态码。
- 所有分页页面的标题和描述与第一页完全相同。
自查可以从这几步开始
1. 关掉脚本再看一遍
用禁用脚本的方式打开列表页,看看能不能顺着链接走到第 2 页、第 3 页。如果关掉脚本之后翻页入口全部消失,说明分页对爬虫来说等于不存在。做法通常是给“下一页”保留一个真实的链接,脚本只负责增强体验,不负责提供唯一入口。
2. 确定一套分页参数
同一套列表只用一种参数格式,路径式分页或查询参数式分页都可以,关键是别混用。混用之后,同一批内容会被拆成多套地址,爬虫要在里面做取舍,你也很难判断哪些入口该留、哪些该收。
3. “加载更多”要有可抓取的备选
无限滚动和“加载更多”对浏览体验友好,但如果后续内容只能通过点击加载,且地址从不变化,那这些内容就只能依赖第一页的链接被发现。常见做法是保留真实的分页地址作为兜底,滚动加载只当作前端增强。
4. 想清楚分页页要不要收录
分页页通常不是用户搜索的终点,但也不是必须屏蔽的内容。可以让它们被正常抓取、正常返回 200,同时把标题写成“栏目名 + 第 N 页”这种能区分的形式,避免所有分页共用一套标题。至于 rel=prev/next 这类分页提示标记,主流搜索引擎已经不再把它当作索引信号,写不写影响有限,别指望靠它解决重复内容问题。
5. 末页要收口
最后一页不要再给出“下一页”的链接,避免形成无限翻页。翻过末尾之后返回空列表的地址,最好是明确报错或跳回第一页,而不是稳稳地返回 200 的空页面。空页面能返回 200,蜘蛛就有理由继续跟着参数一路翻下去。
6. 分页要和站点地图、内链配合
分页页一般不需要进 XML 站点地图,但列表页本身要能被导航或栏目内链找到。如果第 2 页之后的内容只能靠“下一页”链条到达,一旦中间某页出问题,后面几页就可能长期得不到抓取。
一个简单的检查顺序
- 禁用脚本,看能否从第 1 页走到第 3 页。
- 查看翻页链接的实际地址,确认参数格式统一。
- 检查第 2 页及之后的标题、描述是否与第一页重复。
- 翻到末页,确认不再输出“下一页”,空结果不返回 200。
- 在服务器日志里看分页地址的抓取情况,是否只在第一页打转。
分页做得好不好,标准其实很朴素:用户能顺畅翻,爬虫也能顺着链接翻。两边都不丢,才算把列表页的入口和出口都留住了。
如果站点规模不大,分页问题通常不会立刻显现;等到栏目内容积累到几百上千条,第一页之外的页面能不能被稳定发现,才会真正影响长尾内容的曝光。与其等抓取异常了再回头查,不如在栏目上线时就把翻页入口、参数格式和末页处理一次性定好。