Практический урок 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( "https://www.liveinternet.ru/stat/myblaze.ru/queries.html?page=".$i )


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

for($i=1;$i<=10;$i++)// 10 это кол-во страниц, которое мы хотим спарсить
{
	$result = get_web_page( "https://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

Комментарии:

  1. санек — 17.08.2014 09:43

    Статья супер, то что искал очень давно, буду учиться теперь) Спасибо большое, парсеры вещь шикарная!!!

  2. myblaze 17.08.2014 15:38

    Не за что :) Рад, что инфа оказалась вам полезна.

  3. vay — 08.01.2015 20:42

    Вот у тебя уроки отлично изложены. Я про php. Все просмотрел — изучил. Добрался до 20 урока — начались проблемы. Там ты уже не так все подробно расписал. (я сижу с macbookа и та установка мне вообще не подходит…ну я установил кое-как и справился, а дальше описание про http и тд не понял к чему..)

    И этот материал. Прочитал, прежде чем использовать. Вот думаю, а как ключевики парсятся ? Разве в li не нужен доступ с паролем для этой инфы?)

  4. vay — 08.01.2015 20:45

    прочел последний абзац )

    в общем, уроки может местами поменять?)))

  5. Сергей — 26.05.2015 08:17

    Чтобы Denwer начал работать с адресами начинающимися на https.

    Приветствую автора статьи и всех кто в коментах.
    Про статью и сайт: Вещь, особенно для тех, кто делает первые шаги в PHP.
    И сразу же вопрос: Посещают ли данный сайт а именно эту страничку те посетители которые уже что-то сделали в плане парсера.
    Попробовав данный пример, захотелось пойти немного дальше и спарсить новости по теме школы, а именно о начальных классах и методических разработках сайте awqust.com с GOOGLE.ru новостей.
    Но там есть проблемное место, адрес начинается https а на денвере никак не могу сделать чтобы прасились сайты с адресом начинающимся https.
    Возможно кто-то уже пробовал делать подобные вещи и они знают как и что прописать чтобы Denwer начал работать с адресами начинающимися на https.
    А может быть и сам автор этой замечательной статейки прочтёт мой вопрос и даст ответ.
    Будем надеяться.

  6. Алексей — 31.07.2015 18:25

    Вообще ничего не появляется — пустая страница и всё.

  7. Алексей — 31.07.2015 18:27

    и непонятно, как найти в коде где начинаются ключевики, а где заканчиваются

  8. andruha — 31.01.2016 16:32

    Я скопировал весь код, но ничего не работает!

  9. Руслан — 16.02.2016 11:11

    страницы: get_web_page, потом
    в цикле получаем страницы,
    например, 10 штук, чистим их
    от лишнего хлама и, наконец,
    вычленяем нужную
    информацию с помощью
    регулярного выражения. Все
    достаточно просто, главное
    подобрать адреса ссылок,
    чтобы в них был счетчик, как
    в нашем случае с page=1, 2 и
    так далее, чтобы можно было
    прикрутить цикл.
    —————————-
    Вопрос: А вот если адреса ссылок начинаются так http://site.ru/papka/2 и т.д. как прикрутить цикл?

Добавить комментарий