Помогая другим, помогаешь себе.
Создадим реальнyю виртyальность !
Практический урок 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 и также получать список запросов.