Парсер контента RSS лент, с возможностью скачивания медиа-контента на сайт.

При добавлении полей ленты, которые надо парсить, вместо названия поля (title или enclosure) можно указать @INLINE чанк, который будет обработан Fenom . Благодаря этому, в этих полях можно выстраивать совершенно любую логику, вплоть до создания новых разделов «на ходу».

Подробнее о работе

Стояла задача, как можно больше упростить взаимодействие с компонентом, поэтому жду мнений, насколько компонент прост в управлении.

Добавляем задание

Заходим на страницу компонента, жмём Добавить задание => Добавить RSS-ленту .
На вкладке Основное заполняем примерно так:

Переключаемся на вкладку Конфигурация , где можно указать:

  • Шаблон для создаваемых ресурсов,
  • Контекст,
  • Родительский контейнер в пределах выбранного контекста,
  • Сконфигурировать скачивание медиа-контента,
  • При необходимости поменять базовый тег ленты и базовый тег записи.

Расширения медиа-контента и папки для сохранения каждого из расширений указываются в JSON.

Добавляем поля для парсинга

На только что добавленном задании нажимаем правой кнопкой и выбираем Поля задания :

Откроется список полей задания, который пока пуст.

Помимо добавления полей задания мы можем просмотреть Массив значений ленты - это распечатанный массив с данным из первой записи ленты:

Запоминаем названия полей, которые нам надо парсить на сайт и кликаем Добавить поле . Откроется окошко с возможностью указать:

  1. Системное поле . Выпадающий список системных полей ресурса и ТВ-полей.
  2. Поле в источнике . Текстовое поле, в которое нужно ввести наименование тега в RSS-ленте.
    Можно указать @INLINE чанк, который будет обработан Fenom из pdoTools . В чанке содержатся плейсхолдеры всех возможных полей из RSS-ленты, которые имеются в записи между тегами item , а также массив с настройками задания $_task .
    За счёт внедрения в данное поле Fenom , можно будет, получая значение из тега category (как например в RSS Lenta.ru) делать выборку по базе ресурсов, в поисках ID аналогичной категории на нашем сайте, а если не найдено - добавлять.
    Тег enclosure и ему подобные, указываются либо через чанк: «@INLINE {$enclosure["url"]}», либо в виде CSS селектора: «enclosure».
    Если не указано или значение по данному полю в ленте пустое, то в качестве значения для Системное поле будет взято значение из следующего поля - Значение по-умолчанию .
  3. Значение по-умолчанию . В данном поле можно указать значение, которое будет записано в Системное поле . Например, если мы в Системное поле выбрали class_key , то, чтобы создавались Тикеты, мы в поле Значение по-умолчанию пишем «Ticket», а Поле в источнике оставляем пустым.
    Такую же «магию» можно сделать и с полем published , указав в значении по-умолчанию цифру «1». Тогда ресурс на сайт будет добавляться сразу опубликованным.

Помимо основых полей с данными, которые необходимо выгрузить на сайт, нам надо ещё добавить поле, по которому пакет будет понимать, что данная запись уже есть на сайте. Для этого добавляем новое поле , значение Системное поле оставляем пустым, а в Поле в источнике пишем, например, «guid» (потому что он менее всего подвержен изменениям). Должно быть как-то так:

Сохраняем. В списке полей на этом поле ставим указатель Уникальное поле (кнопка со звездой слева):

Всё готово к парсингу, как к единоразовому, так и к ежеминутному (у компонента есть скрипт для запуска заданий из крона).

Спасибо за спонсорскую поддержку!

P.S. Владимиру этим компонентом, даже, как-то удавалось запускать импорт из WordPress в MODX. Надеюсь, он нам расскажет, как это сделать.

А теперь о развитии

  1. 1990 рублей - это не окончательная стоимость компонента, по мере развития стоимость будет только повышаться. Готово!
  2. Компонент будет расширяться до парсера HTML контента. Готово!
  3. Есть идея совмещения типов парсера (RSS лент и HTML контента). К примеру, в RSS лентах всегда присутствует ссылка на полную статью. В планах сделать так, чтобы воспользовавшись этим полем со ссылкой, передавать задание парсинга из RSS ленты в соседнее задание, которое настроено именно на этот HTML контент. Естественно, данная идея будет реализована только после того, как реализуется сам тип заданий «HTML контент». Готово!
  4. Будет внедрена поддержка ms2Gallery, UserFiles2, modClassVar. Что ещё?
  5. Если есть интересные идеи развития компонента - высказывайтесь.

Песочница

Командир судна 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

Данная статья не подлежит комментированию, поскольку её автор ещё не является

Как говорится: «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

Данная статья не подлежит комментированию, поскольку её автор ещё не является