⭐ 推荐:社区规则条款 V1.0

蜘蛛爬虫分析中如何统计蜘蛛抓取页面的平均响应时间?

liulian
liulian 归队站长新人站长
发布于 2026-10-14 12:06 ·0 浏览 ·2 回复
内容摘要

统计蜘蛛平均响应时间应取Nginx的$request_time而非$upstream_response_time或时间戳差值,以UA正则初筛并反向DNS校验IP,再用awk按蜘蛛计算响应时间总和除以请求数。

蜘蛛爬虫分析中如何统计蜘蛛抓取页面的平均响应时间?,本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-1954.html
转载请注明出处,版权归原作者所有。
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 2

满月居于空
满月居于空 版主资深会员新人站长 👑年卡会员 1楼 2026-10-14 12:26

你上面的字段选型和蜘蛛识别思路基本都对,我只补两块:一条完整可跑的统计命令,和均值之外必须一起看的 P95。

命令接你断掉的部分,假设格式就是你定义的 | 分隔($3=request_time、$5=status、$7=UA):

zcat /var/log/nginx/access.log* | awk -F'|' '
$5==200 && $7 ~ /Googlebot|bingbot|Baiduspider|YandexBot|DuckDuckBot/ {
  s=($7~/Googlebot/)?"Googlebot":($7~/bingbot/)?"bingbot":($7~/Baiduspider/)?"Baiduspider":($7~/YandexBot/)?"YandexBot":"DuckDuckBot"
  t[s]=t[s]$3" "; n[s]++; sum[s]+=$3*1000
}
END{ for(k in sum){ printf "%s\t%d\t%.1fms\n", k, n[k], sum[k]/n[k] } }'

注意 $request_time 单位是秒,乘 1000 才是毫秒,别把 0.145 当毫秒数直接看。

三个容易翻车的点:一是均值会被少数几秒级的慢请求拉高,蜘蛛真实体验看 P50/P95 更准,把耗时存数组排序取分位,或干脆上 goaccess、ClickHouse 做聚合;二是样本少于 1000 条的蜘蛛,均值没有统计意义,小蜘蛛只看趋势别下结论;三是日志被 logrotate 切成 .gz 后别忘了 zcat 带上,跨天统计漏文件会让均值失真。

另外反向 DNS 校验别在线实时跑,蜘蛛 IP 动辄上千,串行 dig 会把脚本拖到分钟级,先导出去重后的 IP 列表离线跑完再回填;UA 正则也是大小写敏感的,加个 tolower($7) 更稳。

lqyyzz
lqyyzz 观望站长 #1494 2楼 2026-10-14 12:34
满月居于空:你上面的字段选型和蜘蛛识别思路基本都对,我只补两块:一条完整可跑的统计命令,和均值之外必须一起看的 P95。 命令接你断掉的部分,假设格式就是你定义的 `|`…

补充的这两块方向对,但那条 awk 直接拿去跑会出两个错——一个是算不准,一个是可能把机器跑挂。

先修命令本身。 t[s]=t[s]$3" " 是在内存里拼一个巨型字符串,百万级请求能吃掉几百 MB,量再大直接 OOM;而且你拼完了也没写取分位的代码。改成按蜘蛛落盘、再用 sort -n 拿分位,同时也顺手把两个坑堵上:zcat 遇到没压缩的 access.log 会报 not in gzip format 并输出空内容,跨天统计会静默丢掉当前日志,得用 zcat -f(或 gz 和裸文件分开 cat);另外 $request_time 在异常请求里可能是 -,而 awk 中 "-"*1000 等于 0,会把均值悄悄拉低——这比被慢请求拉高更隐蔽,必须先过 $3 ~ /^[0-9.]+$/。

```bash
zcat -f /var/log/nginx/access.log* 2>/dev/null | awk -F'|' '
$3 ~ /^[0-9.]+$/ && $5==200 && tolower($7) ~ /googlebot|bingbot|baiduspider|yandexbot|duckduckbot/ {
s=($7~/Googlebot/)?"Googlebot":($7~/bingbot/)?"bingbot":($7~/Baiduspider/)?"Baiduspider":($7~/YandexBot/)?"YandexBot":"DuckDuckBot"
print s"\t"$3*1000 >> ("/tmp/spider_"s".tsv"); n[s]++;