很多人把蜘蛛池入口頁的工作理解成“把 URL 丢進去等蜘蛛来”,但观察服務器日誌會發現,入口頁從被蜘蛛發現到真正被抓完,中間有一段並不短的鏈路。這段鏈路里任何一环出問题,入口頁看起来還在執行,實际却没有起到引路作用。這篇文章只讲首次抓取這一段。
首次抓取和持續抓取是两件事
首次抓取指的是蜘蛛第一次拿到你的 URL、發起請求、收到响應並决定要不要留下记錄。持續抓取則是之後基于内鏈、sitemap、更新信号形成的回訪。两者的失敗原因並不相同:首次抓取更多卡在“發現”和“可達”,持續抓取更多卡在“值不值得再来”。入口頁數量再多,如果首次抓取阶段就断掉,後面的事情無從谈起。
被發現有几種常见路径
- 外部連結:其他站点上指向入口頁的連結,是最传统也最慢的一種;
- sitemap 與主動推送:适合數量可控、更新频繁的入口頁,提交不等于抓取,但能缩短發現時間;
- 站内互鏈:入口頁之間互相連結,蜘蛛從已抓過的頁面顺着連結走到新頁面;
- 入口聚合:聚合頁、列表頁把新入口頁暴露在蜘蛛面前。
這几種路径不是互斥的,實际中往往叠加使用。需要注意的是,站内互鏈如果全是同一批模板、同一批 IP,蜘蛛顺着走一遍之後很容易停止繼續扩展。
從發現到爬完,中間要過几道關
- DNS 解析:解析不稳定或 TTL 太短,蜘蛛的第一次請求可能直接失敗;
- 连接與响應:超时、连接重置、首字节時間過長,都會让蜘蛛提前放弃;
- 狀態碼:403、429、5xx 會让這次抓取被判為無效,也可能影响後續訪問频率;
- robots 與 meta 指令:被誤拦的頁面,蜘蛛看到了 URL 也不會取内容;
- 内容可讀性:正文靠 JS 渲染、主要内容放在 iframe 里,蜘蛛拿到的可能只有空壳。
這几關里最容易被忽略的是第二關。很多人只盯狀態碼,日誌里 200 一片,但响應時間長期在两三秒以上,蜘蛛實际取到的内容可能不完整,或者在超时重试几次之後就不来了。
首次抓取通常很浅
即使一切正常,首次抓取一般也不會把入口頁的所有連結全部爬完。常见表現是:日誌里只有少量請求、只抓了首頁或列表頁、目标 URL 一次都没被訪問。這不一定是入口頁有問题,更常见的原因是蜘蛛還在评估這個站点,抓取深度和频率都被压着。
這时候急着加頁面、加連結,收益往往很小。更值得做的是保證已抓過的頁面能正常返回、能顺着連結走到下一层,让這次浅抓變成長一点的第一步。
让首次抓取更容易完成的一些做法
- 入口頁首屏内容用服務端直接輸出,少依赖异步加载;
- 目标連結放在 HTML 里,而不是等 JS 执行後再插入;
- 保持解析稳定,避免频繁更換 IP 或解析记錄;
- 控制單頁連結數量,避免把大量出口挤在同一頁;
- 對明知會失敗的 URL 做處理,別让蜘蛛反复撞上 404 或 5xx。
首次抓取的成功率更多取决于“可達性”,而不是内容有多丰富。先把路修通,再谈頁面质量。
首次抓取之後看什么
首次抓取完成後,判断入口頁有没有起作用,可以看几個信号:日誌里是否出現對目标 URL 的請求、請求是否来自同一個蜘蛛、後續几天是否還有回訪。如果只有入口頁被抓、目标 URL 始终没有動静,問题通常出在連結层級、連結形式或跳轉方式上,而不是蜘蛛没来。
如果连入口頁本身都只有一次請求,就要回头检查响應速度、狀態碼和解析稳定性。把這些基础項固定下来,再谈批量扩展入口頁,顺序會顺很多。