Парсер rss ленты. Подробнее о работе. А теперь о развитии
Как говорится: «xml это такая штука, от которой всем очень хорошо...»
- но от этого не становится легче. Есть такой стандарт XML документов, как RSS. Данная заметка посвящена тому, как можно парсить RSS-фиды средствами PHP.
Рассматриваемый XML парсер - SimpleXML. Несмотря на то, что он очень прост, стоит помнить, что данное расширение присутствует только в PHP 5, хотя есть библиотеки и для более ранних версий, но об этом уже позаботьтесь сами. Да и валидность многих RSS-лент желает лучшего. Остается лишь придумывать «костыли» и использовать то, что имеем.
Так или иначе, наша задача состоит в том, чтобы средствами PHP загрузить данные RSS-ленты и вывести их на экран в том виде, который нам необходим. Отдельно отмечу, что разобравшись с сутью вопроса вы сможете легко применить полученные знания в самых разных областях связанных с парсингом XML изображений.
Итак, начнем с того, что введем переменную, значением которой будет RSS-фид, что нас интересует. Например:
$rss = "http://k.img.com.ua/rss/ru/news.xml";
Теперь нам необходимо загрузить и отпарсить эти данные. Здесь я приведу два способа. Первый позволяет считать RSS-фид обычным образом и используя SimpleXML как парсинг строки данных. Например:
$xmlstr = @file_get_contents($rss);
if($xmlstr===false)die("Error connect to RSS: ".$rss);
$xml = new SimpleXMLElement($xmlstr);
Как вы видите мы:
- скачали наш RSS-фид в строку, ставшей значением переменной $xmlstr;
- проверили, удалось-ли загрузить RSS-ленту;
- отпарсили данные RSS-фида и присвоили результат переменной $xml;
- проверили, удалось-ли отпарсить данные RSS-ленты.
Всю эту процедуру можно упростить следующим образом:
$xml = @simplexml_load_file($rss);
if($xml===false)die("Error parse RSS: ".$rss);
Сравнив два примера, вы легко найдете отличия и поймете суть. Так что не будем останавливаться на достигнутом, и пойдем дальше. Теперь мы имеем данные RSS-ленты в удобном для обработки формате. Здесь и объектно-ориентированный подход и массивы данных. Чтобы стало понятнее, приведу пример вывода данных RSS-ленты:
Foreach($xml->xpath("//item") as $item){
echo "".$item->title."(".$item->pubDate.")";
echo "
".$item->description."
";
}
Как Вы видите, здесь я применил Xpath запрос для выборки массива записей RSS-фида. Обратите внимание, что значением является «ребенок» item, отец которого channel (см. описание формата RSS). Именно поэтому имеем два слеша впереди. Чтобы было нагляднее, приведу пример без использования Xpath:
Foreach($xml->channel->item as $item) {
Стоит также отметить, что мы получаем объект $item, параметры которого и выводим на экран.
На этом вроде и все. Как видите SimpleXML действительно прост.
Теги: RSS, SimpleXML
Данная статья не подлежит комментированию, поскольку её автор ещё не является
Песочница
Командир судна 25 января 2011 в 21:03- Чулан *
Как говорится: «xml это такая штука, от которой всем очень хорошо...»
- но от этого не становится легче. Есть такой стандарт XML документов, как RSS. Данная заметка посвящена тому, как можно парсить RSS-фиды средствами PHP.
Рассматриваемый XML парсер - SimpleXML. Несмотря на то, что он очень прост, стоит помнить, что данное расширение присутствует только в PHP 5, хотя есть библиотеки и для более ранних версий, но об этом уже позаботьтесь сами. Да и валидность многих RSS-лент желает лучшего. Остается лишь придумывать «костыли» и использовать то, что имеем.
Так или иначе, наша задача состоит в том, чтобы средствами PHP загрузить данные RSS-ленты и вывести их на экран в том виде, который нам необходим. Отдельно отмечу, что разобравшись с сутью вопроса вы сможете легко применить полученные знания в самых разных областях связанных с парсингом XML изображений.
Итак, начнем с того, что введем переменную, значением которой будет RSS-фид, что нас интересует. Например:
$rss = "http://k.img.com.ua/rss/ru/news.xml";
Теперь нам необходимо загрузить и отпарсить эти данные. Здесь я приведу два способа. Первый позволяет считать RSS-фид обычным образом и используя SimpleXML как парсинг строки данных. Например:
$xmlstr = @file_get_contents($rss);
if($xmlstr===false)die("Error connect to RSS: ".$rss);
$xml = new SimpleXMLElement($xmlstr);
Как вы видите мы:
- скачали наш RSS-фид в строку, ставшей значением переменной $xmlstr;
- проверили, удалось-ли загрузить RSS-ленту;
- отпарсили данные RSS-фида и присвоили результат переменной $xml;
- проверили, удалось-ли отпарсить данные RSS-ленты.
Всю эту процедуру можно упростить следующим образом:
$xml = @simplexml_load_file($rss);
if($xml===false)die("Error parse RSS: ".$rss);
Сравнив два примера, вы легко найдете отличия и поймете суть. Так что не будем останавливаться на достигнутом, и пойдем дальше. Теперь мы имеем данные RSS-ленты в удобном для обработки формате. Здесь и объектно-ориентированный подход и массивы данных. Чтобы стало понятнее, приведу пример вывода данных RSS-ленты:
Foreach($xml->xpath("//item") as $item){
echo "".$item->title."(".$item->pubDate.")";
echo "
".$item->description."
";
}
Как Вы видите, здесь я применил Xpath запрос для выборки массива записей RSS-фида. Обратите внимание, что значением является «ребенок» item, отец которого channel (см. описание формата RSS). Именно поэтому имеем два слеша впереди. Чтобы было нагляднее, приведу пример без использования Xpath:
Foreach($xml->channel->item as $item) {
Стоит также отметить, что мы получаем объект $item, параметры которого и выводим на экран.
На этом вроде и все. Как видите SimpleXML действительно прост.
Теги: RSS, SimpleXML
Данная статья не подлежит комментированию, поскольку её автор ещё не является
Зачастую нам приходится работать с большими объемами данных, такими как новости, товары и другая немаловажная информация.
В некоторых случаях лучше всего часть работы отдать скриптам, например – парсинг и представление этих данных на вашем сайте.
Сегодня мы подробно рассмотрим, как осуществить парсинг RSS-ленты и по аналогии – XML-файлов типа прайсов и других.
Итак, предположим, что вы нашли сайт, который предоставляет RSS-ленту в таком формате:
Что мы здесь видим? Это блок информации о ленте и два материала, заключенных в теге «item ».
Давайте теперь постараемся получить все необходимые нам данные.
Поскольку основная наша идея – это сформировать свою ленту новостей на основе полученных данных, для начала мы получим информацию о текущей ленте.
Во всем примере мы будем использовать «SimpleXML », помогающий без особого труда обрабатывать XML-файлы.
Тогда код для получения основной информации о ленте будет выглядеть следующим образом:
channel->title; // Имя ленты $link_channel = $rss->channel->link; // Ссылка на источник $description_channel = $rss->channel->description; // Описание ленты echo $description_channel; // Выводим описание?>
Обратите внимание , что название тегов может немного отличаться – это не играет никакой роли, в вашем же случае – вы все делаете по аналогии.
Так, с основной информацией разобрались, теперь самое интересное – парсинг материалов.
В отличие от основной информации, материалов может быть несколько, и для того, чтобы получить их все – мы будем использовать цикл «foreach ».
И получение уже самих материалов на примере нашей RSS-ленты будет выглядеть следующим образом:
channel->item as $items) { echo <<{$items->title}
{$items->description}
link}">Подробнее HTML; } ?>На выходе вы получите примерно такую картину:
Если у вас это не произошло – пишите об этом в комментариях.
По такому принципу парсятся все XML-файлы, меняется лишь их структура. Если в вашем файле присутствуют параметры в тегах и вы не знаете, как их получить – рекомендуем почитать .
Парсер контента RSS лент, с возможностью скачивания медиа-контента на сайт.
При добавлении полей ленты, которые надо парсить, вместо названия поля (title или enclosure) можно указать @INLINE чанк, который будет обработан Fenom . Благодаря этому, в этих полях можно выстраивать совершенно любую логику, вплоть до создания новых разделов «на ходу».
Подробнее о работе
Стояла задача, как можно больше упростить взаимодействие с компонентом, поэтому жду мнений, насколько компонент прост в управлении.Добавляем задание
Заходим на страницу компонента, жмём Добавить задание => Добавить RSS-ленту .На вкладке Основное заполняем примерно так:
Переключаемся на вкладку Конфигурация , где можно указать:
- Шаблон для создаваемых ресурсов,
- Контекст,
- Родительский контейнер в пределах выбранного контекста,
- Сконфигурировать скачивание медиа-контента,
- При необходимости поменять базовый тег ленты и базовый тег записи.
Расширения медиа-контента и папки для сохранения каждого из расширений указываются в JSON.
Добавляем поля для парсинга
На только что добавленном задании нажимаем правой кнопкой и выбираем Поля задания :Откроется список полей задания, который пока пуст.
Помимо добавления полей задания мы можем просмотреть Массив значений ленты
- это распечатанный массив с данным из первой записи ленты:
Запоминаем названия полей, которые нам надо парсить на сайт и кликаем Добавить поле . Откроется окошко с возможностью указать:
- Системное поле . Выпадающий список системных полей ресурса и ТВ-полей.
- Поле в источнике
. Текстовое поле, в которое нужно ввести наименование тега в RSS-ленте.
Можно указать @INLINE чанк, который будет обработан Fenom из pdoTools . В чанке содержатся плейсхолдеры всех возможных полей из RSS-ленты, которые имеются в записи между тегами item , а также массив с настройками задания $_task .
За счёт внедрения в данное поле Fenom , можно будет, получая значение из тега category (как например в RSS Lenta.ru) делать выборку по базе ресурсов, в поисках ID аналогичной категории на нашем сайте, а если не найдено - добавлять.
Тег enclosure и ему подобные, указываются либо через чанк: «@INLINE {$enclosure["url"]}», либо в виде CSS селектора: «enclosure».
Если не указано или значение по данному полю в ленте пустое, то в качестве значения для Системное поле будет взято значение из следующего поля - Значение по-умолчанию . - Значение по-умолчанию
. В данном поле можно указать значение, которое будет записано в Системное поле
. Например, если мы в Системное поле
выбрали class_key
, то, чтобы создавались Тикеты, мы в поле Значение по-умолчанию
пишем «Ticket», а Поле в источнике
оставляем пустым.
Такую же «магию» можно сделать и с полем published , указав в значении по-умолчанию цифру «1». Тогда ресурс на сайт будет добавляться сразу опубликованным.
Помимо основых полей с данными, которые необходимо выгрузить на сайт, нам надо ещё добавить поле, по которому пакет будет понимать, что данная запись уже есть на сайте. Для этого добавляем новое поле
, значение Системное поле
оставляем пустым, а в Поле в источнике
пишем, например, «guid» (потому что он менее всего подвержен изменениям). Должно быть как-то так:
Сохраняем. В списке полей на этом поле ставим указатель Уникальное поле
(кнопка со звездой слева):
Всё готово к парсингу, как к единоразовому, так и к ежеминутному (у компонента есть скрипт для запуска заданий из крона).
Спасибо за спонсорскую поддержку!
P.S. Владимиру этим компонентом, даже, как-то удавалось запускать импорт из WordPress в MODX. Надеюсь, он нам расскажет, как это сделать.
А теперь о развитии
- 1990 рублей - это не окончательная стоимость компонента, по мере развития стоимость будет только повышаться. Готово!
- Компонент будет расширяться до парсера HTML контента. Готово!
- Есть идея совмещения типов парсера (RSS лент и HTML контента). К примеру, в RSS лентах всегда присутствует ссылка на полную статью. В планах сделать так, чтобы воспользовавшись этим полем со ссылкой, передавать задание парсинга из RSS ленты в соседнее задание, которое настроено именно на этот HTML контент. Естественно, данная идея будет реализована только после того, как реализуется сам тип заданий «HTML контент». Готово!
- Будет внедрена поддержка ms2Gallery, UserFiles2, modClassVar. Что ещё?
- Если есть интересные идеи развития компонента - высказывайтесь.