Статистика запросов с поисковиков

Записывайте всех, кто приходит! Фиксируйте даже цвет ботинок. Не забудьте измерить длину шнурков! Обязательно спросите, как они нас нашли!

Создав этот сайт я практически сразу задумался о том, что полезно было бы знать - по каким запросам приводит ко мне посетителей Яндекс. Теперь, когда скрипт опробован - я могу выложить его в сеть - пользуйтесь.

Задумавшись , я первым делом посмотрел в файл access.log

max@server:~/instance$ cat access.log |grep yandex        
86.110.193.170 - - [20/Jul/2007:10:17:31 +0400] 
"GET /themes/Linux/items/squid-no-banners/ 
HTTP/1.0" 200 4045 "http://www.yandex.ru/yandsearch?&q=1114738653&p=1& 
text=squid+%E4%EB%FF+%FD%EA%EE%ED%EE%EC%E8%E8+%F2%F0%E0%F4%E8%EA%E0" 
"Opera/9.02 (Windows NT 5.1; U; ru)" text/html

213.33.255.146 - - [20/Jul/2007:18:36:29 +0400] 
"GET /themes/Linux/items/Analogs/ HTTP/1.0" 200 15307 
"http://www.yandex.ru/yandsearch?stype=&nl=0& 
text=%E0%ED%E0%EB%EE%E3%E8+%EF%EB%E0%F2%ED%FB%F5+%EF%F0%EE%E3%F0%E0%EC%EC"  
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; MyIE2; .NET CLR 1.1.4322)" text/html

Здорово, но ничего не понятно. Понятно только одно - народ идет…

Для начала я решил убрать лишнюю информацию. Решено было оставить IP, время прихода, страница, на которую пришли, и конечно REFERER. Только портить конфигурацию Apache я не стал - ведь всегда под рукой верный друг awk. Номера полей, которые решено было оставить - 1,4,7,11

Вот что получилось после отсеивания лишнего.

