蜘蛛進入一個内容站,大部分詳情頁並不是從首頁直接点進去的,而是沿着列表頁、分頁、标簽頁一层层走過去的。列表頁的作用不是展示,而是给蜘蛛提供可走的路径:路径清楚,URL 發現就顺;路径混乱,蜘蛛要么翻不到深處,要么在分頁里绕圈。
蜘蛛在列表頁上實际看到什么
它不点鼠标,只讀 HTML 里的連結。判断标准很简單:把列表頁的源碼打開,搜詳情頁的 URL,看它是否存在于可点击的 a 标簽里。
- 數字分頁:頁号是 a 标簽时,蜘蛛能逐頁往下翻,這是最容易被跟進的形態。
- 下一頁按钮:寫成 a 标簽通常會被跟進;用 button 加脚本事件触發跳轉的,多數抓取场景看不到目标 URL。
- 無限滚動:内容随滚動由脚本追加,不执行脚本的抓取只拿到第一屏的連結。
- 加载更多:同样取决于它背後有没有一個真實存在的分頁 URL 作為兜底入口。
分頁 URL 的两種寫法
常见的是路径式 /list/2/ 和參數式 /list?page=2。路径式层級清晰,日誌里也容易判断蜘蛛抓到了第几頁;參數式同样能被抓,但有两處容易出問题:一是參數顺序、大小寫、多余跟踪參數造成同一頁對應多個 URL;二是第 2 頁的 canonical 被誤指回第 1 頁,等于告诉蜘蛛後面的頁不必單獨存在,頁内的詳情連結也可能被连带忽略。
詳情連結该铺在第几頁
不要全部堆在第一頁
第一頁塞進几百條詳情連結,單次抓取能處理的有效連結有限,頁面体积還大,反而拖慢對後面連結的發現。
也不要让深頁只能靠下一頁到達
如果列表只輸出一個下一頁按钮,第 10 頁就要走 10 跳,抓取深度和稳定性都受影响。比較稳的组合是:數字分頁露出前若干頁号,配合上一頁、下一頁,让深處頁面有較短的入口。
分頁要有明确邊界
空结果翻頁、可以無限翻下去的日期归档,都會持續产生高度相似的 URL,把抓取次數耗在低價值頁面上。可行做法:超過一定頁數後改為按年月归档的固定入口,在列表尾部停止輸出新的下一頁連結;翻到末尾时返回明确的空列表狀態,而不是永遠给出一條還有内容的下一頁。
分頁路径断没断,按這個顺序查
- 日誌里看蜘蛛是否訪問過第 2、3 頁,還是長期只抓第 1 頁。
- 看分頁連結是不是由脚本生成,或被 nofollow、被 robots.txt 屏蔽。
- 检查第 2 頁及之後的 canonical 是否错誤地指回第 1 頁。
- 检查參數顺序、大小寫、跟踪參數是否制造了重复的分頁 URL。
- 检查服務器在蜘蛛连續翻頁时是否出現 5xx 或超时。
列表頁本身要扛得住
列表頁是枢纽,它响應慢或偶尔报错,蜘蛛翻到一半就停,後面的詳情頁這一轮就抓不到。列表頁尽量轻:少用大图,少依赖接口渲染,把連結直接寫在 HTML 里,並保證同一批 URL 返回稳定。
外部引導要建立在站内路径之上
有些站点會借助蜘蛛池或其他外部入口加快 URL 發現。這類手段解决的是第一次被看到,解决不了站内路径的問题。如果外部引導把蜘蛛带到列表頁,而列表頁的分頁連結是脚本生成的,抓取到這里仍然會断。先確認站内從列表到詳情的路径是通的,再考虑外部引導是否值得投入。
一個简單的检驗:從首頁出發,只用 HTML 里的 a 标簽,能不能在可控的跳數内走到列表深處的詳情頁。走得到,分頁设計基本合格;走不到,先改路径,再谈其他。