Набор скриптов для анализа сайта

24 сентября 2010

Решил поделиться своими старенькими наработками, которые я использовал около года назад на одном из своих блогов. Архив со всеми скриптами находится здесь. Далее по тексту я вкратце расскажу о его содержимом.

После распаковки архива вы увидите три каталога.

1. Каталог ./counter

Содержит скрипты на Perl, предназначенные для создания картинки-информера. Основной скрипт здесь — это cnt.pl.

#!/usr/bin/perl

use GD;
use strict;

# cnt.pl
# (c) Alexandr A Alexeev 2009, http://eax.me/

my $png = shift;
my $log = shift;

unless($png && $log) {
  print "usage: $0 outfile.png stat.log\n";
  exit 1;
}

chomp(my $rss = `./feedburner-grab.pl eaxme`);
if($?) {
  print "feedburner-grab returns $?\n";
  exit 3;
}

#chomp(my $email = `./subscribe-grab.pl inet.thoughts.eaxme`);
chomp(my $email = `./feedburner-grab.pl eaxme_email`);
if($?) {
  print "email-grab returns $?\n";
  exit 4;
}

chomp(my $lj = `./livejournal-grab.pl afiskon.livejournal.com`);
if($?) {
  print "livejournal-grab returns $?\n";
  exit 5;
}

chomp(my $twitter = `./twitter-grab.pl afiskon`);
if($?) {
  print "twitter-grab returns $?\n";
  exit 6;
}

my $none = "---split---";

chomp(my $pr = `./google-grab.pl eax.me`);
if($?) {
  print "google-grab returns $?\n";
  exit 7;
}

chomp(my $ya = `./yandex-grab.pl eax.me`);
if($?) {
  print "yandex-grab returns $?\n";
  exit 8;
}

open LOG, ">>$log" or die "Failed to open $log\n";
chomp(my $date = `date "+%Y-%m-%d"`);
print LOG "date=$date:rss=$rss:email=$email:lj=$lj:".
          "twitter=$twitter:pr=$pr:ya=$ya\n";
close LOG;

my $im = new GD::Image("template.png");
my $top = 3;

foreach my $i ($rss, $email, $lj, $twitter, $none, $pr, $ya) {
  if($i ne "---split---") {
    $im->line(84-6*length($i), $top+10, 87, $top+10, 0);
    $im->string(gdSmallFont, 84-6*length($i), $top, $i, 2);
    $top += 10;
  }
  $top += 6;
}

open PNG, ">$png" or die "Failed to open $png\n";
binmode PNG;
print PNG $im->png;
close PNG;

Пример информера

С помощью скриптов *-grab.pl происходит определение числа rss-подписчиков на сайт, количество друзей в Twitter и LiveJournal, а также тИЦ и PR сайта. Эти скрипты не особо интересные — они просто загружают определенные веб-страницы и обрабатывают их с помощью регулярных выражений. Затем полученные цифры подставляются в картинку-шаблон. Самое сложное здесь — найти правильные координаты для вывода значений. Справа вы видите (никогда не угадаете!) пример информера.

Внимательный читатель спросит, а зачем cnt.pl пишет какие-то логи? Это сделано для того, чтобы потом можно было отследить динамику изменения числа подписчиков на сайт. За построение соответствующего графика отвечает скрипт graph.pl. Вот наиболее интересная его часть:

my $graph = GD::Graph::lines->new(1000, 600);

$graph->set(
  x_label           => decode($cp, 'Дата'),
  y_label           => decode($cp, 'Кол-во'),
  title             => decode($cp, 'Число подписчиков'),
  y_max_value       => $max,
) or die $graph->error;

$graph->set_legend('RSS', 'E-Mail', 'LJ', 'Twitter');

my $gd = $graph->plot(\@data) or die $graph->error;

open(IMG, '>file.png') or die $!;
binmode IMG;
print IMG $gd->png;
close IMG;

my $msg = MIME::Lite->new(
  To => 'webmaster@example.ru',
  Subject => 'Graph',
  Type => 'multipart/mixed');

$msg->attach( Type => "text/plain; charset=$cp",
              Data => "Текст нашего письма. Картинка прилагается." );
 
$msg->attach( Type        => 'image/png',
              Path        => 'file.png',
              Filename    => 'file.png',
              Disposition => 'attachment' );
 
$msg->send();

Первая половина кода строит график (данные подгружаются из лог-файла), вторая половина шлет этот график вебмастеру на e-mail. Осталось только прописать скрипт в crontab и ждать ежедневных/недельных/месячных отчетов.

2. Каталог ./pages-count

Здесь вы найдете скрипты, предназначенные для определения числа страниц сайта, проиндексированных различными поисковыми системами — Яндексом, Рабмлером, Google, Bing и Yahoo. Для примера давайте возьмем Рамблер:

#!/usr/bin/perl

# rambler-pages.pl
# (c) 2009 Alexandr A Alexeev, http://eax.me/

use strict;

my $url = shift;

unless($url) {
  print "usage: $0 example.ru\n";
  exit 1;
}

# urlencode
$url =~ s/([^a-zA-Z0-9\.\-\_]{1})/sprintf("%%%02x",ord($1))/eg;
$url = "http://nova.rambler.ru/srch\\?query=\\&limitcontext=0\\&filter=$url";

my $data = `wget -q $url -O -`;

if((!$data) or $?) {
  print "failed to download\n";
  exit 2;
}

my ($cnt) = $data =~ /(\d+)\)<\/a>(?:.{5}<span.+<\/span>)?<\/div><ul><li><a class\=\"title n_title_2\" href/;

unless($cnt) {
  print "failed to parse\n";
  exit 3;
}

print "$cnt\n";

Как видите, ничего сверхъестественного. Особого внимания в этом каталоге заслуживает скрипт yahoo-links.pl, который определяет число ссылок на сайт, а не количество страниц в индексе. Самый «главный» скрипт в каталоге, all-pages.pl, определяет количество страниц сайта в индексе всех поисковиков, названных выше.

3. Каталог ./visitors

Единственный скрипт в каталоге — cnt.php. Он предназначен для сбора информации о посетителях сайта. Просто подключаем его во всех страницах с помощью include, и скрипт будет писать на диск логи вроде таких:

time=1251721248|ip=69.41.186.122|dn=example.ru|query=%2F|referer=| browser=DobroBot+%28%2Bhttp%3A%2F%2Fwww.dobrobot.com%2F%29 |uid=5838e4b8fa8f9c6ca16e0e7c7f1d5adc|

Для того, чтобы логи лучше воспринимались, требуется анализатор, до разработки которого у меня не дошли руки. Используйте этот скрипт только если перед вами стоит очень необычная аналитическая задача. Честно говоря, с лету я не могу такую придумать и вообще плохо помню, зачем это писалось. Не исключено, что просто от скуки.

4. Кому все это нужно?

Данные скрипты можно использовать для создания своей кнопки-информера, отображающей пузомерки сайта, его посещаемость и другие параметры. Можно создать собственный сервис анализа сайтов типа pr-cy.ru. Можно анализировать конкурентов или следить за своими сайтами. Надеюсь, кому-нибудь они пригодятся.

Важно помнить, что писалось все это давно и на скорою руку, потому в коде практически нет комментариев, все это написано криво и местами может не работать или работать не совсем правильно. Будьте бдительны.

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.