很多人把“URL 被發現”当成“URL 會被抓”的同义词,于是在 sitemap 里加了一批地址、在頁面上挂了几條内鏈,就開始盯日誌。结果發現日誌里迟迟没有動静,或者出現的時間比预想的晚很多。這中間的差距,通常不是蜘蛛没看见,而是 URL 已经排進了抓取队列,只是還没轮到。
發現和抓取之間隔着一條队列
蜘蛛的工作大致可以拆成几步:發現 URL、把 URL 放進待抓队列、按某種顺序取出並請求、解析结果、再把新連結放回队列。發現只是第一步。真正决定“什么时候抓”的,是队列的排序和取出速度。
這條队列並不针對某一個站,而是所有已知 URL 混在一起調度。所以一個站点能否很快被抓,既取决于自己 URL 的重要程度,也取决于蜘蛛当时整体的负载。
队列不是先進先出
如果按提交時間排队,蜘蛛會很快陷入低價值頁面的泥潭。實际調度里通常有几层考虑:
- 主机級限流:同一個域名下的請求會被限制並發數和频率,避免把站点打垮。站点越大、响應越慢,單位時間内能取走的 URL 就越少。
- 頁面優先級:被内鏈频繁指向、靠近首頁、有明顯更新的 URL,一般會排在前面。
- 重訪調度:已经抓過的頁面會按更新频率安排下次訪問,這部分會持續占用队列額度。
這三件事叠加起来,就解释了為什么同样一條内鏈,放在首頁導航和放在第五层目錄里,被抓的時間可能差很多。
队列积压时,你會看到什么
- 新 URL 在日誌里出現得越来越晚,明明發布了几天,第一次抓取還在等。
- 老頁面的重訪間隔被拉長,明明改過内容,也没有很快回来。
- 深层頁面、參數頁、分頁尾部的 URL 基本不動。
- 站点响應變慢或频繁返回 5xx 时,抓取量整体下降,恢复後也要過一段時間才回到原来水平。
這些現象都不是“蜘蛛不来了”,而是队列在正常消化,只是被消化的是別的 URL。
让重要 URL 少排队,可以做几件事
- 减少低價值 URL 的數量:篩選參數、排序參數、重复的列表頁,能規范就規范,能屏蔽就屏蔽。队列額度是有限的,少一半無效 URL,等于给有效 URL 腾出空間。
- 把响應時間压下来:同一個主机限流下,响應快意味着單位時間能抓更多。首字节時間、資料库查询、外部接口調用,都是可以下手的地方。
- 保證狀態碼稳定:频繁的超时、连接中断、5xx 會让蜘蛛降低對该主机的抓取强度,恢复需要時間。
- 用内鏈把重要頁面放在近處:首頁、栏目頁、相關推荐里给出連結,比埋在多层目錄里更有效。
- 把 sitemap 当成补充:它能告诉蜘蛛有哪些 URL,但不改變队列的排队規則,也不保證優先被抓。
怎么观察等待時間
日誌里可以關注几個点:新 URL 從第一次被外部引用到第一次被蜘蛛請求之間隔了多久;同一批 URL 的抓取時間是否越来越分散;站点响應變慢的那几天,抓取條數有没有同步下降。把這些時間点對齐,往往能看出問题出在發布节奏、站点性能還是連結结构。
队列的排序規則不公開,也不承诺任何 URL 一定在某個時間内被抓。把可观察的环节做好——响應稳定、结构清晰、低價值 URL 少——比盯着某一條連結等日誌更實际。