無限滚動在内容型站点中很常见,尤其是资讯流、商品列表、問答社区。它让用戶無需点击下一頁就能持續浏览,却经常给搜尋蜘蛛的URL發現带来隐性障碍。蜘蛛在抓取頁面时,通常只會請求HTML並解析静態連結,滚動事件和异步加载产生的DOM變化並不在标准抓取流程内。结果就是:蜘蛛看到的是一個只有首屏内容的毛坯頁面,後續條目既没有對應的URL,也没有可点击的入口。
無限滚動下的URL形態與抓取死角
不同站点的無限滚動實現方式差异很大,對蜘蛛的影响也不同。有些站点會在用戶接近底部时,自動向下一頁發起AJAX請求,然後把响應拼接到目前列表末尾。整個過程不产生新的URL,浏览器地址栏始终不變。此时除了第一頁之外,所有條目都只存在于執行时内存中,蜘蛛完全無法感知。這類内容即使质量很高,也無法通過連結被發現,只能依赖搜尋系統通過其他方式索引,基本等于與抓取路径無關。
另一種常见做法是“加载更多”按钮。如果按钮本身没有href属性,或者点击後才通過JavaScript生成後續内容,蜘蛛同样無法获取第二层、第三层的資料。尤其当列表項没有獨立詳情頁URL时,問题就更嚴重。比如翻頁URL為?page=2這種清晰结构,却因為動態加载按钮未暴露真實連結,導致頁面全部内容挤在一個URL下面,重复度也容易升高。
還有一類實現會使用history.replaceState或pushState,在滚動加载时不断更新URL參數,比如把currentPage改成2、3。表面上看URL在變化,但蜘蛛不會主動触發滚動,初始HTML里只有第一頁的資料,後面所有參數對應的URL都没有實际被抓取請求過,更谈不上内容映射到正确的URL上。
優先恢复URL可枚举性
要让搜尋蜘蛛重新發現並遍歷這些内容,最稳妥的出發点不是让蜘蛛去模拟用戶滚動,而是让頁面在任何JavaScript都不执行的狀態下,依然具备完整的URL列表。也就是说,服務端返回HTML时應包含分頁導航,哪怕前端做了無限滚動交互,也要保留一组真實連結,例如放在頁面底部的“下一頁”或“頁碼”区域。對蜘蛛而言,這些静態連結就是新URL的入口。
如果不想削弱無限滚動的体驗,可以保留“加载更多”按钮,但让button内部或旁邊存在一個带真實地址的a标簽,或者直接把button換成a标簽,用href指向下一頁路径。這样蜘蛛可以顺着連結逐层抓取,用戶点击後仍然可以通過拦截事件跳轉到AJAX加载逻辑,達到同时兼容的效果。注意不要在触發异步後阻止預設行為时把href环境给破坏掉。
獨立分頁URL與内容可见性缺一不可
分頁URL本身要遵循一致、连續的規則,例如?page=2、?page=3,而不是每頁都生成随机參數。URL不稳定會導致蜘蛛已经抓取過的連結失效,重新發現後又要面對未知的跳轉或软404。翻頁时最好使用GET參數並保持參數名固定,不要混用?p=2和?page=2两種寫法。
在頁面内容上,要确保URL對應的HTML中确實存在该頁的核心條目,而不是所有頁都輸出同样的首屏内容。蜘蛛會通過比對内容差异来確認新URL是否有索引價值。如果所有分頁URL返回的都是第一屏的内容,那么即使URL被發現,也會被認為是重复或者软404,抓取预算反而浪費。服務端渲染或预渲染出目前頁面的内容,是保證URL與内容一一對應的基础。
分頁長度與抓取预算的平衡
無限滚動容易让單頁條目數量變得很大,從SEO角度並不好控制。頁面中静態連結數量過多,會稀释核心URL的權重;如果分頁大多為空壳,還可能触發抓取速率下降。建议單頁條目控制在合理范围,比如20到30條,让每個分頁有足够獨特内容,但也不要為了减少頁數而無限堆加,導致單頁過長,抓取深度和更新频率都难以维持。
带滚動加载的评论或附件区域
無限滚動不僅出現在列表頁,也可能出現在詳情頁的评论区、附件列表等位置。评论過多时,如果只展開前几條,後面的评论就没有獨立URL入口。此類次要区域對核心抓取影响不大,但如果内容本身需要被收錄,比如問答站点長的热评,就應采用同样的思路:保留按時間或頁碼展開的静態連結,或使用獨立的评论分頁URL。不要用“展開更多评论”這種按钮而没有任何真實地址。
實践检查清單
- 關閉JavaScript後訪問頁面,確認後續内容對應的静態連結仍然存在。
- 检查“加载更多”或按钮元素是否包含href属性,並且指向真實分頁URL。
- 驗證每個分頁URL返回的HTML中是否包含该頁實际内容,而非统一首屏。
- 對比蜘蛛日誌,確認分頁URL是否被按顺序請求,有没有大量2級頁面的404或500。
- 避免在滚動时動態替換URL却不提供同样URL的静態入口。
無限滚動的核心矛盾在于,产品希望用戶停留,而蜘蛛希望看到确定的URL和稳定入口。站点运营應優先保證HTML中静態可点的URL,再在此基础上去增强交互体驗,而不是让抓取工具去适配不可见的動態事件。
對于已经上线無限滚動的站点,可以分阶段處理:先补充頁面底部的分頁導航,再用無脚本渲染輸出加载更多的href,最後检查日誌確認蜘蛛實际發現到第几层。不要把希望寄托在蜘蛛执行滚動上,任何需要JS触發才能拿到URL的机制,都是對抓取路径的人為设限。