在服務器日誌里,经常能看到某個 URL 第一次被抓取的時間,比它上线的時間晚了好几天甚至几周。很多人把這归结為“蜘蛛没發現”,但實际鏈條更長:連結被發現、URL 進入待抓队列、調度器决定何时抓取,是三個獨立的环节。把它們混在一起,排查方向就容易跑偏。
發現、入队、抓取是三件不同的事
發現,只是意味着某個連結被蜘蛛讀到,並提取出一個規范化後的 URL。這一步通常很快,只要頁面被訪問過、連結在 HTML 里可见,就有机會完成。
入队,是把 URL 寫進待抓列表。這里會出現两個损耗:一是重复 URL 被合並,同一個頁面通過不同參數、不同路径到達,通常只會留下一個代表;二是優先級較低的 URL 被排在後面,队列越長,等待越久。
抓取,才是真正發出請求。它受調度策略影响,與站点歷史响應质量、内容更新节奏、入口可信度都有關系。
發現說明 URL 存在,抓取才决定它是否被讀取,两者之間隔着队列和調度。
队列里大致發生了什么
待抓队列並不是先到先服務。調度器更在意抓取效率和内容新鲜度,常见的取舍包括:
- 更新频繁、响應稳定的站点,重訪間隔更短;
- 响應慢或经常出错的 URL,重訪频率會被压低;
- 參數化、内容高度重复的 URL,優先級通常較低;
- 新發現的 URL 往往需要排队,不會立刻被抓。
所以,一個结构清晰、响應稳定的站点,新 URL 的首次抓取通常比结构混乱的站点更快。
怎么观察這三個阶段
用服務器日誌看首次抓取
過滤搜尋引擎 UA,找出目标 URL 第一次出現的時間,和它實际上线的時間做對比。如果長期没有记錄,先確認頁面是否存在可被讀取的連結入口,再考虑其他原因。
用站点地图和内鏈交叉驗證
如果 URL 只出現在 Sitemap 里,而内鏈中没有入口,首次抓取時間往往更長。反過来,如果它在導航或正文中被高频引用,被抓到的机會就更大。两條路径的差异,本身就是判断依據。
检查是否存在队列积压
如果某個栏目下有大量低價值頁面同时上线,比如篩選结果頁、時間归档頁,它們會一起進入队列,稀释真正重要頁面的抓取机會。這时候观察日誌,往往能看到一批相似 URL 轮流被訪問,而核心頁面迟迟没有動静。
可以做的几件事
- 保證入口可達:連結在返回的 HTML 中直接可见,不依赖鼠标悬停或脚本注入;
- 控制新 URL 的产出节奏:分批上线,避免一次性放出成百上千個頁面;
- 收敛重复入口:參數、大小寫、尾斜杠统一處理,减少队列中的冗余項;
- 保持服務器稳定:响應時間波動過大,重訪間隔會被拉長;
- 给重要頁面更多内鏈:入口越明确,越容易被調度到。
两個常见的誤判
把“還没被抓”当成“被拒绝”
更多时候只是還没轮到。可以過一段時間再观察日誌,而不是立刻改结构、換入口。
把“抓了没收錄”当成抓取問题
抓取和收錄是两件事,抓取只是前置條件。如果日誌里已经能看到蜘蛛訪問,接下来要看的就不是队列,而是頁面本身的内容與结构。
排查這類問题,重点始终是時間差:從上线到被讀到的間隔是多少,中間哪一环最慢。把發現的路径、队列的拥堵情况和抓取的實际记錄放在一起看,比反复猜测有效得多。