分页是一条连续的抓取路径
列表页翻页时,蜘蛛面对的不是一个孤立地址,而是一串按顺序排列的 URL。这条路径和普通内链不太一样:页与页之间是强顺序关系,蜘蛛很容易顺着“下一页”一路走到底,而不是像在导航里那样四处散开。
理解这一点之后,很多现象就好解释了:为什么某一类列表页被抓了几百次,而同一个站里手工写的详情页却迟迟不见动静。
蜘蛛通常从哪一页进入
多数情况下,蜘蛛是从第一页进入的,因为第一页最容易被首页、频道页或 Sitemap 指向。但也不绝对:外部链接、历史快照、站内搜索留下的地址,都可能把蜘蛛直接送到第 7 页或第 30 页。
从中间页进入时,蜘蛛拿到的上下文比较少。它只能看到这一页的上一页、下一页和若干页码,需要自己往前补或者往后走。如果分页入口只有“下一页”而没有“上一页”(比如完全靠 JS 渲染),蜘蛛很容易只朝一个方向走。
页码链接、“下一页”和“加载更多”的差别
- 可点击的页码链接:蜘蛛一眼能看到全部页面的地址,知道这条序列大概多长,安排抓取时更有余地。代价是页数多的时候,一页上会挂出几十个链接。
- 只有“下一页”:序列是链式的,蜘蛛得一页一页往前推。走得通,但越深回头再抓的概率越低。
- 无限滚动与“加载更多”:内容靠 JS 追加时,蜘蛛在首屏能拿到的链接可能只有前几条。除非有可爬取的分页地址兜底,否则后面的内容基本只能靠 Sitemap 单独递过去。
分页地址怎么设计更省事
?page=2 和 /page/2/ 都能被抓,区别主要在可读性和规范化。更关键的是同一批内容别出现多种分页地址:带排序、带筛选、带会话参数的版本如果都能打开,蜘蛛会看到一堆内容近似的序列,抓取量就花在重复页面上了。
常见做法是固定一个默认排序地址,排序和筛选参数用 canonical 指回默认页,或者用 robots meta 让参数页不参与索引。这里要留意:是不索引,不是不抓取。蜘蛛仍需要读这些页面,才能顺着往下发现新内容。
什么时候该限制分页深度
分页挖得太深,收益通常递减:第 40 页之后的内容,用户很少点,蜘蛛也很少回来。如果这类页面数量很大,会明显挤占整个站点的抓取次数。
可以考虑把深分页的链接改成不跟随、但地址仍可访问;或者把内容按时间、分类、标签切成更细的入口,让深层内容从更浅的路径被到达。前提是这些入口自己也要能被发现,否则只是把问题从分页挪成了新的孤岛。
服务器端要注意的地方
分页请求往往集中在同一个动态接口上,蜘蛛连续翻页时会产生一串间隔很短的请求。如果这个接口本身慢,蜘蛛的等待时间就会被拉长,后续抓取节奏也跟着变慢。给分页接口加缓存、避免全表扫描,通常比事后改 robots 更直接。
另外,翻到最后一页怎么处理也值得想清楚:返回 404 会留下一条错误记录,返回一个空列表页并保留 200 又容易形成大量内容重复的空页。相对稳妥的是给出明确的“没有更多”页面,让它和前面几页有区分,同时不再往下挂分页链接。
小结
分页本身不难,难点是这条序列有多长、蜘蛛从哪进来、走到深处之后还有没有别的路可走。把分页地址收敛成一套、让关键内容从更浅的层级也能到达,通常比纠结用哪种 URL 形式更有用。