Практический урок 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, просто сами заходим на страницу статистики и открываем ее исходный код. Находим где там располагается нужная нам инфа — ключевики. Я воскользовался открытой статистикой коллеги — Шакина. На примере страницы его статистики покажу где начинается интересующая нас информация:
А кончается вот тут примерно:
Для простоты работы с полученным кодом каждой страницы мы можем обрезать все что находится ДО нужного нам куска и ПОСЛЕ него, но сначала получим все таки содержимое страницы, все будет происходить в цикле:
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 →
Комментарии:
Статья супер, то что искал очень давно, буду учиться теперь) Спасибо большое, парсеры вещь шикарная!!!
Не за что :) Рад, что инфа оказалась вам полезна.
Вот у тебя уроки отлично изложены. Я про php. Все просмотрел — изучил. Добрался до 20 урока — начались проблемы. Там ты уже не так все подробно расписал. (я сижу с macbookа и та установка мне вообще не подходит…ну я установил кое-как и справился, а дальше описание про http и тд не понял к чему..)
И этот материал. Прочитал, прежде чем использовать. Вот думаю, а как ключевики парсятся ? Разве в li не нужен доступ с паролем для этой инфы?)
прочел последний абзац )
в общем, уроки может местами поменять?)))
Чтобы Denwer начал работать с адресами начинающимися на https.
Приветствую автора статьи и всех кто в коментах.
Про статью и сайт: Вещь, особенно для тех, кто делает первые шаги в PHP.
И сразу же вопрос: Посещают ли данный сайт а именно эту страничку те посетители которые уже что-то сделали в плане парсера.
Попробовав данный пример, захотелось пойти немного дальше и спарсить новости по теме школы, а именно о начальных классах и методических разработках сайте awqust.com с GOOGLE.ru новостей.
Но там есть проблемное место, адрес начинается https а на денвере никак не могу сделать чтобы прасились сайты с адресом начинающимся https.
Возможно кто-то уже пробовал делать подобные вещи и они знают как и что прописать чтобы Denwer начал работать с адресами начинающимися на https.
А может быть и сам автор этой замечательной статейки прочтёт мой вопрос и даст ответ.
Будем надеяться.
Вообще ничего не появляется — пустая страница и всё.
и непонятно, как найти в коде где начинаются ключевики, а где заканчиваются
Я скопировал весь код, но ничего не работает!
страницы: get_web_page, потом
в цикле получаем страницы,
например, 10 штук, чистим их
от лишнего хлама и, наконец,
вычленяем нужную
информацию с помощью
регулярного выражения. Все
достаточно просто, главное
подобрать адреса ссылок,
чтобы в них был счетчик, как
в нашем случае с page=1, 2 и
так далее, чтобы можно было
прикрутить цикл.
—————————-
Вопрос: А вот если адреса ссылок начинаются так http://site.ru/papka/2 и т.д. как прикрутить цикл?