先分清:蜘蛛不滚动,也不点按钮
无限滚动(用户一拉到底就自动加载下一批)和“加载更多”按钮,本质都是把后续内容藏在一次交互动作之后。蜘蛛抓取页面时,通常只拿到初始 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,路径和抓取效率都会更好。
怎么确认路径有没有断
- 用抓取工具或直接看 HTML 源码,搜索分页链接是否存在,而不是只在渲染后才出现。
- 看服务器日志里,列表页的 page=2、page=3 有没有被抓取端请求过。如果只有 page=1,说明路径大概率断了。
- 关掉 JS 再访问列表页,看还有没有可点的下一批内容入口。
- 检查移动端和桌面端是否用了不同的加载逻辑,有时桌面有链接、移动端没有。
无限滚动本身不是错,错的是把唯一的入口交给了一个抓取端不会执行的动作。体验可以留给用户,路径要留给抓取。
最后提醒一点:不要为了抓取在页面里塞一堆用户看不见的链接,那既影响体验,也容易踩到隐藏链接的坑。更稳的做法是让分页 URL 真实存在、能被点击、能被内链和 Sitemap 找到,剩下的事情交给正常抓取。