搜索抓取

无限滚动与“加载更多”:蜘蛛的抓取路径为什么停在首屏

无限滚动和“加载更多”把后续内容藏在用户操作之后,蜘蛛不会滚动、也不会点击按钮,能走的路径往往只有首屏那几条。本文从分页链接写法、Sitemap 补充、内链入口和日志排查几个角度,说明如何让列表深层内容重新有一条可被抓取的路,同时不牺牲页面体验。

搜索抓取

无限滚动与“加载更多”:蜘蛛的抓取路径为什么停在首屏

先分清:蜘蛛不滚动,也不点按钮

无限滚动(用户一拉到底就自动加载下一批)和“加载更多”按钮,本质都是把后续内容藏在一次交互动作之后。蜘蛛抓取页面时,通常只拿到初始 HTML 和渲染后的首屏,不会像人一样持续滚动、等待接口返回,也不会去点那个按钮。结果就是:首屏那几十条内容有链接可走,后面的内容对抓取路径来说等于不存在。

更麻烦的是,很多站点在滚动加载时并不改变地址,浏览器地址栏始终是同一个 URL。蜘蛛手里只有这一个入口,走完首屏就没了下一步。

三种常见写法,抓取路径差别很大

1. 真实分页链接,只是用视觉盖住了

页面里仍然有指向 page=2、page=3 的普通链接,只是用样式把它包装成“加载更多”的外观,点击时再用 JS 拦截并改成滚动加载。这种写法对蜘蛛最友好:链接在 HTML 里,路径是通的。注意别用 display:none 把整块链接藏起来,也不要在加载完成后用 JS 把它删掉,那会让路径时有时无。

2. 纯按钮加接口请求

按钮本身是个 button 或 div,点击后 JS 去请求 JSON 接口,再把数据拼进页面。蜘蛛不会点,接口返回的数据也不会进入初始 HTML,后续内容基本抓不到。

3. 滚动监听自动加载

连按钮都没有,全靠滚动事件触发。这种对抓取最不友好,因为它连一个可枚举的“下一页”地址都没有留下。

给内容留一条能走的路径

如果产品上确实要用无限滚动,至少补上下面几件事,让路径不要断在首屏:

  • 保留真实分页链接:在列表页底部放一组指向 page=2、page=3 的普通链接,样式可以弱化,但要在 HTML 里可见。
  • 提供“查看全部”或分类归档页:把长列表拆成几个带独立 URL 的页面,蜘蛛从导航就能进来,用户也能跳着看。
  • Sitemap 里补上列表分页:分页 URL 不要被 robots 挡住,也不要只靠 JS 生成。放进 Sitemap,等于明确告诉抓取端这些页面存在。
  • 用内链从别处指向深层页:热门内容、相关推荐、标签页都可以指向列表深处的条目,让路径不只依赖列表本身。
  • 避免“加载更多”只更新前端状态:如果用 history API 改地址,记得让该 URL 能被直接打开,不要出现只有前端能访问的假地址。

无限滚动对抓取预算也不太友好

一个 URL 里塞进上百条内容,看起来内容很多,实际单次抓取拿到的仍然是首屏那部分。而且页面越大、渲染越重,服务器和抓取端都要花更多时间。与其把一个页面做得很长,不如拆成多个可独立访问的分页,每页有清晰标题和稳定 URL,路径和抓取效率都会更好。

怎么确认路径有没有断

  1. 用抓取工具或直接看 HTML 源码,搜索分页链接是否存在,而不是只在渲染后才出现。
  2. 看服务器日志里,列表页的 page=2、page=3 有没有被抓取端请求过。如果只有 page=1,说明路径大概率断了。
  3. 关掉 JS 再访问列表页,看还有没有可点的下一批内容入口。
  4. 检查移动端和桌面端是否用了不同的加载逻辑,有时桌面有链接、移动端没有。
无限滚动本身不是错,错的是把唯一的入口交给了一个抓取端不会执行的动作。体验可以留给用户,路径要留给抓取。

最后提醒一点:不要为了抓取在页面里塞一堆用户看不见的链接,那既影响体验,也容易踩到隐藏链接的坑。更稳的做法是让分页 URL 真实存在、能被点击、能被内链和 Sitemap 找到,剩下的事情交给正常抓取。