Стремление товарища mar1ner наблюдать за поисковыми запросами также сподвигло меня на идею написания скрипта, который составлял бы суточную статистику переходов по поисковым запросам на мой сервер. Скрипт запускается в час ночи по локальному времени (cron) и собирает информацию за прошедшие сутки. Запуск в час ночи сделал с поправкой на переход с летнего времени на зимнее и обратно
, на всякий пожарный.
Собственно, сам скрипт выглядит так:
#!/usr/bin/perl
use strict;
my %search_regexp =
(
‘rambler’ => ‘nova\.rambler\.ru\/search\?.*query’,
‘yandex’ => ‘yandex\.ru\/yandsearch\?.*text’,
‘google’ => ‘.*google.*\/search\?.*\&q’,
‘msn’ => ‘search\.live\.com/results.aspx\?q’,
‘yahoo’ => ‘search\.yahoo\.com/search\?p’,
‘nigma.ru’ => ‘nigma\.ru\/index.php\?s’,
‘yes.ru’ => ‘search\.yes\.ru\/index.php\?s’,
‘altavista’ => ‘.*altavista\.com\/web\/results\?.*\&q’
);
my $log_file = ‘/var/log/apache2/access_log’;
my $dest_mail = ‘mail@domain.org’;
my $mail_prog = ‘/usr/sbin/sendmail -t’;
# Get date
my ($day, $month, $year, $wday) = (localtime(time()-2*60*60))[3..6]; # subtract 2 hours
$year += 1900;
$day = sprintf("%02d", $day);
$month = (‘Jan’, ‘Feb’, ‘Mar’, ‘Apr’, ‘May’, ‘Jun’, ‘Jul’, ‘Aug’, ‘Sep’, ‘Oct’, ‘Nov’, ‘Dec’)[$month];
$wday = (‘Sun’, ‘Mon’, ‘Tue’, ‘Wed’, ‘Thu’, ‘Fri’, ‘Sat’)[$wday];
# replace patterns
foreach (values %search_regexp)
{
$_ = qr(^\d+\.\d+\.\d+\.\d+[^\[]*\[$day\/$month\/$year[^\]]*\]\s*\"GET [^\"]*\"[^\"]*\"http:\/\/$_=([^\&^\"]*)[\&\"]);
}
my $result_hash = { };
if (open LOG_FILE, ‘<’, $log_file)
{
while (my $line = <LOG_FILE>)
{
foreach my $key (keys %search_regexp)
{
if (my ($request) = ($line =~ $search_regexp{$key}))
{
my $counters = ($result_hash->{$key} ||= {});
$request =~ s/\+/ /g;
$request =~ s/\%([a-fA-F0-9]{2})/pack(‘C’,hex($1))/eg;
$counters->{$request} ||= 0;
$counters->{$request}++;
last;
}
}
}
close LOG_FILE;
}
else
{
print "Could not open log file\n";
}
# Now make a mail with information
open MAILER, "| $mail_prog -t";
print MAILER <<MAIL_EOF;
Content-Type: text/html; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
To: $dest_mail
From: webserver\@xskernel.org
Subject: Daily Search Engine Reference Log.
<html><body>
<h1>Daily Search Engine Reference Log.</h1>
MAIL_EOF
foreach my $engine (keys %$result_hash)
{
print MAILER "<h2>Engine: $engine</h2>";
print MAILER "<table width=640><tr><th align=\"left\" bgcolor=\"#96f198\" width=\"550\"><b>Request</b></th><th align=\"center\" bgcolor=\"#96f198\" width=\"90\"><b>Count</b></th>\n";
while (my ($request, $count) = each %{$result_hash->{$engine}})
{
print MAILER "<tr bgcolor=\"#eef196\"><td align=\"left\">$request</td><td align=\"center\">$count</td>\n";
}
print MAILER "</table>\n";
}
print MAILER "</html></body>";
close MAILER;
Может быть, кому-нибудь тоже пригодится
.
Список поисковиков взял тот, что помню, а также тех, что мне подсказали мои товарищи. Если есть ещё какие популярные поисковики, подскажите, может добавлю и их
.
Кстати, aport.ru на запрос "XSystem Kernel Team" выдал фейл, не дав ни одной ссылки на официальный сайт.
З.Ы. Вообще, я не сторонник извращений на Perl и стараюсь делать код более понятным
, с развёрнутыми циклами и прочей ерундой.
Так вот как это делается. Спасибо.
В мемориз. Своего сервака пока нет, но в скором времени предвидится =)