Очень часто у заказчиков возникает желание брать контентную информацию с ряда сайтов. И конечно же заказчик не собирается это делать ручками, а хочет чтобы все было разово настроено и автоматически работало. Для этого и предназначен модуль shs.parser. Он позволяет по rss каналам брать ссылки на материалы сайтов и парсить контент этих сайтов.
Контент загружается с помощью библиотеки cURL(на стороне сервера) и парсится с помощью библиотеки PHP Simple HTML DOM Parser(включена в модуль). Подробнее про эту библиотеку вы можете почитать на просторах интернета, в данной статье я затрагивать этот вопрос не буду, а лишь опишу функциональные возможности модуля и кратко принцип работы.
Принцип работы модуля прост: 1. Подключается к rss потоку, разбирает xml выдачу. 2. По урлам xml выдачи осуществляет парсинг материалов сайта. 3. Создает новые элементы с распарсенным материалом.
И так. Заходим в модуль Парсер контента в блоке Контент. И мы сразу видим нечто похожее на функционал инфоблоков. На данном этапе мы можем добавить новый парсер. Парсер, терминологией инфоблоков, это некий элемент, обладающий определёнными свойствами и позволяющий парсить контент сайтов.
На данной картинке представлена вкладка Парсера по-умолчанию. Основными параметрами этой вкладки являются.
Название – название файла, обязательное поле, но на работу никак не влияющее. RSS канал – одно из основных полей, в которое вводится полный адрес rss потока. Именно по этому адресу будет разбираться rss xml. При допущении ошибки в данном поле парсер работать не будет. ID инфоблока – идентификатор инфоблока, в который будет осуществляться запись вновь созданных элементов. ID раздела – идентификатор раздела. Селектор контента – еще один из основных параметров парсера. Это путь контента на сайте, который мы собираемся парсить. Фактически парсер забирает именно содержимое этого селектора. Кодировка – кодировка сайта, который парсим. В будущем будет добавлено автоопределение.
На данной картинке представлена вторая вкладка парсера - Превью. Тут отображены все параметры, которые связаны с парсингом превью информации. То есть фактически это информация, которая берется непосредственно с rss потока из тега description.
Некоторые параметры кладки:
Удалять теги – удаляет все теги в превью описании. Кроме следующих – указывается список тегов, которые не требуется удалять. Пример:
<img><a>
- значит, то эти два тега не будут удалены из превью описания.
Первая картинка, как превью – картинка для превью берется как первая из описания. Заменять пути/сохранять картинки на сервер – интересный параметр, позволяющий подменять пути к картинкам на свои(относительно своего сайта), при этом сохраняя картинки на свой сервер. Удалять элементы – позволяет удалять обозначенные элементы. Перечисление идет через запятую. Удалять атрибуты элементов – удаляет атрибуты у заданных элементов, перечисление идет через запятую.
Вкладка детально выглядит идентично вкладке Превью с аналогичными полями и функционалом с той лишь разницей, что контент для Детальной информации берется непосредственно с контента сайта.
И последняя вкладка - Общие настройки Парсера.
Описание некоторых параметров:
Парсить мета-описание – забирает мета-описание со страницы сайта, котоырй парсим. Парсить ключевые слова – забирает ключевые слова со страницы сайта. Запускать по агенту – запуск парсера будет осуществляться по агенту. Периодичность запуска – периодичность запуска агента.
Модуль временно удален из маркетплейса. Пока по непонятным причинам парсер некорректно работает на 12 версии Битрикса. В начале следующей недели планируется открыть обновленный модуль.
Когда будет опубликована новая версия ? Возможно ли добавить в модуль проверку на уникальность новостей ? например по названию. Так же многие наверно используют одну rss в которую пакуются rss с нескольких сайтов, такое удобно делать через yahoo pipes, возможно ли в этом случае использовать разные селекотры например для разных url в теге link
Я пока модуль совсем убрал из-за того, что на 12 версии Битрикса и пхп 5,3,3 он ведет себя не стабильно. Времени на разбор полетов пока нет. Постараюсь после НГ разобраться в проблеме.
Установил,попытался создать парсер,а мне выдает; Веб-страница по адресу http://www....... ./bitrix/admin/parser_edit.php?lang=ru временно недоступна или перемещена. права на папки и файлы менял - не помогает,в чем может быть проблема?. удалил и переустановил -то же самое. пробовал в разных браузерах.
То же не знаю,хотя первая версия парсера работала. Хром и ИЕ не могут открыть страницу,а моззила пишет : Ошибка в типе содержимого Страница, которую вы пытаетесь просмотреть, не может быть показана, так как она использует неверную или неподдерживаемую форму компрессии. ставлю на демо версию битрикса бизнес.,на вдс сервере. Файлик Ваш положил,мой был такой же.
будьте добры,если возможно, приведите пожалуйста пример настройки на конкретном сайте. для автомайлру ставлю в селекторе div#feedContent div.entry ,все равно парсит только заголовок и анонс. xml файла не нашел в коде их сайта.
Изначально в $data корректные символы. Проблема в этом месте $html = phpQuery::newDocument($data, "text/html;charset=".LANG_CHARSET); все русские символы превращаются в "???"
$html = phpQuery::newDocument($data, null); - не помогает.
Указание кодировки - это осталось от старого функционала. Щас фактически бесполезное действие.
Могу предположить, что либо на сайте явно не указана кодировка сайта. Дайте сайт, гляну. Но я предупреждал, что в некоторых случаях может быть проблема с cp1251. Пока нет времени, чтобы разобраться полностью в этой ситуации.
Добрый день. Спасибо вам за проделанную работу. Очень это нам уже помогло. Вот несколько идей того, что хотелось бы, чтобы было в этом модуле в дальнейшем.
2) Не правильно формируются ссылки на изображения, если они не начинаются с "/". Например, если на сайте "_mod_files/ce_images/news/1_img_0096.jpg" получается "http://www.vladimirskysobor.ru_mod_files/ce_images/news/1_img_0096.jpg".
Мы вышли из этой ситуации для себя изменением строки кода в функциях parserFirstImg и changeImgSrc $site = $this->getUrlSite().'/'; но для модуля это, конечно, не лучшее решение
Теперь о том, что хотелось бы: 1) Если картинка для превью так и не нашлась (что бывает очень часто) - брать первую из детального описания. Идеально было бы, если бы ещё была возможность её уменьшить средствами модуля. Мы для себя просто пока взяли её из детальной: if($this->preview_first_img=="Y" ) { $PREVIEW_IMG = $this->parserFirstImg(phpQuery::newDocument($DETAIL_TEXT), "text/html;charset=".LANG_CHARSET);
2) Предлагать что-нибудь делать с датой из RSS ленты. У нас на сайте в качестве даты используется ACTIVE_FROM. Поэтому мы для себя написали возможность вставлять её из RSS туда: $arLoadProductArray["ACTIVE_FROM"]=CIBlockRSS::XMLDate2Dec($item["pubDate"] ) ;
3) То что уже предлагалось - в некое свойство сохранять тему: $arLoadProductArray["PROPERTY_SOURCE"]=$item['link'];
4) Нам нужно мониторить много RSS-каналов. Для каждого заполнять все параметры занова долго. Было бы здорово иметь возможность копировать парсер. Или, может, сделать глобальные настройки для всех парсеров. Если они не указаны - использовать настройки парсера конкретного. В глобальных настройках можно было бы и указать ID инфоблока по умолчанию.
5) Возможность запустить все парсеры или выделенные парсеры.
6) У Вас сделаны замечательные подсказки с примерами. Но нет примера на удаления тегов. Везде в других местах - перечисление через запятую. поэтому, мы пытались вводить не <a><img> а "a,img". И, кстати, может быть, было бы удобно иметь возможность наоборот удалять только перечисленные теги.
7) А ещё было бы здорово иметь какой-нибудь предпросмотр того какие поля заполнятся и чем в новости после парсинга. на примере одной записи.
Вдруг пригодится. По поводу кодировки c UT8 лично мне в описанной выше ситуации помогло следующее: вставить if($encoding=="utf-8" ) { $DETAIL_TEXT = mb_convert_encoding($DETAIL_TEXT,"windows-1251", "utf-8" ); } перед $arLoadProductArray = Array( в файле rss_content_parser.php
Подскажите пожалуйста, а можно как-то с помощью парсера сохранить в инфоблок дату создания? т.е. то, что в rss находится между тегами<pubdate></pubdate>
И ещё. К сожалению, то что я написал чуть выше, верно не для всех сайтов с UTF. Сайт: http://tsar.cerkov.ru/ выдаёт неправильную кодировку и описанный выше код не помогает. Тогда как для сайта http://gorelovo.cerkov.ru/ описанный выше код мне помог.
Здравствуйте столкнулся с ошибкой в работе парсера. Помогите справится с ней. Ошибка появляется во время запуска парсера:
Found
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, admin@agroprominform.ru and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log. Apache Server at agronews.agroprominform.ru Port 80
Здравствуйте столкнулся с ошибкой в работе парсера. Помогите справится с ней. Ошибка появляется во время запуска парсера:
Found
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, admin@agroprominform.ru and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log. Apache Server at agronews.agroprominform.ru Port 80
Полная ошибка 302 Found. Где копать? что изменить?
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».