很多做蜘蛛池的人會盯着日誌看两件事:入口頁有没有被搜尋蜘蛛訪問,目标 URL 有没有被抓。当入口頁被訪問了、連結也被解析到了,但目标 URL 迟迟没有出現在日誌里,就容易得出“入口頁没用”的结论。實际上,從連結被發現到真正發起抓取請求,中間是有一段不确定的等待的。理解這段等待,比反复換入口頁更有用。
發現和抓取是两個獨立動作
搜尋蜘蛛訪問入口頁时,做的是讀取和解析:它拿到 HTML,抽出連結,把這些 URL 放進待抓取列表。真正抓取目标 URL 是後面另一件事,可能由同一只蜘蛛在几分钟後完成,也可能排進队列等更久。所以“發現”只能說明 URL 進入了候選池,不等于马上被請求。
待抓取队列不是一個先進先出的队列
队列里同时躺着大量 URL,調度时會參考多種因素:站点整体權重、頁面歷史更新频率、URL 结构是否干净、此前是否被抓過、返回過什么狀態碼等。同样是入口頁里放出来的連結,落在不同域名下,等待時間差很多是很正常的。
常见的“卡在等待”的原因
- 目标域名此前抓取体驗差,比如经常超时、返回 5xx,調度會主動放慢。
- 目标域名抓取配額已经被其他 URL 占满,新發現的 URL 要排队。
- 連結出現在入口頁很靠後的位置,或者入口頁体积過大,解析时被截断。
- 入口頁本身质量太低,連結虽被讀到,但来源頁没有被認為值得繼續跟進。
- 同一目标 URL 在短時間内被大量入口頁重复指向,反而触發去重,只保留一次待抓。
這些原因里,只有一部分和入口頁寫法有關,另一部分取决于目标站点自身的情况。把两類問题混在一起,就容易誤判。
可以按什么顺序排查
- 先確認入口頁确實被訪問,且响應碼是 200,返回内容里能看到連結。
- 再看連結是不是可被解析的 a 标簽,href 是完整可訪問地址,没有被脚本二次改寫。
- 然後單獨查目标 URL:是否被 robots.txt 拦截、能否正常返回 200、服務器响應時間是否過長。
- 接着看目标域名整体的抓取情况,如果這個域名本来就很少被抓,等待時間長属于正常。
- 最後再考虑入口頁的多样性,用不同域名、不同路径的入口頁分散指向,而不是同一個入口頁反复堆連結。
减少重复指向,比增加指向數量更有意义
不少人习惯把一個目标 URL 挂到很多入口頁上,認為越多越保險。實际结果往往是這些入口頁互相之間没有增量信息,調度侧只把它当成同一個 URL 的多條来源记錄。與其堆數量,不如让入口頁本身有一定内容差异,並且保持稳定可訪問。
發現只是把门推開一條缝,抓取是另一回事。入口頁能做的是提高被讀到的概率,不能替代目标站点自身的可抓取性。
记錄比猜测更有效
如果長期在做這類測試,建议固定记錄几項:入口頁訪問時間、目标 URL 首次被發現的時間、實际被抓的時間、返回狀態碼。有了這几列資料,一段時間後就能看出大致規律——是入口頁没被讀,還是讀了但目标域名本身不被待见。凭感觉換入口頁,通常只是把同一個問题重复一遍。