栏目的列表頁看起来简單,但只要頁數一多,翻頁就會成倍地产生地址。一個 50 頁的列表,再叠加排序、篩選和時間范围,很容易變成几百上千個 URL。這些地址是否被正确串联、邊界是否清楚,既影响蜘蛛在站内的行進路线,也影响訪客能不能顺着列表一直看下去。
先數一數分頁會生出多少地址
動手改之前,先盘点現状。把几個主要栏目的翻頁地址抓出来看一遍,重点记錄這几件事:
- 每個列表栏目目前有多少頁,最後一頁的地址長什么样;
- 翻頁靠的是路径(/list/2/)、查询參數(?page=2)還是文件名後缀(list_2.html);
- 排序、篩選、時間范围這些條件,會不會和分頁组合出新的地址;
- 輸入一個超出末頁的頁碼,服務器實际返回什么。
地址形式尽量统一
同一站内最好只保留一種翻頁寫法。混用會让同一批内容出現两套地址,連結和抓取都被分散。可以從下面几点收敛:
- 确定一種形式並全站沿用,例如统一用 /list/page/2/,或统一用 ?page=2;
- 第 1 頁就是列表首頁,不要让 /list/page/1/ 和 /list/ 同时存在;
- 參數分頁要固定參數顺序和大小寫,避免 ?page=2&sort=hot 與 ?sort=hot&page=2 被当成两個地址;
- 排序、篩選等條件组合,限制可參與翻頁的维度數量。
翻頁頁面的标题、描述與 canonical
第 2 頁往後,如果标题和第一頁完全一样,搜尋结果里很难区分。可以做几件小事:
- 标题里带上頁碼或内容区間,例如「某某栏目 第 3 頁」;
- canonical 一般自指,指向目前這一頁,不要全部指回列表首頁;
- 描述按頁碼做简單区分即可,不必每一頁都手寫。
不要為了省事把第 2 頁以後的頁面全部 canonical 到首頁,那等于告诉搜尋引擎這些頁面可以忽略,里面承载的内容連結也失去了入口價值。
把翻頁的邊界寫清楚
- 末頁之後不再輸出「下一頁」連結;
- 訪問超出范围的頁碼,返回 404 或跳回最後一頁,而不是给一個狀態 200 的空列表——空列表容易被当成有效頁面存下来;
- 翻頁數量過多时,考虑只保留前若干頁可翻,其余用分類頁或标簽頁收口。
列表里要能走到詳情頁
翻頁本身不是目的,把内容頁串起来才是。检查每一頁列表:
- 每頁輸出的條目數不要太少,避免把内容摊得太開、翻頁层數被拉長;
- 列表里的連結是可直接点击的 a 标簽,不是靠脚本点击才生成;
- 分頁控件和條目在同一份 HTML 里,不要等 JS 执行完才出現。
「加载更多」與無限滚動
移動端常见的加载更多,如果只在浏览器里拼地址,蜘蛛往往看不到後面的内容。比較稳妥的做法是:
- 保留一份可翻頁的地址,指向與加载更多相同的内容;
- 首屏之外的條目,至少让一部分連結出現在 HTML 中;
- 加载更多調用的接口地址不必刻意公開,但對應内容的可訪問地址要真實存在。
從訪問日誌回看翻頁情况
改完不等于結束。過一两周回到訪問日誌,看几個指标:主要栏目被翻到第几頁、翻頁請求的狀態碼分布、有没有大量 404 或者狀態 200 的空頁。如果某個栏目總是只被翻到第 2 頁,多半是連結断在了那一頁,或者參數地址被 robots 拦下了。也可以對照整体抓取频次,如果翻頁請求占比很高而詳情頁很少,說明列表頁在消耗抓取资源,可以适当收敛翻頁深度,把入口留给内容頁。
一份可以照着做的自查清單
- 翻頁地址形式全站统一,只保留一套;
- 第 1 頁不與 /page/1/ 這類地址重复存在;
- canonical 自指,不指回首頁;
- 末頁之後不再輸出下一頁連結;
- 越界頁碼返回 404 或 301,不返回空列表;
- 每頁列表里的詳情頁連結在 HTML 中直接可见;
- 加载更多有可抓取的等價地址;
- 排序篩選與分頁的组合數量可控;
- 定期從日誌检查翻頁深度和狀態碼分布。
這些事都不复杂,但需要一次做完、之後按节奏复查。翻頁是列表和詳情之間的桥,桥修得直不直,自己走一遍就知道。