很多站点的抓取情况是靠感觉判断的:最近好像抓得挺勤,或者感觉新頁面一直没動静。感觉容易骗人。真正能回答“蜘蛛翻過哪些 URL”的,只有服務器訪問日誌,加上一份你自己维護的 URL 清單。把這两份東西對起来,抓取覆盖才從印象變成可以核對的事實。
先有一份“期望被發現的 URL”清單
没有清單,日誌就只是一堆路径。清單的来源可以有几個:Sitemap 里提交的地址、栏目頁和列表頁能点到的地址、資料库或後台導出的公開内容地址。合並之後做去重和归一化,把大小寫、结尾斜杠、常见跟踪參數统一成一種寫法,否則同一頁會以多個样子出現,差集算不准。
清單里要先剔除本来就不该被抓的:後台、登入、购物车、批量導出、測試目錄、纯參數篩選頁。這些抓不到是正常的,混在清單里只會制造假問题。
日誌里需要看哪几列
至少保留時間、請求路径、狀態碼、UA、IP、响應字节數和 Referer。只看總量没有意义,一天十萬次請求,可能九萬次都落在几個列表頁和參數頁上,真正的新内容一次没碰。
- 時間:看新頁面發布之後多久出現第一次抓取,而不是看全天總量。
- 路径:確認被抓的是内容頁,還是被篩選參數、分頁、站内搜尋占满了。
- 狀態碼:200 是正常,3xx 看跳轉鏈,4xx 和 5xx 要單獨拉出来。
- 响應字节數:明顯偏小的 200 往往是空壳頁或错誤頁。
- Referer:能大致看出蜘蛛是從哪個入口頁走過来的,對判断内鏈路径有帮助。
UA 只能作為初筛,不能当唯一依據。伪造 UA 的情况不少,结合 IP 段、抓取行為和官方驗證方式一起看更稳妥,這一步不必在本文展開。
做一次差集,看漏掉的 URL 長什么样
把清單里的 URL 和日誌中真實出現過的路径對齐,剩下的就是没有被抓到的部分。這部分通常不是铁板一块,可以分成几類:
- 完全没出現:大概率是没有入口,或者入口藏得太深。
- 只出現一次就再没来過:可能是首轮抓取失敗,或者頁面被判定價值不高。
- 出現過但狀態碼不對:5xx、403、软 404 都會让這一趟白跑。
- 只抓到了參數變体:同一頁有多個地址寫法,被抓的是不是你希望的那個。
漏抓的常见原因
按经驗,原因往往集中在下面几處,而不是“蜘蛛不喜欢這個站”這種说法。
- 内鏈没有指向,Sitemap 里也漏了,頁面等于没有對外通道。
- 連結由脚本渲染後才出現,首轮取到的 HTML 里根本没有這個地址。
- 层級太深,要经過四五层列表才点得到。
- robots.txt、noindex、canonical 設定时誤伤了自己的正常頁面。
- 服務器不稳定,抓几次超时或 5xx 之後,抓取节奏明顯放慢。
- 參數頁太多,把抓取額度大量消耗在低價值地址上。
补漏的先後顺序
补漏不建议從“再多提交几次”開始,先處理會反複製造問题的环节。
- 把服務器和响應狀態稳定下来,5xx、超时、连接重置先解决。
- 检查 robots 和頁面級指令,確認没有誤拦正常内容。
- 给缺入口的頁面补内鏈,從相關栏目頁或正文里自然指向。
- 更新 Sitemap,让清單和站点實际结构保持一致。
- 收敛低價值 URL,减少無效抓取對正常頁面的挤占。
這几步做完再观察日誌,通常能看到原先“完全没出現”的路径開始出現。出現之後還要繼續看第二趟、第三趟,確認不是抓一次就走。
多久核對一次比較合适
内容更新频繁的站点,半個月到一個月核對一次就够,重点是看趋势而不是單次快照。更新慢的站点可以拉長到季度。每次记錄三類數字:清單總量、日誌中出現過的比例、狀態碼異常的比例。连續几次對比,比一次性的结论可靠得多。
抓取覆盖不是一次性驗收,而是持續维護的事。清單、日誌、内鏈、Sitemap 四样東西保持同步,蜘蛛的訪問记錄才有參考價值。