добавить
ссылку в
Email
Fb
подписка
RSS
Twitter
Email
Fb

Простой парсер на PHP

Заработай на своей страничке Вконтакте, Твиттере, Facebook или Гугл+.
Быстрые деньги!

На сегодняшний день встречается очень много проектов, в которых необходимо собирать определённую информацию с чужих сайтов. Этот процесс называется "граббингом" или "парсингом". Оставим в стороне вопросы этичности этого процесса, предполагается, что вы знаете, что такое хорошо и что такое плохо, и не будете применять сие знание во вред кому-либо.

В этой статье мы создадим простой парсер на популярном языке PHP.

Заранее извиняюсь перед своими читателями, которые не знакомы с программированием, но специфика SEO зачастую предполагает наличие и программерских навыков. Итак, приступим.

Что будем парсить? В качестве учебного примера предлагаю создать средство для сбора статей широкоизвестного технического журналиста Криса Касперски (популярного автора журнала "Хакер").

Getting started

Статьи Криса расположены по этому адресу: http://www.xakep.ru/post/35410/default.asp. Это и будет нашей отправной точкой. Скачивание страницы для парсинга будем выполнять, используя библиотеку cURL. Итак, инициализируем библиотеку и скачиваем нашу страницу:

$ch = curl_init (); // инициализация
curl_setopt ($ch , CURLOPT_URL , "http://www.xakep.ru/post/35410/default.asp");
curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0"); // каким браузером будем прикидываться
curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 ); // вывод страницы в переменную
$content = curl_exec($ch); // скачиваем страницу
curl_close($ch); // закрываем соединение 
multitoolbox syntax highlighter

Расчленение

В скачанной странице нас интересует ссылки на статьи и названия статей. Открываем код страницы в браузере и видим, что все ссылки и названия подчиняются следующему порядку расположения:

<p>Название статьи<br>
<a href="адрес_статьи">адрес_статьи</a></p>
multitoolbox syntax highlighter

Напишем регулярное выражение, которое будет "выдирать" интересующие нас названия и адреса из кода страницы:

preg_match_all("/

(.*)
\r\n\"(.*)\">.*<\/a><\/p>/isU", $content, $matches, PREG_PATTERN_ORDER);

В рамки этой статьи не входит объяснение необъятной темы регулярных выражений, поэтому отсылаю вас к коротенькому справочнику по ним. Также рекомендую посмотреть информацию о функции preg_match_all для лучшего понимания кода.

Вырезка

Мы подошли к основному циклу программы. В нём мы будем скачивать странички со статьями и вырезать из них интересующую нас информацию.

Просматривая код страницы, можно обнаружить, что текст статьи всегда обрамлён следующими тегами

<hr width="200" size="1" noshade align="left">
..текст статьи..
<center><p><a href="../">Содержание</a>
multitoolbox syntax highlighter

На основе этого закона мы и постоим парсер. Все необходимые поянения даны в комментариях:

for ($i =  0; $i < count($matches[1]); $i++) // цикл по всем извлеченным адресам 
{
    echo "

".$matches[1][$i]."

"
; // выводим название статьи как заголово flush(); // заставляем вывести текст немедленно $ch = curl_init (); // инициализация curl_setopt ($ch , CURLOPT_URL , $matches[2][$i]); // ссылка на текущую статью curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0 "); curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 ); $content = curl_exec($ch); curl_close($ch);   preg_match_all( "/
\"
200\" size=\"1\" noshade align=\"left\">(.*)

\"\.\.\/\">.*<\/a>/isU", $content, $matches_art, PREG_PATTERN_ORDER); // выдираем текст статьи echo $matches_art[1][ 0]; // выводим её flush(); // заставляем вывести текст немедленно sleep(2); // отдыхаем две секунды, чтобы не вызвать подозрение у сервера }

Finish

Ну вот, собственно, и всё! В итоге мы получим ленту статей Криса, без рекламы, оформления сайта и прочих радостей.

Полный код скрипта:

$ch = curl_init ();
curl_setopt ($ch , CURLOPT_URL , "http://www.xakep.ru/post/35410/default.asp");
curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0");
curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 );
$content = curl_exec($ch);
curl_close($ch);
 
preg_match_all("/

(.*)
\r\n\"(.*)\">.*<\/a><\/p>/isU", $content, $matches, PREG_PATTERN_ORDER);   for ($i = 0; $i < count($matches[1]); $i++) { echo "

".$matches[1][$i]."

"
; flush(); $ch = curl_init (); curl_setopt ($ch , CURLOPT_URL , $matches[2][$i]); curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0"); curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 ); $content = curl_exec($ch); curl_close($ch);   preg_match_all( "/
\"
200\" size=\"1\" noshade align=\"left\">(.*)

\"\.\.\/\">.*<\/a>/isU", $content, $matches_art, PREG_PATTERN_ORDER); echo $matches_art[1][ 0]; flush(); sleep(2); }

