入口頁把連結放出去之後,很多人的预期是“蜘蛛看到就會爬”。實际日誌里更常见的情况是:入口頁已经被訪問了,目标 URL 却要等上几小时甚至几天才出現第一次抓取,有的干脆一直没来。要判断這属于正常現象還是故障,需要先把“發現”和“抓取”分開看。
發現、抓取、索引是三個獨立环节
搜尋蜘蛛讀到入口頁 HTML 里的連結,只完成了發現:它把 URL 记下来,放進待抓取队列。之後是抓取,也就是真正向目标站發請求、取回内容。最後才是索引,决定這個 URL 是否進入搜尋结果。三個环节各有各的瓶颈,而入口頁通常只能影响第一步。
所以“蜘蛛没来”這個描述本身太粗。要区分是連結没被發現,還是發現了但排队慢,還是抓了却没被收錄。几件事混在一起讨论,很容易把入口頁改来改去却看不到效果。
從發現到抓取,中間要過哪些环节
連結入库與去重
蜘蛛解析出一個 URL 後,會先做規范化處理:合並跟踪參數、统一大小寫與结尾斜杠、跟随跳轉确定最终地址。如果同一個目标 URL 在池子里以多種寫法出現,多出来的部分通常會被当成重复項合並。這也是為什么同一批目标 URL 分散在多個入口頁时,日誌里的抓取次數往往不會按入口頁數量成倍增長。
排队與優先級
待抓取队列不是先来先服務。目标站的响應速度、歷史抓取成功率、頁面本身的重要程度,都會影响它排在什么位置。一個長期响應慢或经常报错的站点,即使被大量發現,抓取节奏也會被压下来。
重试與退避
第一次抓取失敗(超时、5xx、连接被重置)通常不會立刻放弃,而是按退避策略延後重试。如果目标 URL 连續多次失敗,間隔會越拉越長,日誌上看起来就像“来過一次就再也不来了”。
為什么日誌里只有一部分連結被訪問
- 入口頁的連結數遠大于该目标站能分到的抓取額度,剩下的只能慢慢排队;
- 目标 URL 本身重复,被去重後只保留一份;
- 連結位于需要执行脚本才會出現的位置,實际並未進入發現队列;
- 目标站返回 4xx 或 5xx 較多,触發退避,抓取被主動放缓;
- 入口頁自身的抓取频次偏低,新連結入库自然也慢。
一套從日誌出發的排查顺序
- 先確認入口頁有没有被正常抓取,返回碼是不是 200;
- 再看入口頁被抓取的時間点,是否明顯晚于你放連結的時間;
- 查目标 URL 是否出現過任何一次訪問记錄,哪怕這次是失敗的;
- 出現過一次的,重点看返回碼和目标站的响應時間;
- 一次都没出現的,先检查連結是否真的在初始 HTML 里;
- 最後再评估入口頁數量與目标 URL 總量的比例是否嚴重失衡。
能主動做的几件事
- 把目标 URL 放在初始 HTML 的靠前位置,减少被中途截断的可能;
- 同一目标 URL 在池内保持一致的寫法,减少無意义的重复項;
- 保證目标站可稳定訪問,避免连續失敗把重试間隔拉長;
- 入口頁本身保持轻量、响應稳定,让它被訪問得更勤一些;
- 记錄每次新增 URL 的時間,用日誌驗證而不是凭感觉判断。
發現只是起点。把“没被發現”和“發現了但没轮到”分開之後,多數所谓蜘蛛不来的問题,處理方向會清楚很多。