Практический урок 1. Пишем парсер статистики Liveinternet на PHP

Практический урок 1. Пишем парсер статистики Liveinternet на PHP

Добрый день, читатели! Пришло время немного попрактиковаться. У вас уже достаточно знаний, чтобы приступить к написанию полезных скриптов, которые будут облегчать вашу работу. Одним из таких может стать парсер. Что это такое я подробно расписывал в своей статье, так что если не знаете, советую прочитать. Кратко, суть парсера сводится к поиску и вычленению нужной информации из большого куска текста. В случае же с Интернетом, это чаще всего выдергивание требуемых данных из страниц сайтов. В нашем случае это будет Liveinternet. Итак, поехали!



Прежде всего, если вы не читали мои предыдущие уроки, то очень советую! А самое главное — это урок 20 — работа с библиотекой cURL. Там в конце есть такой фрагмент кода, который получает содержимое страницы по ее адресу. Его мы и возьмем за основу. Также нам понадобятся регулярные выражения. Их я еще не освещал, очень жаль, постараюсь исправиться в ближайшее время. Но для данного урока я вам регулярки дам, воспользуетесь ими, а потом уже прочитаете дополнительный материал и сможете писать их самостоятельно, это не сложно, просто придется посидеть пару часов чтобы вникнуть. Вот в общем то и все что будет необходимо, так что приступим и для начала возьмем код из предыдущего урока для получения кода страницы:



function get_web_page( $url ) { $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"; $ch = curl_init( $url ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвращает веб-страницу curl_setopt($ch, CURLOPT_HEADER, 0); // не возвращает заголовки curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // переходит по редиректам curl_setopt($ch, CURLOPT_ENCODING, ""); // обрабатывает все кодировки curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения curl_setopt($ch, CURLOPT_TIMEOUT, 120); // таймаут ответа curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // останавливаться после 10-ого редиректа $content = curl_exec( $ch ); $err = curl_errno( $ch ); $errmsg = curl_error( $ch ); $header = curl_getinfo( $ch ); curl_close( $ch ); $header[‘errno’] = $err; $header[‘errmsg’] = $errmsg; $header[‘content’] = $content; return $header; }

Отлично, есть функция получения, но какую страницу брать? В данном уроке мы будем собирать статистику ключевых слов в Liveinternet. Это может пригодиться многим вебмастерам, т.к. LI не позволяет выгружать статистику в Excel, например, как та же Яндекс.Метрика.

Адрес страницы с ключевыми словами: liveinternet.ru/stat/myblaze.ru/queries.html адрес моего сайта, естественно, заменяем на нужный. Однако, если разобраться, то мы видим, что очень часто все слова не помещаются на одной странице, поэтому там есть ограничение на кол-во ключевиков на страницу. Соответственно, есть ссылки на страницы 2, 3 и так далее, которые имеют вид liveinternet.ru/stat/myblaze.ru/queries.html?page=2. Логически прикинув и опробовав, убеждаемся, что существует и первая страница, то есть, page=1 тоже работает (хотя просто переходя по ссылкам на сайте вы на нее не попадете, page=1 опускается, а пишется просто queries.html). Но нам это на руку, ведь можно организовать простой цикл for от 1 до 10 или 100, смотря сколько страниц хотите спарсить и подставлять параметр так:



get_web_page( "http://www.liveinternet.ru/stat/myblaze.ru/queries.html?page=".$i )

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

Для этого, без php, просто сами заходим на страницу статистики и открываем ее исходный код. Находим где там располагается нужная нам инфа — ключевики. Я воскользовался открытой статистикой коллеги — Шакина. На примере страницы его статистики покажу где начинается интересующая нас информация:



А кончается вот тут примерно:



Для простоты работы с полученным кодом каждой страницы мы можем обрезать все что находится ДО нужного нам куска и ПОСЛЕ него, но сначала получим все таки содержимое страницы, все будет происходить в цикле:

for($i=1;$i<=10;$i++)// 10 это кол-во страниц, которое мы хотим спарсить { $result = get_web_page( "http://www.liveinternet.ru/stat/shakin.ru/queries.html?page=".$i ); //получаем исходник страницы if (($result[‘errno’] != 0 )||($result[‘http_code’] != 200)) //проверяем на ошибки { exit($result[‘errmsg’]); //если нет такой страницы, то выходим } $page = $result[‘content’]; //забираем контент //обрезаем текст ДО: $pos = strpos($page, "<tr align=right bgcolor=\"#dddddd\" >"); $page = substr($page, $pos); //Обрезаем ПОСЛЕ $pos = strpos($page, "<tr><td bgcolor=#f0f0f0 colspan=10>"); $page = substr($page, 0, $pos); //Вырезаем всё что нам не нужно функцией поиск-замена $page = preg_replace(‘/<input type=checkbox.*?[>^]/i’, », $page); $page = preg_replace(‘/<label.*?[>^]/i’, », $page); $page = str_replace(‘</label>’, », $page); //Выводим то, что осталось echo htmlspecialchars($page); } Видите, теперь у нас есть куски каждой существующей страницы с ключевыми словами. Осталось только из этих кусков выдернуть нужное нам — сами слова. Несложно заметить, что ключевики оформлены ссылками, за это и зацепимся. С помощью регулярных выражений (вернее всего одного) вырежем текст каждой ссылки в наших фрагментах. В коде, приведенном выше, заменяем

echo htmlspecialchars($page); На следующее:

preg_match_all("/<a[^<>]+?>(.*?)<\/a>/uis",$page,$ok); for ($j=0; $j<count($ok[1]); $j++) { echo "<li>".$ok[1][$j]."</li>"; } Готово! Запускаем скрипт и получаем все ключевые слова из статистики liveinternet.

Надеюсь все было понятно. В конечном итоге берем код функции получения кода страницы: get_web_page, потом в цикле получаем страницы, например, 10 штук, чистим их от лишнего хлама и, наконец, вычленяем нужную информацию с помощью регулярного выражения. Все достаточно просто, главное подобрать адреса ссылок, чтобы в них был счетчик, как в нашем случае с page=1, 2 и так далее, чтобы можно было прикрутить цикл. Также очень важно правильно составить регулярное выражение, это самое сложное в написании парсеров. Некоторые люди зарабатывают деньги именно составлением регулярок, ведь это не всегда просто.

Что же, надеюсь примерно вы поняли что к чему. Но знаете, я вас сейчас немножечко расстрою… Подавляющее большинство сайтов имеют закрытую статистику в liveinternet и даже если сама она открыта, то ключевики, то есть самое главное, закрыты почти всегда, наверное, в 99% случаев. Можно даже иметь пароль к статистике, но вот парсер просто так запароленную страницу не откроет. Тут нужна специальная функция для авторизации на странице с помощью cURL на php. И в следующем уроке я научу вас авторизироваться в liveinternet с помощью cURL и также получать список запросов. Поэтому ждите второй урок, постараюсь выложить его в ближайшее время. Всем пока 🙂

← Работа с cURL | Содержание | Авторизация на Liveinternet →