搜索抓取

分页序列里的蜘蛛:从哪一页进入,又会在哪一页停下

分页其实是一串按顺序排列的地址,蜘蛛往往会顺着它一路走到底。本文聊蜘蛛通常从哪一页进入分页序列、页码链接与“加载更多”的差别、分页地址怎么收敛、什么时候该限制深分页,以及分页接口在服务器端需要注意的地方。

搜索抓取

分页序列里的蜘蛛:从哪一页进入,又会在哪一页停下

分页是一条连续的抓取路径

列表页翻页时,蜘蛛面对的不是一个孤立地址,而是一串按顺序排列的 URL。这条路径和普通内链不太一样:页与页之间是强顺序关系,蜘蛛很容易顺着“下一页”一路走到底,而不是像在导航里那样四处散开。

理解这一点之后,很多现象就好解释了:为什么某一类列表页被抓了几百次,而同一个站里手工写的详情页却迟迟不见动静。

蜘蛛通常从哪一页进入

多数情况下,蜘蛛是从第一页进入的,因为第一页最容易被首页、频道页或 Sitemap 指向。但也不绝对:外部链接、历史快照、站内搜索留下的地址,都可能把蜘蛛直接送到第 7 页或第 30 页。

从中间页进入时,蜘蛛拿到的上下文比较少。它只能看到这一页的上一页、下一页和若干页码,需要自己往前补或者往后走。如果分页入口只有“下一页”而没有“上一页”(比如完全靠 JS 渲染),蜘蛛很容易只朝一个方向走。

页码链接、“下一页”和“加载更多”的差别

  • 可点击的页码链接:蜘蛛一眼能看到全部页面的地址,知道这条序列大概多长,安排抓取时更有余地。代价是页数多的时候,一页上会挂出几十个链接。
  • 只有“下一页”:序列是链式的,蜘蛛得一页一页往前推。走得通,但越深回头再抓的概率越低。
  • 无限滚动与“加载更多”:内容靠 JS 追加时,蜘蛛在首屏能拿到的链接可能只有前几条。除非有可爬取的分页地址兜底,否则后面的内容基本只能靠 Sitemap 单独递过去。

分页地址怎么设计更省事

?page=2 和 /page/2/ 都能被抓,区别主要在可读性和规范化。更关键的是同一批内容别出现多种分页地址:带排序、带筛选、带会话参数的版本如果都能打开,蜘蛛会看到一堆内容近似的序列,抓取量就花在重复页面上了。

常见做法是固定一个默认排序地址,排序和筛选参数用 canonical 指回默认页,或者用 robots meta 让参数页不参与索引。这里要留意:是不索引,不是不抓取。蜘蛛仍需要读这些页面,才能顺着往下发现新内容。

什么时候该限制分页深度

分页挖得太深,收益通常递减:第 40 页之后的内容,用户很少点,蜘蛛也很少回来。如果这类页面数量很大,会明显挤占整个站点的抓取次数。

可以考虑把深分页的链接改成不跟随、但地址仍可访问;或者把内容按时间、分类、标签切成更细的入口,让深层内容从更浅的路径被到达。前提是这些入口自己也要能被发现,否则只是把问题从分页挪成了新的孤岛。

服务器端要注意的地方

分页请求往往集中在同一个动态接口上,蜘蛛连续翻页时会产生一串间隔很短的请求。如果这个接口本身慢,蜘蛛的等待时间就会被拉长,后续抓取节奏也跟着变慢。给分页接口加缓存、避免全表扫描,通常比事后改 robots 更直接。

另外,翻到最后一页怎么处理也值得想清楚:返回 404 会留下一条错误记录,返回一个空列表页并保留 200 又容易形成大量内容重复的空页。相对稳妥的是给出明确的“没有更多”页面,让它和前面几页有区分,同时不再往下挂分页链接。

小结

分页本身不难,难点是这条序列有多长、蜘蛛从哪进来、走到深处之后还有没有别的路可走。把分页地址收敛成一套、让关键内容从更浅的层级也能到达,通常比纠结用哪种 URL 形式更有用。