Если если вам понравилась эта статья, вы можете подписаться на материалы моего блога через rssRSS или emailemail, а также присоединиться ко мне в twitterTwitter или vkontakteВКонтакте.

Похожее видео
Похожие статьи
* эксперт · Дата 28 февраля 2010 г. · seo  php 
RSS подписка Комментарии (33 штуки)
Gravatar MyFreeWeb 28 февраля 2010 г. в 19:13 #
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
«You can't parse [X]HTML with regex. Because HTML can't be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML. Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML. HTML is not a regular language and hence cannot be parsed by regular expressions. Regex queries are not equipped to break down HTML into its meaningful parts. so many times but it is not getting to me. Even enhanced irregular regular expressions as used by Perl are not up to the task of parsing HTML. You will never make me crack. HTML is a language of sufficient complexity that it cannot be parsed by regular expressions. Even Jon Skeet cannot parse HTML using regular expressions. Every time you attempt to parse HTML with regular expressions, the unholy child weeps the blood of virgins, and Russian hackers pwn your webapp…»

А еще вместо PHP нужно использовать Python. В котором есть, например, замечательный модуль xml.dom,minidom.
Gravatar Zver 28 февраля 2010 г. в 20:47 #
Не сказал бы что это простой парсер :) простой можно и без cURL написать.
Gravatar Алексей Московский 1 марта 2010 г. в 00:00 #
MyFreeWeb, в PHP тоже есть библиотеки для разбора DOM. Но я сталкивался с рядом проблем с разбором невалидного HTML с помощью DOM. А вот регулярки работают всегда.

Zver, можно, но cURL — удобная штучка от которой грех отказываться.
Gravatar Алексей 1 марта 2010 г. в 12:56 #
Есть ещё вариант использовать яху-пайпс, Тормоз писал о них: http://brokenbrake.biz/2008/07/29/yahoo-pipes_29.html
Gravatar Johhny 15 марта 2010 г. в 23:01 #
Понравился Ваш парсер. Дорабатываю под свои нужды, но знание php пока хромает. Есть один вопрос.

Передаю через формы данные с одной страницы на другую:

URL:


