不少站長核對服務器日誌时都會遇到同一個問题:Sitemap 里提交了几萬條 URL,被蜘蛛真正抓過的却只有一部分,剩下的大半像是不存在。這不一定是内容质量問题,更常见的原因是抓取覆盖率没做起来——站点里可被抓取的 URL 有多少,蜘蛛實际走過多少,两者之間的差距往往出在结构和入口上。
URL 被“發現”和被抓取,是两件事
蜘蛛先通過外鏈、内鏈、Sitemap、提交入口知道某個地址存在,把它放進待抓队列,然後再按队列顺序、抓取预算和站点响應情况决定什么时候来。也就是说,URL 被寫進 Sitemap 只是拿到了号碼牌,並不等于會被立刻叫号。如果一個頁面既没有内鏈指向,也没有外鏈提到,Sitemap 就是它唯一的入口,優先級自然偏低。
覆盖率上不去,通常卡在這几處
入口太深,内鏈太稀
從首頁点五层才到詳情頁,中間還只有一條連結,蜘蛛爬到這里时预算已经消耗得差不多了。深层頁面不是不能被抓,而是抓取频率會被明顯压低,站点一更新,它們往往排在队尾。
孤岛頁:只有 Sitemap 認识它
有些頁面是程序生成後直接塞進 Sitemap 的,站内没有任何地方鏈過去。這種頁面在蜘蛛看来缺乏上下文,既不知道它和哪些頁面相關,也拿不到锚文本信息,很容易長期停在“已發現未抓取”。
參數地址稀释预算
篩選、排序、分頁參數组合出的地址動辄成千上萬,内容却大同小异。蜘蛛在這些地址上花掉的請求數,會直接挤占正常内容的抓取額度。用 robots.txt 屏蔽無意义參數、给必要參數固定顺序,能把预算還回来一部分。
服務器慢,预算耗在等待里
平均响應時間看着還算正常,但長尾請求偶發很慢,蜘蛛的並發连接會被這些慢請求占住。抓取预算是按時間和並發算的,等待久了,能抓的頁面數就下来了。資料库慢查询、未缓存的列表頁、第三方脚本阻塞,都可能造成這種结果。
重复内容與狀態碼問题
同一份内容挂在多個地址、软 404、层层重定向,都會让蜘蛛把力气花在走回头路上,而不是去發現新的 URL。
怎么算一遍自己的抓取覆盖率
- 導出 Sitemap 或用站内爬取工具跑一遍,得到站点可抓 URL 列表;
- 從服務器日誌里筛出主流搜尋蜘蛛的請求,去重後得到被抓 URL 列表;
- 两邊做差集:從未被抓過的、只被抓過一次的、被抓過但狀態碼異常的,分開看;
- 按目錄和模板類型归類,判断是某類頁面整体缺失,還是零散分布。
差集里如果某一類模板集中出現,多半是内鏈或入口的問题,而不是内容本身。
把覆盖率提上来的几個動作
- 补内鏈:從相關文章、聚合頁、導航里给出至少一條稳定路径,锚文本寫清楚指向什么。
- 压缩层級:重要内容尽量控制在三到四跳以内,列表頁用分頁或加载更多保留可抓入口。
- 减少無效地址:參數、會话 ID、排序變量能固定就固定,不能固定就屏蔽。
- 保證响應稳定:單獨观察蜘蛛請求的長尾延迟,缓存高频訪問頁面,避免高峰时段整站變慢。
- Sitemap 與内鏈配套:Sitemap 负责告诉蜘蛛有哪些地址,内鏈负责告诉它值不值得走,缺了哪一邊效果都會打折。
抓取覆盖率是長期运营指标,不是一次性任務。站点结构每變一次、内容模板每加一種,都值得重新算一遍差集,看看蜘蛛是不是又被挡在了某條路径之外。