先分清:蜘蛛不滚動,也不点按钮
無限滚動(用戶一拉到底就自動加载下一批)和“加载更多”按钮,本质都是把後續内容藏在一次交互動作之後。蜘蛛抓取頁面时,通常只拿到初始 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 找到,剩下的事情交给正常抓取。