Если вдруг кому-то придется это повторить, мой опыт может пригодиться. Код публиковать не буду, а опишу логику в целом. Код писать любой дурак может, что уж там :)
Я - старый пыхарь, делал все на пыхе и через браузер. Труъ-кодер делал бы на перле и через консоль, но куда уж нам - извиняйте 6)
1. Получаем данные
Раз мы учимся доставать ключевики из HTTP_REFERER, нам надо заиметь как можно больше этих самых рефереров. А где их взять? Правильно - в логах! У меня по счастью оказались архивы логов довольно посещаемого сайта, в общей сложности более 3 гигов.
2. Готовим данные
Поскольку в процессе отладки конечной ф-ции нам придется гулять по массиву данных много-много раз, надо бы сперва откинуть все явно лишнее и получить данные в виде, пригодном для "прогулок".
Логи, ясное дело, имеются в виде пачки .gz-файлов. Я накидал функцию, которая:
- открывает каждый файл
- начинает читать оттуда строки
- каждую сверяет с регуляркой, проверяющей, есть ли в строке название какого-нибудь поисковика
- если есть - проверяет, находится ли вхождение в поле, соответствующем рефереру (ибо "yandex" может быть и в юзер-агенте, и даже в урле страницы, которую хитнули)
- если это реферер - получает URL и кладет его в новый файлик для "чистых" данных
- незадолго до таймаута запоминает, где остановилась, и дохнет по своей воле, чтоб при следующем запуске начать с нужного места (так можно делать все тупо по http, не заморачиваясь с консолью).
В результате объем данных сократился до сотни мегов, что позволило читать его за один проход до таймаута.
3. Отлавливаем пустые ключевики
Реализуем нашу функцию в черновом виде и начинаем гонять по данным. Клиент функции при этом проверяет, вернулось ли значение, или найти ключевик не удалось. Если не удалось - пишет "плохой" реферер в новый файлик. Получив набор "плохих" рефереров, переключаем клиент на этот набор и правим функцию: во-первых, учимся отбрасывать непоисковые рефереры (типа переходов с яндекс.почты), во-вторых, улучшаем регулярки, добывающие кивурд из поисковых рефереров.
На этом этапе я за каждый прогон выплевывал на экран 50 рандомных случаев (чтоб можно было охватить глазами) и общее число неудач.
Повторяем процедуру, пока наша функция не будет для 100% данных либо определять какой-либо кивурд, либо говорить, что это "не поиск".
4. Разбираемся с кодировками
Наша задача - сделать, чтоб все данные возвращались в юникоде. Для этого тупо проходим по массиву данных, для которых успешно возвращяется ключевик, и смотрим, отдается он в UTF-8 или еще в какой неведомой кодировке. Правим функцию, пока все найденное не станет отдаваться юникодом.
5. Отсматриваем вручную результаты
Чтобы наступило счастье, я сделал еще одну функцию-клиент, которая выводит 50 случайных кивурдов, запоминая в сессию номера строк, откуда эти кивурды взялись. И две ссылки - "показать еще раз" и "показать другие". Смотрим глазами, если видим лажу - вносим правки и жмем "еще раз", пока лажа не исчезнет. Когда все ок - смотрим другие 50. И так - до тех пор, пока лажа перестанет появляться :)
На всю возню у меня ушло часов 10, если интересно. Теперь гоняю на живых сайтах, фиксируя "неудачи" в логах. И что бы вы думали? Ага, фейлов полно - еще ковырять и ковырять :) Ну ничего, прорвемся.
Напоследок как всегда про хипстеров. Хипстеры часто трудятся дизайнерами, а иногда даже архитекторами. Есть ненулевая вероятность, что где-то сидит такой хипстер и рисует проекты бань http://www.bani-stroy.ru/ в автокаде. Если конечно на макбуке можно запустить автокад, не знаю :)