max@server:~/instance$ cat access.log |grep yandex |awk '{print $4 "\t" $1 "\t " $7 "\t " $11}'                            
[20/Jul/2007:00:33:51   193.233.88.70    /themes/Linux/items/xDebug/     "http://www.yandex.ru/
yandsearch?text=xdebug.so"
[20/Jul/2007:10:17:31   86.110.193.170   /themes/Linux/items/squid-no-banners/   
"http://www.yandex.ru/
yandsearch?&q=1114738653&p=1&text=squid+%E4%EB%FF+%FD%EA%EE%ED%EE%EC%E8%E8+%F2%F0%E0%F4%E8%EA%E0"

Уже лучше, но все ещё не удобно. Никому неинтересно видеть полный URL - в данном случае итак известно, что пришли с Яндекса. Уберем эту излишнюю информацию.

max@server:~/instance$ cat access.log |grep yandex |awk '{print $4 "\t" $1 "\t " $7 "\t " $11}'\
|grep text |sed 's/".*text=//g; s/&.*$//g; s/"//g'


[12/Jun/2007:01:09:16   64.94.47.2       /themes/Linux/items/squid-no-banners/
   %F0%E5%E3%F3%EB%FF%F0%ED%EE%E5+%E2%FB%F0%E0%E6%E5%ED%E8%E5+%E4%EB%FF+%F3%F0%EB%E0

[12/Jun/2007:18:38:21   212.0.77.209     /themes/programming/items/PHPorPERL/

[13/Jun/2007:15:25:56   195.161.214.137  /themes/Linux/items/subversion/         subversion+init.d

Немного поясню выражения sed. s/».*text=g; - нужная нам часть ссылающегося URL начинается с text= поэтому все что есть от ковычки до него удаляем. s/&.*$g; - удаляем все от последнего амперсанда и до конца строки - благо REFERER у нас последнее поле. И наконец удаляем кавычки - они просто мешались (лень экранировать)

Остается последее неудобство - я не умею так читать: %ED%E0%F1%F2%F0%EE%E9%EA%E0+subversion . Нужно декодировать. Ничего проще и быстрее, чем мой любимый PHP я не нашел.

max@server:~/instance$ cat access.log |grep yandex \
|awk '{print $4 "\t" $1 "\t " $7 "\t " $11}'|grep text \
|sed 's/".*text=//g; s/&.*$//g; s/"//g'\
|awk '{if(NF>2) {print $0;}}'\
|while read i; do echo "<?php echo urldecode('$i').\"\n\";"|php; done

Как видно встает новая проблема - кодировка. Но с этим справится проще всего - у нас же всегда есть iconv. Моя локаль - ru_RU.UTF-8

cat access.log |grep yandex \
|awk '{print $4 "\t" $1 "\t " $7 "\t " $11}'|grep text \
|sed 's/".*text=//g; s/&.*$//g; s/"//g'|awk '{if(NF>2) {print $0;}}'\
|while read i; do echo  "<?php echo urldecode('$i').\"\n\";"|php; done\
|iconv -f cp1251 -t utf-8

Чтобы не потерять наработку запишем это в файл и запустим его , как скрипт.

max@server:~/instance$ ./yandex |tail -n 20
[23/Aug/2007:19:03:38   77.244.212.55    /themes/programming/items/php-text-edit/        Текстовый редактор для программирования
[23/Aug/2007:20:10:04   82.211.152.12    /themes/Internet/items/flash-videos/    видео баннер
[24/Aug/2007:11:08:12   85.140.145.58    /       apache linux
[24/Aug/2007:14:01:46   62.118.200.156   /themes/Linux/items/pseudo-ASP-2/       action формы регулярное выражение
[27/Aug/2007:11:11:34   213.247.226.73   /themes/programming/items/php-mailer/   отправка писем в PHP
[27/Aug/2007:16:50:16   82.207.74.212    /themes/Linux/items/subversion/         скрипт kill squid
[27/Aug/2007:19:13:02   195.135.235.174  /themes/Linux/  установка xdebug под linux
[27/Aug/2007:20:00:48   195.135.235.174  /themes/Linux/items/xDebug/     xdebug kcache
[28/Aug/2007:15:41:02   89.109.50.19     /themes/Linux/items/ssh-no-password/    авторизация по ключам ssh
[29/Aug/2007:14:57:00   213.221.7.162    /themes/Linux/items/xDebug/     Zend Debugger
[29/Aug/2007:15:05:53   195.135.235.174  /themes/Linux/items/xDebug/     установка xdebug
[30/Aug/2007:10:46:14   82.200.20.67     /       apache linux
[30/Aug/2007:17:03:37   81.30.200.91     /themes/programming/items/php-text-edit/        проверка введенных символов PHP
[01/Sep/2007:20:18:07   85.141.249.51    /themes/Linux/items/Analogs/    аналог qdictionary под linux
[02/Sep/2007:20:51:39   85.172.73.1      /themes/Linux/items/Analogs/    аналог сократа
[03/Sep/2007:01:12:38   217.146.246.10   /themes/Linux/items/xDebug/     настройка zend debugger
[03/Sep/2007:12:26:58   91.144.172.5     /themes/Linux/items/Analogs/    бесплатные аналоги платных программ
[03/Sep/2007:13:26:47   213.135.102.62   /themes/Linux/items/pseudo-ASP/         Зеркалирование в Linux
[03/Sep/2007:13:43:29   81.200.208.170   /themes/programming/items/php-text-edit/        текстовый редактор на PHP
[03/Sep/2007:16:29:04   89.104.98.86     /themes/programming/items/php-mailer/   подделки ссылок в почтовых клиентах
max@server:~/instance$                                                                                                  

Таким образом я теперь просматриваю последние входящие запросы.

Но каждый раз для этого входить по ssh стало лень. Поэтому был написан скрипт и поставлен в крон. Скрипт снова на awk - все что он делает, это превращает данные выведенные предыдущим скриптом в HTML-таблицу и записывает ее в файл.

max@server:~/instance$ cat yandextable
#!/bin/bash
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
file=/home/max/instance/public_html/statistic.html
cd /home/max/instance
echo "<h1 style=\"color: #D1C994;\">Поисковые запросы с Яндекса</h1>">$file
./yandex\
|awk -F '\t' 'BEGIN{print "<table border=1>";}
{print "<tr><td style=\"color: #244; font-size: 11px;\">"$1"</td><td style=\"color: #262; font-size: 11px;\"> "$2"
</td><td style=\"color: #522; font-size: 11px;\" >"$3"
</td><td><a style=\"text-decoration: none; color: #31A944; font-size: 12px; font-weight: bold;\" href=\""$3"\">"$4"</a>
</td></tr>"}END{print "</table>"}'>>$file

Пользуйтесь и присылайте отзывы на idler@instanceof.ru

Статистику можно посмотреть: yandex и google

Последние изменения: %2010/%03/%22 %01:%Mar