Предложение Манни исключить POST и HEAD действительно было правильным, потому что я искал отрицательные совпадения (поэтому не должен ограничиваться GET, как при разборе строк запроса). Аналогично с ошибкой в точке перед хостом без www, а также с необходимостью устранения "-" (без реферера)
Кроме того, я исключил все совпадения с файлами изображений, которые чаще всего не являются прямыми рефералами с внешних сайтов, но встроены в эти сайты или индексируются поисковой системой (в основном Google Images).
Я также обнаружил, что многие файлы изображений сервера содержат пробелы в именах файлов, что нарушает регулярное выражение, где \ S + использовалось для имени файла, я изменил это на. +
Наконец, поскольку мне не нужно было опровергать дату при удалении записей, я мог упростить первую часть регулярного выражения.
Результат намного ближе к ожидаемым цифрам. Хотя мне еще предстоит найти хороший способ устранить все запросов от ботов и пауков.
Для тех, кто заинтересован, финальный код выглядит следующим образом:
my $totalreferals = 0;
while ( my $line = <$fh> ) {
if ($line !~ m!
\[.+\]
\s("\S+\s.+\sHTTP/\d.\d"
\s\S+
\s\S+
\s("-"|"http://(www\.|)mywebsite\.com.*")|
"\S+\s.+\.(jpg|jpeg|gif|png)\sHTTP/\d.\d"
\s\S+
\s\S+
\s".*")
!xi
)
{
$totalreferals++;
}
$line =~ m!
\[(\d{2}/\w{3}/\d{4})(?::\d\d){3}.+?\]
\s"GET\s(\S+)\sHTTP/\d.\d"
\s(\S+)
\s\S+
\s"http://w{1,3}\.google\.
(?:[a-z]{2}|com?\.[a-z]{2}|com)\.?/
[^\"]*q=([^\"&]+)[^\"]*"
!xi or next;
my ( $datestr, $path, $status, $query ) = ( $1, $2, $3, $4 );
.
.
#do other stuff
.
.
}
Редактировать : В ходе моего исследования кажется, что единственный действительно жизнеспособный способ отличить автоматических сканеров от реальных посетителей - это отслеживание файлов cookie. Я сомневаюсь, что есть способ объяснить это с помощью чистого анализа журнала. Если кто-нибудь знает способ сделать это путем анализа журналов, пожалуйста, дайте мне знать. Насколько я знаю, я просто добавлю сноску к своим отчетам в журналах, в которой указано, что они включают трафик ботов.