Практический урок 1.



Главная Сделай сам Учебник WEB

Помогая другим, помогаешь себе.


Создадим реальн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, просто сами заходим на страницу статистики и открываем ее исходный код. Находим где там располагается нужная нам инфа — ключевики. Я воскользовался открытой статистикой коллеги — Шакина. На примере страницы его статистики покажу где начинается интересующая нас информация:
парсер liveinternet начало
А кончается вот тут примерно:
парсер на 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 и также получать список запросов.


Предыдущия Следующая


Главная