列表页通常是蜘蛛发现详情页的主要通道。但翻页机制怎么设计,直接决定了蜘蛛能走到第几页:有的站点只有第一页被反复抓取,第二页之后几乎没有记录,问题往往不在服务器,而在分页链接本身。
三种常见的分页形态
传统数字分页
第一页、第二页、末页各有独立 URL,例如 /list/page/2/。这类结构对蜘蛛最友好,链接是页面 HTML 里真实存在的 a 标签与 href,顺着走就能到达。
“加载更多”与无限滚动
点击按钮后由 JS 请求接口,把结果插入页面。如果按钮本身没有 href,也不生成可访问的 URL,蜘蛛只能看到第一屏内容,后面的条目对它等于不存在。即便接口返回了数据,也需要浏览器环境执行,第一轮抓取经常拿不到。
靠 JS 拼接的分页
分页链接由脚本动态写入,或者写在 onclick 里跳转,在原始 HTML 中并不存在,抓取阶段容易漏掉。折中做法是在页面底部保留一套静态分页链接,数量可以少,但要有真实 URL。
让翻页链接可被抓到
- “下一页”用带 href 的链接,而不是按钮加事件绑定;
- 分页 URL 尽量简短稳定,避免带一串排序、时间戳参数;
- 列表页底部保留至少一条通往后续页面的静态路径;
- 第一页上不要只出现“下一页”,适当给出若干页码,方便蜘蛛跳转。
canonical 与分页标记
一个常见错误是把第二页、第三页的 canonical 指向第一页。这等于告诉搜索引擎“这些页面是同一页的副本”,后续页面也就失去了被单独抓取和索引的理由。分页页应当各自指向自己。rel=next/prev 现在更多是线索而非索引信号,可以保留,但不必指望它解决分页发现问题。
同时,分页页之间的标题、描述、正文高度相似时,被抓取和索引的意愿都会下降。可以在标题里带上页码或该页覆盖的区间,正文中保留每一条目的摘要。
分页深度与抓取预算
站点越大,分页的性价比越需要权衡。每页只放 5 条,意味着蜘蛛要走十几次才能覆盖 50 条内容;每页放 50 条,抓取路径变短,但单页体积和渲染成本上升。多数列表页在 20 到 50 条之间比较平衡。
另外,排序、筛选、时间范围等参数会生成大量结构相似的分页变体,蜘蛛很可能把时间花在这些页面上。如果这些变体没有独立价值,可以用 robots.txt、nofollow 或 canonical 做收敛,把抓取留给常规分页。
分页不是越深越好,而是让蜘蛛用尽量少的步数触达尽量多的有效详情页。
怎么核对分页是否被抓
- 在服务器日志里筛选含 /page/ 或分页参数的 URL,看第二页之后是否有抓取记录;
- 观察同一路径的抓取频率是否只集中在第一页;
- 用不带 JS 的方式打开列表页,确认分页链接是否出现在 HTML 源码里;
- 手动顺着链接点击几层,看能否只靠链接走到末页。
分页设计没有统一答案,但有一条稳定原则:把通往后续页面的路径写进 HTML,让它成为一个普通链接。做到这一点,剩下的只是每页放多少条、留多少个页码入口的取舍问题。