蝙蝠岛资源网 Design By www.hbtsch.com
前言
即将用到爬虫,于是打算收集一下User Agent(UA)数据。接着马上想到自己网站的访问日志不就是现成的优质数据源吗?于是愉快的决定写个脚本统计一下Nginx访问日志中的UA信息。
这类简单操作,用脚本语言就足够,毫无疑问肯定要用最熟悉的PHP。打开vim就开撸,十几分钟下来,功能简单的统计脚本就搞定了。
脚本目前有三个功能:
1. 找出所有的UA信息并排序; 2. 统计操作系统数据; 3. 统计浏览器数据。
程序运行截图如下:
1、UA信息
2、操作系统信息
3、浏览器
用脚本统计最近一个月的访问日志,得到以下结果:
- 搜索引擎爬虫比较频繁,每天有好几千次数据访问;
- Windows仍是份额最大的操作系统,Linux桌面依然份额很小;
- Chrome目前是浏览器领域的霸主,其次是Firefox,Opera已经很小众了。
最后附上PHP脚本的代码,也可以从本人的Github里找到:https://github.com/tlanyan/Scripts/blob/master/statUA.php
#!/usr/bin/php
<"/") . "/*access.log*");
}
function statFiles(array $files) : array {
$stat = [];
echo PHP_EOL, "start to read files...", PHP_EOL;
foreach ($files as $file) {
echo "read file: $file ...", PHP_EOL;
$contents = getFileContent($file);
foreach ($contents as $line) {
$ua = getUA($line);
if (isset($stat[$ua])) {
$stat[$ua] += 1;
} else {
$stat[$ua] = 1;
}
}
}
echo "stat all files done!", PHP_EOL, PHP_EOL;
return $stat;
}
function getFileContent(string $file) : array {
if (substr($file, -3, 3) === ".gz") {
return gzfile($file);
}
return file($file);
}
function getUA(string $line) : "', $offset);
if ($pos === false) {
echo "Error! Unknown line: $line", PHP_EOL;
return null;
}
$count ++;
$offset = $pos + 1;
}
$end = strpos($line, '"', $offset);
return substr($line, $offset, $end - $offset);
}
function usage() {
echo "Usage: php statUA.php [option] [dir]", PHP_EOL;
echo " options:", PHP_EOL;
echo " -h: show this help", PHP_EOL;
echo " -v: verbose mode", PHP_EOL;
echo "-n NUM: UA list number", PHP_EOL;
echo " dir: directory to the log files", PHP_EOL;
echo PHP_EOL;
}
function filterUA(array& $stat, array $UAFilters) {
$filterCount = 0;
foreach ($UAFilters as $filter) {
foreach ($stat as $ua => $count) {
if (stripos($ua, $filter) !== false) {
$filterCount += $count;
unset($stat[$ua]);
}
}
}
echo "filter $filterCount records!", PHP_EOL;
}
function printCount(array $stat) {
$sum = array_sum($stat);
foreach ($stat as $key => $count) {
echo $key, " : ", $count, ", percent: ", sprintf("%.2f", 100*$count/$sum), PHP_EOL;
}
}
function statOS(array $UAs) : array {
global $debug;
echo PHP_EOL, "stat OS...", PHP_EOL;
$os = ["Windows", "MacOS", "Linux", "Android", "iOS", "other"];
$stat = array_fill_keys($os, 0);
foreach ($UAs as $key => $count) {
if (strpos($key, "Windows") !== false) {
$stat["Windows"] += $count;
} else if (strpos($key, "Macintosh") !== false) {
$stat["MacOS"] += $count;
// must deal Android first, then Linux
} else if (strpos($key, "Android") !== false) {
$stat["Android"] += $count;
} else if (strpos($key, "Linux") !== false) {
$stat["Linux"] += $count;
} else if (strpos($key, "iPhone") !== false || strpos($key, "iOS") !== false || strpos($key, "like Mac OS") !== false || strpos($key, "Darwin") !== false) {
$stat["iOS"] += $count;
} else {
if ($debug) {
echo "other: $key, count: $count", PHP_EOL;
}
$stat["other"] += $count;
}
}
return $stat;
}
function statBrowser(array $UAs) : array {
global $debug;
echo PHP_EOL, "stat brwoser...", PHP_EOL;
$browsers = ["Chrome", "Firefox", "IE", "Safari", "Edge", "Opera", "other"];
$stat = array_fill_keys($browsers, 0);
foreach ($UAs as $key => $count) {
if (strpos($key, "MSIE") !== false) {
$stat["IE"] += $count;
} else if (strpos($key, "Edge") !== false) {
$stat["Edge"] += $count;
} else if (strpos($key, "Firefox") !== false) {
$stat["Firefox"] += $count;
} else if (strpos($key, "OPR") !== false) {
$stat["Opera"] += $count;
// first Chrome, then Safari
} else if (strpos($key, "Chrome") !== false) {
$stat["Chrome"] += $count;
} else if (strpos($key, "Safari") !== false) {
$stat["Safari"] += $count;
} else {
if ($debug) {
echo "other: $key, count: $count", PHP_EOL;
}
$stat["other"] += $count;
}
}
return $stat;
}
function parseCmd() {
global $debug, $num, $path, $argc, $argv;
$optind = null;
$options = getopt("hvn:", [], $optind);
if ($argc > 2 && empty($options)) {
usage();
exit(1);
}
if (isset($options['h'])) {
usage();
exit(0);
}
if (isset($options['v'])) {
$debug = true;
}
if (isset($options['n'])) {
$num = intval($options['n']);
if ($num <= 0) {
$num = 10;
}
}
if ($argc === 2 && empty($options)) {
$path = $argv[1];
}
if ($argc > $optind) {
$path = $argv[$optind];
}
if (!is_dir($path)) {
echo "invalid directory: $path", PHP_EOL;
exit(1);
}
if ($debug) {
echo "num: $num", PHP_EOL;
echo "verbose: ", var_export($debug, true), PHP_EOL;
echo "path: $path", PHP_EOL;
}
}
if (version_compare(PHP_VERSION, "7.1") < 0) {
exit("scripts require PHP >=7.1");
}
$path = ".";
$debug = false;
$num = 10;
$UAFilters = [
"spider",
"bot",
"wget",
"curl",
];
parseCmd();
$files = getFileList($path);
if (empty($files)) {
echo '"' . realpath($path) . '" does not contain access log files.', PHP_EOL;
exit(0);
}
$allUA = statFiles($files);
if (empty($allUA)) {
echo "no data", PHP_EOL;
exit(0);
}
filterUA($allUA, $UAFilters);
// sort array with count
uasort($allUA, function ($a, $b) {
return $b - $a;
});
if ($debug) {
print_r($allUA);
}
echo PHP_EOL, "---- top $num UA ----", PHP_EOL;
printCount(array_slice($allUA, 0, $num));
echo "-------------------", PHP_EOL;
$os = statOS($allUA);
echo PHP_EOL, "os count:", PHP_EOL;
printCount($os);
$browser = statBrowser($allUA);
echo PHP_EOL, "browser count:", PHP_EOL;
printCount($browser);
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
蝙蝠岛资源网 Design By www.hbtsch.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
蝙蝠岛资源网 Design By www.hbtsch.com
暂无利用PHP如何统计Nginx日志的User Agent数据的评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2025年10月30日
2025年10月30日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]


