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

蜘蛛爬虫分析中怎么统计不同搜索引擎蜘蛛的抓取占比?

liulian
liulian 归队站长新人站长
发布于 2026-10-14 00:18 ·1 浏览 ·3 回复
内容摘要

统计不同搜索引擎蜘蛛抓取占比,应从Web日志按UA关键字识别,分子为某蜘蛛请求数、分母为所有搜索引擎蜘蛛请求数,排除真人流量和第三方AI工具,固定统计周期并用awk管道计算。

蜘蛛爬虫分析中怎么统计不同搜索引擎蜘蛛的抓取占比?,本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-1921.html
转载请注明出处,版权归原作者所有。
他们都看过 1 人浏览过
GJ论坛站长
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 3

周末
周末 新人站长 1楼 2026-10-14 00:40

这条管道跑小日志没问题,但真上生产日志(GB 级、带压缩、UA 被伪造)时有几个地方会翻车,补几条更稳的写法。

第一,grep -oE 会重复计数。 -o 输出的是所有非重叠匹配,如果某条请求的 UA 里同时拼了 bingbot 和 googlebot(假蜘蛛特别爱这么干),这一行会被计两次,分母虚增。稳妥做法是放弃 grep -o,用 awk 单遍扫描,按优先级只归一类:

gawk '{$0=tolower($0);
if($0~/baiduspider/)k="baiduspider";else if($0~/googlebot/)k="googlebot";
else if($0~/bingbot/)k="bingbot";else next;n[k]++}
END{for(k in n)printf "%-14s %8d\n",k,n[k]}' access.log

顺序要按关键字重叠度排,baiduspider 放前面是因为它还有 -render、-image 后缀变体,粗匹配先吃掉。

第二,日志多半是压缩的。 logrotate 之后是 access.log.1.gz,直接用 zgrep/zcat 或者 find . -name 'access.log*.gz' -exec zcat {} + | 合并再统计,否则你统计的只是当天还没归档的那一小段。

第三,口径先跟团队定死。 按请求数还是按 URL 去重,结果能差一倍以上。去重可以加 !seen[$1"|"$7]++ 只统计首次抓取。

最后提醒一个最常被忽略的点:Baiduspider 占比某天突然从 40% 冲到 75% 基本都是伪造 UA,必须反查 IP 域名再正向解析回验;另外 Bytespider、GPTBot 这些到底算不算“搜索引擎”,建议在团队内写进统计口径文档,不然不同人跑出来的环比数字永远对不上。

域名注册
域名注册 版主归队站长新人站长 👑年卡会员 #1428 2楼 2026-10-14 00:53
周末:这条管道跑小日志没问题,但真上生产日志(GB 级、带压缩、UA 被伪造)时有几个地方会翻车,补几条更稳的写法。 **第一,`grep -oE` 会重复计数。*…

这条补充基本把生产环境的坑补齐了,但优先级 if 链和去重键这两处再收一下,占比才真对得上。

一是别对整行做关键字匹配。$0~/baiduspider/ 会把 URL、Referer 里带关键字的请求也算进来——随便有人访问 /baiduspider-test 就被计一次。先切出 UA 再看:split($0,a,"\""); ua=tolower(a[6]),然后只匹配 ua。顺带一提,tolower($0) 会把整行重建、触发重新分词,GB 级日志下开销不小,用变量接更划算,前面加 LC_ALL=C。

二是分母。if 链只认 baidu/google/bing 三种,其余 next 掉,做百分比时分母天然偏小。建议分两步:先判定 ua~/spider|bot|crawler/ 计入总蜘蛛数,再在蜘蛛集合内归类,剩下归 other 桶输出,这样新增 Sogou、PetalBot 时不用改分母逻辑。

三是 !seen[$1"|"$7]++,$7 在默认 combined 下确实是路径,但一旦加了 $http_x_forwarded_for 或自定义 log_format,字段就整体错位,去重会静默失效。保险点用 split($0,a,"\"") 取请求行当键。另外按 IP+URL 去重会把同一爬虫不同出口 IP 算成多次,要按 URL 口径就直接用 URL 做键。

补充一个辅助判据:正规蜘蛛 UA 里通常带说明页链接(+http://www.google.com/bot.html),伪造的往往只抄了个名字,配合反查 IP 一起用,误判率能降不少。

chinaz
chinaz 归队站长新人站长 #1438 3楼 2026-10-14 01:12
域名注册:这条补充基本把生产环境的坑补齐了,但优先级 if 链和去重键这两处再收一下,占比才真对得上。 一是别对整行做关键字匹配。`$0~/baiduspider/` …

三点都站得住,尤其「先切 UA 再匹配」和「分母两段式」,我只在「怎么切出 UA」这一格上再拧紧一格。

硬编码 a[6] 和整行匹配是同一个病因——把字段位置当常量。combined 格式下 UA 是最后一个引号字段,所以用 n=split($0,a,"\""); ua=tolower(a[n-1]) 更稳:既避开 $0~/baiduspider/ 把 URL、Referer 误伤的坑,又在 log_format 尾部追加 $http_x_forwarded_for、$request_time 时不会静默错位——你担心的那个场景正好被这句兜住。真会翻车的情况是末尾又挂了个带引号的变量(比如 "$upstream_http_user_agent"),那时 a[n-1] 就不是 UA 了,只能上 FPAT 或把 UA 单独落一份日志。

分母那套两步走没问题,补一个监控点:other 桶要当健康指标看。它长期占三成以上,多半是关键字表过期,新蜘蛛在吃你的分母。

按 IP+URL 去重这条,如果日志是 CDN 回源来的,$remote_addr 是边缘节点 IP,这条最先失效,得先取 XFF 首段再拼键。顺带说一句,XFF 追加在末尾并不影响 a[n-1] 取 UA,跟你的担心正相反,可以放心往后放。

+http://www.google.com/bot.html 这个判据很实用,配合 PTR 反查前先缓存:rDNS 结果落库留 24 小时,别逐条去查,否则反查本身会变成瓶颈。