很多时候,蜘蛛“没来抓”並不是它不想来,而是来了、连上了、然後在中途被拖到放弃。抓取日誌里留给你的信息通常只有一行:狀態碼缺失、耗时很長、或者干脆记成一個超时。想把問题解决掉,得先知道這段時間到底花在了哪一段上。
一次抓取由几段時間拼成
從蜘蛛的角度看,訪問一個 URL 並不是一個動作,而是一串按顺序發生的步骤,每一步都可能成為瓶颈:
- DNS 解析:把域名換成 IP,解析服務不稳定或 TTL 太短,這一步就會反复消耗時間。
- 建立连接:TCP 三次握手,網絡绕路、防護设备丢包都會让這一步變慢。
- TLS 握手:證书鏈過長、协议版本老舊、會话复用没開,都會多出几個来回。
- 等待首字节(TTFB):服務器真正處理請求的時間,通常是最容易失控的一段。
- 传輸正文:從第一個字节到最後一個字节,頁面体积、压缩開關、连接是否复用都在這里起作用。
這五段加起来,才是蜘蛛感受到的“這個頁面快不快”。只看總耗时,几乎没法判断该改哪里。
超时不是一個數值,而是几道關卡
连接超时
請求還没送到你的應用层,蜘蛛就在等待握手或等首字节时放弃了。表現通常是日誌里没有狀態碼,或者只有一條连接失敗的记錄。這類問题多在網絡鏈路、防火墙、CDN 回源這一段。
讀取超时
连接已经建立,服務器也開始返回資料,但中間停顿太久,或者正文迟迟传不完。這種情况往往能在日誌里看到一個狀態碼,同时耗时明顯高于同站其它頁面。它指向的是應用處理慢、資料库慢、或者响應体太大。
抓取日誌中的“超时”只說明结果,不說明原因。同一條记錄背後可能是 DNS 問题,也可能是某個慢查询,處理方向完全不同。
哪些情况會被记成抓取失敗
- 返回 5xx:應用出错、上游超时、後端服務被重啟。
- 连接被重置:防護策略、並發限制、或协议层不匹配。
- 429 或類似的限速响應:抓取频率触發了阈值。
- 空响應或截断的正文:传輸中途断開,蜘蛛拿到一個不完整的頁面。
- 4xx:嚴格说不是超时,但大量 404、403 同样會让蜘蛛在這條路径上白跑。
建议把這几種分開統計,而不是笼统算作“抓取異常”。分開之後,往往一眼就能看出是集中在某個目錄、某個子域,還是全站普遍。
自查:把時間花在哪一段量出来
- 先從抓取日誌里筛出耗时明顯偏高的 URL,按目錄归類,看是否有規律。
- 用命令行工具對同一批 URL 做多次請求,輸出各阶段耗时,而不是只看總時間。
- 连續采样若干次,關注最慢的那几次,而不是平均值。蜘蛛撞上的往往就是最慢的那次。
- 分別對比:带缓存與不带缓存、静態頁與動態頁、首頁與深层頁。
- 如果耗时集中在首字节,往應用和資料库方向查;如果集中在传輸,往体积、压缩和连接复用方向查。
- 換一台不同網絡的机器再测一次,確認問题在服務端還是鏈路侧。
常见的拖慢点與處理方向
- 頁面依赖未缓存的复杂查询,建议给高频被抓取的模板頁加缓存层。
- 正文未压缩或压缩未生效,检查压缩是否覆盖了蜘蛛常抓的内容類型。
- 渲染依赖外部脚本,脚本超时導致整頁等待,建议關键内容先服務端輸出。
- CDN 回源超时設定短于源站正常响應時間,造成周期性失敗。
- 连接复用未開啟,每個請求都重新握手,累积起来很可观。
不需要一次把所有点都改完。先确定耗时集中在哪一段,再動那一段的配置,改完用同样的方式复测,看耗时曲线有没有變化。稳定而可预期的响應時間,比偶尔很快、偶尔超时要更有價值。