- []
Статистика запросов с поисковиков
Записывайте всех, кто приходит!
Фиксируйте даже цвет ботинок.
Не забудьте измерить длину шнурков!
Обязательно спросите, как они нас нашли!
Создав этот сайт я практически сразу задумался о том, что полезно было бы знать - по каким запросам приводит ко мне посетителей Яндекс. Теперь, когда скрипт опробован - я могу выложить его в сеть - пользуйтесь.
Задумавшись , я первым делом посмотрел в файл 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

