【结论】bytes 单独看确实没意义,但它和 Accept-Encoding、中止连接、gzip 开关这几个隐藏变量绑在一起时,是最省事的抓取质量体检指标——前提是你得先确认自己的 log_format 记的是 $body_bytes_sent 还是 $bytes_sent,两者差 200~400 字节,跨月对比前必须锁死。
【展开】把你截断的那条 awk 补完,combined 格式下 $9 是状态码、$10 是字节数:
# 百度蜘蛛各状态码请求数与平均响应体
awk '$0 ~ /Baiduspider/ {c[$9]++; s[$9]+=$10}
END {for(k in c) printf "%s\t%d次\t平均%.1fKB\n", k, c[k], s[k]/c[k]/1024}' access.log | sort
# 按小时看抓取节奏,判断配额是否被大文件吃掉
awk '$0 ~ /Baiduspider/ {split($4,t,":"); n[t[2]]++; b[t[2]]+=$10}
END {for(i in n) printf "%s时\t%d次\t%.1fKB/次\n", i, n[i], b[i]/n[i]/1024}' access.log | sort -n
两个比"看数值大小"更有效的判断法:一是拿 spf 的 UA 日志里看它有没有带 Accept-Encoding: gzip,真 Baiduspider 基本都带,假蜘蛛往往裸请求,同一批 URL 的 bytes 会明显偏大(未压缩);二是把自己站点的真实页面大小和日志 bytes 对一下,200 状态下如果 bytes 长期比预期小一个数量级,优先查 SPA 空壳或 WAF 拦截页。
【坑】别忽略客户端中断:蜘蛛超时断连时,nginx 记的 $body_bytes_sent 是已发出去的部分,会出现"200 + 极小 bytes",误判成软 404 就查偏了,这种情况配合 $request_time 一起看更准。另外 CDN 边缘日志和源站日志的字节数不是一回事,混合分析前先分源。最后建议 log_format 定下就别改,中途从 $body_bytes_sent 换成 $bytes_sent,历史对比数据全废。