オンライン統計スパイダー、分析ウェブサイトログ スパイダー統計 - Youcaiyouaiwang
どのように行われたか
実際、私の chatGPT が私のために書いてくれたもので、非常に強力です。
したがって、コードの説明はしません。コードを直接アップロードするだけです。ご質問がある場合は、AI に分析を手伝ってもらってください。AI を使用する必要がある場合は、この Web サイトの右上隅に AI ロボットがあります。クリックして使用します
コードのレンダリング
このコードは、typecho で新しい独立したページを作成するために使用されます。自分で選択できます。
<?php
/**
* 蜘蛛统计
*
* @package custom
*/
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
$this->need('header.php');
?>
<title>在线网站日志分析-在线蜘蛛统计</title>
<meta name="description" content="这是一个方便统计网站蜘蛛的工具页面。上传日志文件后,可以快速显示各大搜索引擎蜘蛛的数量统计结果。">
<div style="background-color: #ffffff; padding: 20px;">
<h1>蜘蛛统计分析工具</h1>
<form method="post" enctype="multipart/form-data">
<input type="file" name="logfile" />
<button type="submit">上传日志文件</button>
</form>
<?php
if (isset($_FILES['logfile'])) {
$file = $_FILES['logfile'];
if ($file['error'] === 0) {
$pathinfo = pathinfo($file['name']);
if (strtolower($pathinfo['extension']) === 'log') {
$handle = fopen($file['tmp_name'], "r");
$count = ['Baiduspider' => 0, 'Googlebot' => 0, 'bingbot' => 0, 'Sogou' => 0];
while (($line = fgets($handle)) !== false) {
foreach ($count as $key => &$value) {
if (stripos($line, $key) !== false) {
$value++;
}
}
}
fclose($handle);
arsort($count);
$data = [];
foreach ($count as $key => $value) {
$data[] = [$key, $value];
}
?>
<div id="chart_div" style="width: 900px; height: 500px;"></div>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['corechart']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Browser', 'Visits'],
<?php foreach ($data as $item) { ?>
['<?php echo $item[0]; ?>', <?php echo $item[1]; ?>],
<?php } ?>
]);
var options = {
title: 'Spider Statistic',
pieHole: 0.4,
colors: ['#3366CC', '#DC3912', '#FF9900', '#109618']
};
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
<?php
} else {
echo "<p>请上传.log格式的日志文件。</p>";
}
} else {
echo "<p>上传日志文件出错,请重新尝试。</p>";
}
}
?>
</div>
<?php $this->need('footer.php'); ?>
予防
このコードでは1行ずつ読み込んで処理する方法を実装していますが、nginxやPHPの設定によってファイルアップロードの上限が制限されるため、あまり変更しないことをお勧めします。これにより、ファイル全体を一度にメモリに読み込むことがなくなり、メモリ使用量が削減されます。
しかし、弊社の一般的なウェブサイトのログは非常に大きく、手動でファイルからコピーするのは非常に面倒なので、ログを分割し、今日のログを別のファイルに保存し、それが実行された場合にシェルスクリプトを作成しました。複数回実行すると、ファイルが存在するかどうかが検出されます。ファイルが存在する場合は、そのファイルを書き換えるだけです。
#!/bin/bash
log_path="/www/wwwlogs/www.xxxx.com.log"
log_dir="/www/wwwlogs"
current_date=$(date +%Y-%m-%d)
# 判断日志文件是否存在
if [ ! -f "$log_path" ]; then
echo "日志文件不存在"
exit 1
fi
# 判断备份目录是否存在,不存在则新建
if [ ! -d "$log_dir" ]; then
mkdir -p $log_dir
fi
# 判断今天的日志文件是否已经存在,存在则将日志内容追加到已存在的文件中,不存在则新建文件
if [ -f "$log_dir/$current_date.log" ]; then
grep $(date +"%d/%b/%Y") $log_path >> "$log_dir/$current_date.log"
else
grep $(date +"%d/%b/%Y") $log_path > "$log_dir/$current_date.log"
fi
忘れずに場所を変更し、パゴダのスケジュールされたタスクを使用して、1 日に数回、または数時間に 1 回実行します。
道順を更新する
これは単なる実現であり、統計的手法ではクロールされたスパイダーの累積数のみを認識し、クロールされたページや個々のスパイダーの数などはカウントしません。これを含めてインターフェイスを美しくすることもできます。後で更新します。必要であれば。