далее, в index3.php (где ваш скрипт парсера сидит) хочу переменную urla вставить вместо урла сайта в эту строку Вашего скрипта:
curl_setopt ($ch , CURLOPT_URL , «http://www.xakep.ru/post/35410/default.asp»);

пробовал и так:
curl_setopt ($ch , CURLOPT_URL , $urla);
и так:
curl_setopt ($ch , CURLOPT_URL , $_POST['urla']);

но не получается заставить работать(
Может подскажете, где тут ошибка?
Заранее спасибо)
Gravatar Johnny 15 марта 2010 г. в 23:04 #
там не «URL:» в посте выше, а это криво вставилось

< form action=« index3.php» method=«post» >
URL:

< /form >
Gravatar Johnny 15 марта 2010 г. в 23:06 #
криво вставляется(( в общем там из поля input передаётся переменная urla в скрипт index3.php

она туда доходит т.к.
echo $_POST['urla'];
работает нормально — выводит значение переменной
Gravatar Алексей Московский 16 марта 2010 г. в 04:47 #
Johnny, скиньте мне на alexkucherov@gmail.com исходники — разберемся где ошибка.
Gravatar Johnny 16 марта 2010 г. в 10:51 #
Отправил.
Gravatar dionis44 25 марта 2010 г. в 16:15 #
Ну спасибо. Как хорошо, что есть люди, которые могут так просто и доступно, на живом примере рассказывать и показывать реально полезные вещи.
Искал и нашел.
Еще раз спасибо.
Gravatar Владимир 17 апреля 2010 г. в 13:54 #
а может еще подскажете как прикидываться, что как будто бы я с разных ip адресов захожу на сайт?

Т.е. я парсю огромный сайт, и что бы он не добавил мой айпи в блок, можно ли сделать так, что бы мой айпи адрес был не реальный, а вымышленный например, и все время разный.
Gravatar Алексей Московский 17 апреля 2010 г. в 16:32 #
Владимир, посмотрите документацию к модулю CURL — иам есть опция позволяющая указать прокси-сервер при загрузке страницы.
Gravatar Алесандр 10 мая 2010 г. в 07:27 #
Спасибо большое за статью!

Подскажите,
а как изменить код чтобы собирать информацию с сайта на котором требуемая информация появляется только после регистрации. Персональный код/пароль имеется.

Спасибо!
Gravatar 247365 10 мая 2010 г. в 13:24 #
Если нужно логиниться, разбери сначала каким методом и какие переменные посылаются с твоим логином и паролем, затем пошли их сам. Далее все зависит от технологии: либо сессии либо куки
Gravatar Игорь 10 мая 2010 г. в 23:56 #
а можно в примерах?
а то я уже неделю бьюсь
Gravatar Игорь 11 мая 2010 г. в 00:06 #
лучше конечно пример как и куда куки подставлять.
у большинства сайтов по кукам авторизация
Gravatar Арман 19 августа 2010 г. в 09:02 #
Fatal error: Call to undefined function curl_init() in X:\home\localhost\www\1\www\index.php on line 6

подскажите начинающему где здесь ошибка я тупо поставил ваш скрипт какая ошибка?
Gravatar Алексей Московский 19 августа 2010 г. в 11:14 #
Арман, судя по всему, у вас отключен CURL в настройках PHP.
Gravatar Roman Salin 21 августа 2010 г. в 21:53 #
Зачем использовать curl, когда есть функция file_get_contents().
Gravatar Алексей Московский 22 августа 2010 г. в 16:14 #
Роман, CURL гораздо универсальнее и его знание пригодиться для понимания всех моих последующих уроков.
Gravatar гость 22 августа 2010 г. в 22:00 #
было бы неплохо если бы вы еще привели пример как полученное закачать по Ftp
Gravatar вася 3 сентября 2010 г. в 11:48 #
Помогите розпарсить расписание кино на кинопоиск.Думаю многим будет полезная вещь.http://www.kinopoisk.ru/level/8/day_view/2010-09-03/
Gravatar Алексей Московский 3 сентября 2010 г. в 12:11 #
вася, вам на биржу фрилансеров. Здесь могут только подсказать ошибки в готовом коде, а не писать его за вас.
Gravatar вася 3 сентября 2010 г. в 12:23 #
Хорошо попитаюсь. Первие варианти виложу.
Gravatar Павел 15 сентября 2010 г. в 18:06 #
Здравствуйте. Прошу подсказать. Два дня голову ломаю. Написал небольшой парсер, но что-то он не совсем правильно работает. Я его привожу в немного урезанном виде, так как обработчик напарсенного текста работает нормально.



(На кавычки внимания не обращайте,- пришлось изменить, чтобы отобразился код на этой странице)
Файл keys.txt — список кейвордов, где для гугла пробелы заменены на «+».
Когда я заменяю адрес с переменной $keyword
http://www.google.com/search?hl=en&num=$num&q=$keyword
на простой запрос, например слово keyword
http://www.google.com/search?hl=en&num=$num&q=keyword ,
то при парсинге в файл base.txt вписывается всё как надо. Цикл тоже запускается, но естественно запрос каждый раз повторяется один и тот же.
Когда же я в урле ставлю обратно переменную $keyword , парсится какая-то ерунда, совсем не по теме, хотя и с файла keys.txt при каждом новом цикле берется новый по порядку запрос. Может кто знает, что в коде не так. Не программер я, к сожелению.
Gravatar WishMaster 28 октября 2010 г. в 14:43 #
К вопросу о парсинге страниц с авторизацией, можно привести примерчик. Я чет совсем не могу сообразить как сделать авторизацию на странице и потом поддерживать сессию. Если можно то на сессиях и куках. Или подскажите где это можно покопать. Заранее благодарен.
Gravatar Андрей 26 ноября 2010 г. в 11:02 #
Здраствуйте. Вот такой простой код выбивает ошибку:

Warning: curl_setopt(): supplied argument is not a valid cURL handle resource in C:\Program Files\VertrigoServ\www\parser\proxy\2ip.php on line 6
Буду благодарен за любую подсказку о природе проблемы.
Gravatar Dusteater 9 декабря 2010 г. в 01:40 #
Большое спасибо за инфу! Быстренько написал себе нужный парсер : )
Gravatar Russin 7 июля 2011 г. в 11:49 #
А что может быть если не все статьи до конца обрабатываются??? после каждого обновления странички(скрипта) добавляются 3-5 статей.
Gravatar Dimitry 30 сентября 2011 г. в 23:03 #
А как реализовать аналогичный парсер свободных доменов как на этом сайте
http://mokro.info по своему ключу
Gravatar igor 5 марта 2012 г. в 22:24 #
Автору РЕСПЕКТ…Долбился над другим скриптом …file_get_contents($url);…preg_match(… Прочитал статью…очень подсобило в работе
Gravatar photoprikol.net 6 мая 2012 г. в 10:12 #
Отлично расписано !
photoprikol.netотличный пост, спасибо !
Gravatar netwarez.net 6 мая 2012 г. в 10:13 #
Wery GOOOOOOOOD !
netwarez.net