翻頁入口:先確認它是可点击、可抓取的連結
列表頁、标簽頁、归档頁往往都有翻頁。問题在于,很多模板把“下一頁”做成了按钮:点击後由脚本拼接參數、追加内容,源碼里只有一個 div 或 span。人看得见,抓取程序看不见。爬虫不會去点按钮,它只會沿着 a 标簽的 href 走。如果翻頁入口不是連結,第二頁之後的内容基本等于對搜尋侧關閉。
自查时可以直接禁用 JavaScript 看渲染前的源碼,或者用查看源代碼的方式確認翻頁控件里到底有没有 href。
- “下一頁”“上一頁”“末頁”是否為带 href 的 a 标簽。
- href 是否指向真實可訪問的地址,而不是 javascript:void(0) 或 #。
- 分頁連結是否被 rel="nofollow"、onclick 或事件拦截。
- 翻頁控件是否只在滚動到底部时才由脚本動態生成。
分頁 URL 要收敛,別让參數無限膨胀
分頁地址常见两種形態:路径式 /list/page/2/ 和參數式 /list?page=2。两種都能用,關键是同一個頁面只對應一個地址。
- 不要同时存在 ?page=2、?p=2、?pageno=2 這類多套參數寫法。
- 排序、篩選、每頁條數等參數不要和頁碼混在一起,生成大量组合地址。
- 大小寫、结尾斜杠在全站保持一致。
- 分頁地址不要带會话 ID、追踪參數之類的临时字段。
頁碼上限與超范围頁面的處理
有的站点允许翻到几百頁甚至上千頁,越往後内容越舊、價值越低,抓取预算却被大量消耗。更常见的問题是:超過實际頁數後仍返回 200 和空列表,等于人為制造一批空頁面。
建议给分頁设一個合理上限,超出范围的請求返回 404 或 410。如果确實要保留舊内容,就把深分頁收敛成归档入口,而不是让爬虫一頁一頁往下翻。
判断标准很简單:如果某個頁碼對應的列表,用戶几乎不會看、站内也没有其他入口指向它,那它大概率不值得被單獨收錄。
分頁頁的标题、描述與 canonical
标题不要全站共用一句
所有分頁共用同一個 title,會让搜尋侧难以区分哪一頁對應哪批内容。至少把頁碼或区間带進去,例如“某某列表 第 3 頁”,让每個分頁頁有一個自洽的身份。
canonical 要指向分頁自身
常见誤区是把所有分頁的 canonical 都指向第一頁,希望“集中權重”。這样做的直接後果是,後續頁面的内容不容易被当作獨立入口。除非你有明确的合並意图,否則分頁頁的 canonical 指向自己更稳妥。
無限滚動要有可抓取的分頁兜底
無限滚動對用戶体驗友好,對抓取不友好:内容按需加载,連結不在初始 HTML 里。可行的做法是保留一套传统的分頁連結作為兜底,滚動只是视觉增强,底层结构仍然是 a 标簽串联。也可以给每次加载生成獨立 URL,但要注意別把同一批内容拆成過多地址。
用抓取日誌驗證分頁覆盖率
改完之後別只盯着頁面看,去日誌里核對。
- 筛出分頁 URL 的抓取记錄,看爬虫是否真的訪問到第二頁、第三頁。
- 观察返回狀態碼,確認没有大量 200 空頁或 5xx。
- 對比分頁抓取量與列表頁實际頁數,估算覆盖比例。
- 检查被抓取的分頁是否集中在第一頁,後續頁几乎没有记錄。
一份可执行的自查清單
- 翻頁控件是可点击的 a 标簽,href 指向真實地址。
- 同一頁只有一個規范地址,參數不重复、不混杂。
- 分頁设有上限,超范围返回 404 或 410。
- 分頁頁标题包含頁碼或区間,便于区分。
- canonical 預設指向自身,除非有明确的合並策略。
- 無限滚動场景下保留传统分頁兜底入口。
- 日誌中能看到深层分頁被抓取,而不是只有第一頁。
分頁是内容站最容易被忽略的基础设施。它不需要复杂的技術改造,多數时候只是把按钮換成連結、把參數理一理、把上限定下来。做完這些,再去日誌里確認一遍,比反复猜测“内容為什么没被發現”要實在得多。