在站点的抓取路径里,列表頁往往承担中轉站的角色。首頁或栏目頁把蜘蛛送進列表,列表再把它分發给詳情頁。問题在于,列表通常不會只有一頁,分頁連結的寫法直接决定了蜘蛛能不能繼續往下走,以及能走多遠。
分頁連結要真的能被跟着走
很多站点把下一頁做成按钮,用 JS 動態拼接 URL,或者只在点击时發起請求。视觉上没問题,但蜘蛛拿到的 HTML 里可能只有一個空容器。想让分頁進入抓取路径,最简單的方式是保留可点击的 a 标簽,href 指向真實 URL。即使同时用 JS 增强,鼠标点击與蜘蛛跟進也不冲突。
常见寫法有 /list?page=2、/list/page/2/、/list/2/ 等,都可以,關键是全站保持一致,不要让同一份内容在多種形態之間来回跳。如果分頁 URL 里混入會话 ID 或時間戳,每次抓到都像新地址,反而會让蜘蛛反复走同一段路。
rel=next/prev 與 canonical 的常见誤用
rel=next/prev 曾经被用来标记分頁序列,後来主流搜尋引擎不再把它当作强信号,但它本身不影响連結可抓。真正容易出問题的是 canonical:有人為了集中權重,把所有分頁的 canonical 都指向第一頁,這會让蜘蛛倾向于認為後續頁只是第一頁的重复版本,抓取價值降低。更稳妥的做法是让每個分頁自指 canonical,或者至少不要强行指向第一頁。
如果分頁内容确實與第一頁高度重复,可以考虑用合理的标题與描述做出区分,而不是靠 canonical 掩盖。分頁的每一頁都應该有自己的位置,而不是被当作第一頁的影子。
往下走多遠:分頁深度與抓取预算
分頁是线性延伸的路径:第一頁有第二頁連結,第二頁有第三頁連結。路径本身不复杂,但頁數一多,蜘蛛要走的步數會明顯增加。如果每頁還挂着篩選、排序、時間范围等參數,連結组合會快速膨胀,把本来有限的時間消耗在相似列表上。
常见的收敛方法:
- 限制分頁层數,超過一定頁數後改用归档或按時間切分;
- 過滤無意义的排序參數,只保留有獨立價值的入口;
- 篩選结果是否产出可抓連結,按业務價值决定,必要时用 noindex;
- 列表頁不要輸出大量重复的推荐位連結,减少路径分岔。
無限滚動與加载更多怎么留後路
無限滚動對用戶体驗友好,但對 URL 發現不友好。如果只靠滚動触發接口,蜘蛛拿不到後續 URL。比較實用的折中方案是:
- 第一屏仍然返回可抓的分頁連結,作為兜底;
- 滚動加载的接口返回真實詳情頁 URL,並确保這些 URL 能從別處被發現;
- 加载更多按钮最好是一個带 href 的連結,JS 只做拦截增强;
- 移動端與桌面端保持同一套 URL,不要額外生成一套僅供爬虫使用的地址。
這些做法不會让蜘蛛一次抓完所有内容,但能让它有一個稳定的入口,逐步把新連結纳入队列。
服務器响應與分頁抓取的节奏
分頁請求往往比詳情頁更密集,因為蜘蛛需要在較短時間内连續取多個頁面。如果服務器响應慢,或者每頁都触發复杂的資料库查询,抓取队列會越排越長,蜘蛛可能降低對本站的訪問频率。给列表頁做缓存、控制每頁輸出條數、避免一次查询拉取全部資料,都是比較直接的做法。稳定性比偶尔的一次快速响應更重要。
上线前後的检查清單
- 分頁連結是否為可抓的 a 标簽,href 指向真實 URL;
- 分頁 URL 是否稳定,不随會话或時間戳變化;
- canonical 是否誤指第一頁;
- 是否存在參數组合導致的無限路径;
- 列表頁响應時間是否稳定,是否有缓存;
- 分頁内容是否與第一頁有足够差异。
分頁看起来只是列表的延伸,但它决定了蜘蛛能走多深、走多快。把分頁連結做成蜘蛛能理解、能连續跟進的路径,通常比事後調整更容易。
抓取路径不是越深越好,而是每一步都有明确的下一站。