Статистика.

Январь 11th, 2009 по SadKo Оставить ответ »

Стремление товарища 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 и стараюсь делать код более понятным ;) , с развёрнутыми циклами и прочей ерундой.

Реклама

2 комментариев

  1. Так вот как это делается. Спасибо.

  2. В мемориз. Своего сервака пока нет, но в скором времени предвидится =)

Добавить комментарий

Blue Captcha Image
Refresh

*