多层入口頁的结构在很多蜘蛛池里很常见:第一层放几個聚合頁,第二层再挂具体的目标 URL。跑一段時間後,服務器日誌里常常是另一種画面——第一层的請求记錄断断續續有,第二层几乎空白。這種情况不一定是蜘蛛「不爬」,多數时候是連結可達性和层級设計出了問题。
先確認蜘蛛到底有没有到第二层
不要只看總抓取量。把日誌按爬虫 UA 過滤,再用路径前缀把第一层和第二层分開統計,看第二层的 URL 有没有产生過任何請求。這里要区分两種情况:一種是收到了請求但返回 3xx、4xx、5xx,另一種是压根没有請求记錄。前者属于抓取失敗,後者才属于「没被發現」。
如果日誌里确實一條第二层的记錄都没有,還要排除缓存层的干扰。有些站点前面挂了 CDN 或反向代理,爬虫的請求被缓存命中,日誌里只留下回源的那一條。可以临时在第二层 URL 上加一個不參與缓存的查询參數做測試。
只停在一层,常见的原因
- 連結没寫進 HTML。 第一层的連結如果是用 JS 動態插入,或者绑在点击事件上,而 HTML 源碼里没有真正的 href,抓取阶段就可能看不到。
- 連結藏在交互後面。 需要点击「展開更多」、滚動到底部才加载的分頁、切換标簽頁才出現的列表,都属于這一類。
- 第一层的連結數量太多。 一個頁面挂了几百上千條連結,蜘蛛每次可能只取前一部分就离開,排在後面的第二层入口長期轮不到。
- 同頁連結指向太多不同域名。 跨域連結本身没問题,但如果其中有些域名被 robots.txt 拦住、或者解析異常,整体抓取效率會被拖下来。
- 第二层 URL 的參數形態太差。 一大串會话參數、排序參數,容易被判定為重复内容或低優先級,進入队列後迟迟不被取。
分层设計上可以做的調整
控制單頁連結數量
把第一层拆成多個頁面,每頁控制在几十條以内,比在一頁上堆满更利于抓取。第二层同理,不要把同一批目标 URL 在两個层級里重复挂。
让第二层入口更靠前
把需要被發現的第二层連結放在正文区域靠上的位置,而不是頁脚、侧栏或大段文字之後。頁面的 HTML 体积也尽量压一压,模板里用不到的样式和脚本能删就删。
用 sitemap 做补位
分层入口頁适合做發現路径,sitemap 更适合做覆盖面的兜底。两层 URL 都寫進 sitemap,並在 robots.txt 里声明地址,比單纯依赖頁内連結稳一些。注意 sitemap 里只放 200 狀態、可正常訪問的地址。
检查中間环节
第一层到第二层之間如果還有跳轉,尽量用 301 直達,避免多次 302 串联。跳轉鏈太長时,抓取预算消耗在中間頁上,第二层就更难轮到。
邊調整邊观察
改完之後不要急着下结论。抓取频率的變化通常有滞後,按周對比日誌里第二层的請求量、响應狀態分布和首次出現時間,比看單日資料有意义。如果两周後第二层依舊没有請求记錄,再回头逐一核對上面几條原因,而不是繼續加連結數量。
入口頁分层的作用是给搜尋蜘蛛提供一條清晰、可達的路径,它不保證目标 URL 一定被抓取或被收錄。發現、抓取、索引是三件事,任何一层出問题都會让最终结果停在某個环节。
實际操作中,宁可把层級做浅一点、每层連結少一点,也不要為了覆盖面把结构做得又深又乱。结构越简單,出現「只抓到第一层」這種情况的概率越低,排查起来也越快。