Описание
Модуль Parser предназначен для парсинга любых html страниц в сущности (ноды, термины, юзеры и т.д.). Собственно на этом описание модуля можно закончить =)
Принцип работы парсера похож на работу поисковиков — он загружает одну из страниц сайта, ищет на ней ссылки и начинает ходить по ним в глубь. Встретив страницу, которая попадает под условие "распарсить эту страницу", модуль создает объект сущности и начинает выполнять пользовательский php код, заполняя поля и свойства. Картинки выкачиваются на сервер, создаются отсутствующие термины, значения приводятся к нужному типу.
Использование
Сразу хочу предупредить, что без знаний php работать с модулем будет крайне затруднительно.
Задания парсера находятся по адресу admin/structure/parser_jobs
. По умолчанию там есть только одно — Парсинг шаблонов с drupal.org, которое можно использовать как мануал.
Как начать парсить сайт:
- Создаём задание
admin/structure/parser_jobs/add
. - В поле Стартовый URL указываем начальный адрес. С него парсер начнёт работу.
- В поле URL тестовой страницы указываем адрес любой страницы, которая в будущем будет распарсена в ноду. HTML код этой страницы будет использован в качестве полигона.
- В поле Глубина указываем глубину, до которой парсер будет шагать по найденным ссылкам (простыми словами, глубина — это количество кликов, которые надо сделать относительно страницы указанной в Стартовый URL, чтобы добраться до страницы с контентом).
- Заполняем белый и чёрный список адресов.
- В поле Код проверки для дальнейшего парсинга страницы пишем код, который должен вернуть TRUE, если текущая страница попадает под условие "распарсить страницу в ноду".
- Указываем тип сущности, которая будут создаваться модулем.
- Для каждого поля пишем php код, возвращающий значение поля. В коде можно использовать весь функционал библиотеки phpQuery, парсинг с которой превращается в удовольствие :) С помощью кнопок "проверить" смотрим результат работы кода.
- Делаем полный бэкап базы и файлов! При неправильной конфигурации модуль может насоздавать много лишних нод.
- Начинаем парсинг.
Модуль запоминает адреса и идентификаторы нод, созданные из этих адресов. При повторном парсинге, модуль лишь обновляет уже существующие ноды.
Комментарии
Нет, это выдает некорректный результат.
preg_match('#Some (text to parse)#')
Прошу напишите код этого выражения годный для вставки в парсер, нет ни одного примера как вставлять php код, только DOT примеры.
А также назначение полезных функций - где их применить и как?
Спасибо
Напишите хоть как регуляркой спарсить - ведь
Отдает пустой результат - что не так?
Разобрался - сам ответил на свои вопросы - $page не использовал.
Модуль замечательный, не нарадуюсь, будет ли версия для drupal 6?
нет
Есть ли возможность сделать паузу между запросами менее 1 секунды, но более 0?
при попытке ввода 0,5 или 0.5 сбрасывает на 0.
Вопрос - скажем, спарсили 30 000 нод. Далее необходимо парсить все новые страницы (которые еще не встречались) по крону каждые 3 минуты по 100 нод. В этом случае парсер будет каждые раз по крону проходить 30 000 нод, смотреть что нет изменений и только потом начинать парсить? Есть ли возможность парсить только новые страницы?
нет
парсинг начинается с момента нажатия на кнопку "Сохранить и начать"
нет
Разве "Периодичность запуска в фоне" - это не запуск задания парсера по крону?
Поясню вопрос еще раз. Отпарсили 30 000 страниц кнопкой сохранить и начать, затем поставили данное задание выполняться по крону. В определенный момент на целевом сайте увеличилось число страниц до 30 005, после этого момента у нас включился крон. Получается парсер пройдет 30 000 уже отпарсенных страниц и только затем дойдет до новых 5 и обработает их?
И еще вопрос - всегда ли парсер обновляет сущности - даже если на таргетовой странице не было изменений, парсер все-равно обновит сущность?. Соответвенно "Не обновлять сущности" это решает?
Хм, чисто теоретически, возможно ли сразу после парсинга страницы занесение ее урла в "Чёрный список адресов"?
зависит от того где находятся ссылки на новые страницы, если в начале — то обработает первыми
зависит от состояния опции "Не обновлять сущности"
нет
Как ускорить работу парсера в случае "внутренней" работы - то есть когда он обходит страницы уже сохраненные на диске - увеличить количество потоков или что-то типа того?
Чтобы в случае моих 30 000 страниц уже сохраненных на диске и в том случае если ссылки на новые 5 страниц находятся в конце парсер пробегал эти 30 000 быстро.
По поводу занесения страниц в "черный список" после парсинга - вижу опцию "Сохранять адреса", как надстройка к этой опции или из нее вытекающей могли бы Вы сделать "Сохранять адреса в черный список"
никак. предназначение модуля — миграция контента, а не сбор данных. если вам нужно что-то иное — пишите своё решение
Поясните почему нельзя использовать модуль для сбора данных? Какие потенциальные нагрузки он может выдержать в случае грамотно настроенного сервера и отличного оборудования. Не будет ли он "задыхаться" от нескольких миллионов страниц из кэша?
В сравнее Feeds vs xandeadx parser, что предпочтительнее для подобного рода задач?
Архитектура модуля рассчитана на запуск в Batch-е, в этом случае никаких ограничений нет, только ресурсы вашего компьютера. Запуск в кроне добавлен в качестве костыля по многочисленным просьбам пользователей. Про нагрузки понятия не имею, посчитайте сами, сколько нужно памяти и процессорного времени, чтобы создать DOM представление 30000 html страниц.
Feeds так же не предназначен для этого.
Вы недооцениваете потенциал своего модуля, по-моему, он вполне подходит для сбора данных.
Если есть статистика, с какими максимальными объемами данных Вам приходилось работать при помощи этого модуля?
Если интересно, у меня примерно такие результаты:
8400 страниц обработано
2100 скачано
6300 взято из кэша
Это за 21 минуту.
В случае работы таргетингового сайта на том же хосте что и сайт-приёмник как-то можно ускорить работу модуля?
admin/structure/parser_jobs/results/* - думаю, следует сделать постраничный вывод по 100 резалтов на страницу - уже при нескольких тысячах браузер начинает страдать.
и все же какими возможными способами - скажите хоть в какую сторону смотереть можно ускорить работу, хотя бы в часте взятия из из кэша. Это операция по идее должна быть быстрее чем не из кэша, но существенной разницы я не вижу.
Парсер периодически прекращает работу. Например, при оставшихся 30 000 в очереди парсер может прервать работу на 3%, а может на 5%.
Это происходит из-за не получения ответа от сервера с которого парсят? Почему парсер прекрабщает работу?
Тип сущности: материал - не появляется поле созданное модулем YouTube Field
можно ли это исправить?
Здраствуйте xandeadx, скажите ваш модуль позволяет мигрировать любые элементы с других веб-страниц в Друпал, интенгрируя их значения в поля, я правильно понимаю?
модуль позволяет из html страниц создавать сущности
Простите за навязчивость, но мне не совсем понятно что такое сущности?
То есть если на HTML страничке есть картинки и их много, значит с помощью данного модуля можно мигрировать данные картинки в поле(field IMAGE) типа контента, а также различные файлы, то есть процесс реализации миграции схож с модулем Feeds ?
сущности это fields Drupal?
Спасибо, будем пробовать, если это так как вы говорите, значит это очень мощный модуль и раз html можно распарсить, asp странички также
Если задать маску в поле Стартовый URL *, то парсер вообще нечего не парсит.
https://drupal.org/project/project_theme?page=[mask:0,890]
@xandeadx привет и большой сенкс за модуль
как справится с бедой?
цель class="t11_2" (body), "живьём" выглядит так:
Управляющий Красноярским региональным отделением Фонда Леонид Адашкин провел выездное совещание с директорами филиалов по вопросам оказания услуг по оздоровлению граждан льготной категории на примере курорта «Озеро Учум».
при проверке и парсинге получается так:
Управляющий Красноярским региональным отделением Фонда Леонид Адашкин провел
выездное совещание с директорами филиалов по вопросам оказания услуг по
оздоровлению граждан льготной категории на примере курорта «Озеро Учум».
тега не наблюдается, при редактировании материала, ckeditor "лечит" автоматом, т.е. достаточно зайти в редактирование и тут же сохранить.
Пробовал разными вариантами )), в т.ч. и такой
толку - ноль
* тега не наблюдается
))
*
<br>
тега не наблюдаетсячто требуется?
))) решить беду, выглядит некрасиво, вручную перелопачивать нереально
может непонятно объяснил, сейчас скрины выложу
сразу после парсинга
так выглядит текст в редактировании ноды
включаю ckeditor, сохраняю - результат
может не в парсере дело? ))
текстовый фильтр расставляет
<br />
на каждый конец строки. стандартное поведение друпала"быстрого" решения нет?
удалить
\n
из текстаxandeadx, слов нет ))
спасибо большое!
$content =str_replace("\n","",$content);
Я вот пользуюсь http://catalogloader.com и доволен. Есть выгрузку почти куда-угодно.
Уважаемый Xandeadx подскажи плиз в чем проблема при парсинге нескольких нод появляется ошибка записей в системном журнале нет после нажатия ф5 снова парсит 5-10 нод и вылетает
Возникла AJAX HTTP ошибка. Полученный код HTTP: 500 Следует отладочная информация. Путь: /batch?id=42&op=do Текст Состояния: Service unavailable (with message) Текст Ответа: PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: UPDATE {parser_urls} SET parsed=:db_update_placeholder_0 WHERE (url = :db_condition_placeholder_0) AND (jid = :db_condition_placeholder_1) ; Array ( [:db_update_placeholder_0] => 1 [:db_condition_placeholder_0] => http://www.--/cosmetic-company-in-india/ [:db_condition_placeholder_1] => 5 ) в функции _parser_url_mark_parsed() (строка 1307 в файле /var/www/---/data/www/----/sites/all/modules/xandeadx-parser-0d12224/parser.inc).Uncaught exception thrown in shutdown function.PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: UPDATE {batch} SET batch=:db_update_placeholder_0 WHERE (bid = :db_condition_placeholder_0) ; Array ( [:db_update_placeholder_0] => a:13:{s:4:"sets";a:1:{i:0;a:15:{s:7:"sandbox";a:5 ЭТО НЕ ВЕСЬ СПИСОК НЕ ВЛАЗИТ В КОММЕНТАРИЙ Пожалуйста, откройте <a href="/batch?id=42&op=finished">страницу ошибки</a>";} [:db_condition_placeholder_0] => 42 ) in _batch_shutdown() (line 537 of /var/www/--/data/www/----/includes/batch.inc).
гуглите "MySQL server has gone away"
Добрый день. А где в модуле исправляется текст: "Контент спарсен со страницы..."?
А так же где можно убрать перенаправление на anonim.to/? в ссылке?
в настройках модуля admin/structure/parser_jobs/settings
Это я нашел. Иногда можно отключить, но сейчас интересует как можно изменить саму надпись "Контент спарсен со страницы" допустим на "ссылка на источник", и убрать из ссылки перенаправление, если первоисточник требует обратной ссылки?
добавьте поле, сохраняйте в нём адрес страницы, темизируйте по желанию
xandeadx, день добрый!
Отличный модуль. Столкнулся с проблемой при парсинге youtube видео с других сайтов, так чтобы в Drupal складывало url видео для отображения через Youtube field https://www.drupal.org/project/youtube
Под строкой кода написано:
PHP код, который должен вернуть массив значений поля (array(значение1, значение2, ...)). Каждое значение должно быть в формате:
Код для парсинга
При тесте выводит:
https://yadi.sk/i/S1hVBeLObyHAc
При парсинге значения не сохраняются, ошибка в журнале:
https://yadi.sk/i/xQEO46pqbyHPy
Просьба о помощи, что может быть не так?
скачайте последнюю версию парсера
Модуль может с одной скормленной ему страницы создать несколько нод одного типа? Если нет, то может быть у вас есть совет?)
Увидел галочку "Режим списка" похоже это оно. Есть какие-то тонкости при установке этой галки?
'summary' => $doc->find('div.ss11')->html(),
'format' => 'NEWS',
Стоит в body так
в формате NEWS все отлично настроено, но при переносе все теги отображаются как текс, если зайти в это новость и нажать сохранить еще раз то все ок.
Где ошибаюсь?
Показывать любой HTML как обычный текст - убрана
Пропускать указанные ниже HTML-теги - стоит и указаны все нужные теги
Тут решено - я тупанул.
Собственно вот ошибка, я так понимаю он не может вставить в бд потому что данная картинка уже есть?
Как побороть?
Сори вопрос решен!
Сам вызвал ошибку, появились не удаленные записи в базе.
Удалил все норм.
Эх все такие нет, видать не все так просто. Опять та же ошибка с другой картинкой.
Объясните пожалуйста, что за ошибка, это дубликат именно картинки или поля?
Как такое могло возникнуть и как победить?
Добрый день!
Отличный модуль, спасибо вам за работу.
При переносе страниц создаю и термины для них.
В случае когда каталог двухуровневый работает верно, а когда 3 уровня в каталоге, создаются дубли 3-его уровня. В чем может быть проблема?
проверил, дубли не создаются
Нашел проблему. Некоторые ссылки в хлебных крошках содержали перенос строки, в этом случае появлялись дубли.
Надо бы в parser_create_terms_hierarchy() добавить удаление переносов строки.
Очень классный модуль. Аналога нормального пока не нашел. Подскажите пожалуйста: парсит он супер, но вот когда пытаюсь вытащить изображение, с сайта-донора, постоянная ошибка: "Возникла AJAX HTTP ошибка. Полученный код HTTP: 500 Следует отладочная информация. Путь: /batch?id=154&op=do Текст Состояния: Service unavailable (with message) Текст Ответа: EntityMetadataWrapperException: There can be only numerical keyed items in a list. в функции EntityListWrapper->get() " Использую такой код:
return array(
'file' => $doc->find('.image a:first')->attr('href');,
);
Проверка возвращает правильный результат. В чем может быть дело?
точка с запятой лишняя
Спасибо. Но это я случайно тут написал точку с запятой. Дело в том что в настройках поля "количество" изображений, стоит "Неограничено." Когда ставлю в настройках "одно" изображение, то все работает. Не подскажете, как использовать поле с несколькими изображениями?
как сказано в описании к полю - надо возвращать массив значений, а не значение
Спасибо, пять раз смотрел и не заметил... Бывает. Успехов в разработке.
Как сохранить фотографии и передать переменную в Entity wrapper? спасибо.
Добрый день!
Не знаю на сколько важно, но лучше отписаться.
Мы заказываем сервер и его обслуживание у Хетзнера. С некоторой периодичностью они проверяют все файлы сайтов на наличие распространенных дыр. Сегодня поругались на Ваш модуль:
./sites/all/modules/xandeadx-parser-99f3d56/codemirror2/demo/loadmode.html
./sites/all/modules/xandeadx-parser-99f3d56/phpQuery/phpQuery/phpQuery.php
К сожалению более конкретно (что именно не так с этими файлами), они не уточнили.
Версия модуля: version = 7.x-2.x-dev
Привет xandeadx!
Подскажи у меня все работало, а сейчас какая-то беда с датой. Я так думаю это из за секунд.
$lolo= $doc->find('div.newsdate_l')->text();
И получаю
09.03.2015 22:17
Потом добавляю таймзону
И получаю
09.03.2015 22:17 +1000
Потом первожу в понятный вид для drupal
И получаю
1425903420
И до этого все работало, а сейчас дата в новости такая 09.03.2015 00:00
Тоесть он не понимает время, и указывает 00:00
Это может быть из за секунд?
Если да то как указать ему секунды, на сайте исходнике их нет :(
Эх жаль ответа нет, так и не разобрался я.
Здрасте. Я еще хотел узнать, как подружить парсинг с Cron-ом? То есть добавить в автозагрузку?
Здрасте. Замечательный продукт. Вопросс: Я настроил парсинг, кождое поле дает положительный результат при проверке, но почему то дальше первой страницы не заходит. Не создает ни одной сущьности. С чем это может быть связанно?
Привет!
Скажи, пожалуйста, если сделать rollback, почему могут подгружаться старые данные при повторной загрузке?
Как правильно "актуализировать" контент на двух сайтах? (если с одного удалили материал, на втором тоже убрать)
Спасибо!
все страницы сохраняются в кэше и в дальнейшем берутся из него
Это понятно, но смотри: тут всего два http://mart-igr.ru/catalog/item140 (это донар)
а после сканирования http://urfinjus.ru/catalog/575 - гораздо больше. При том я делал и rollback, и ставил для всех товаров status 0 перед импортом (в процессе импорта возвращал в 1).
По мне так он не должен отображать из кжша, если его нет на сайте? или я не понял чего-то?
если какая-то страница есть в кэше, то она берётся из него
Повторюсь.
Тут ситуация в том, что в этом разделе у донора всего две позиции, а на сайт закачиваются все. И те, которые были закачены раньше.
Т.е. парсер проверяет сначала кэш, а потом сайт-донар?
парсер ничего не проверяет, если страница есть в кэше то она берётся из него
Даже если ее уже нет на сайте-донаре? Мне кажется не совсем логично.
Тогда как сделать актуальную версию сайта донора? удалять кэш?
да
Из группы Вконтакта этим можно посты парсить?
У ВКонтакте есть API, посты получать проще и удобней
А можно как-то спарсить запароленный сайт, да к томуже с капчей?
т.е. я готов ввести и пароль и капчу руками, но как научить задание их спрашивать?
Крутейший парсер!
Уточните, возможно ли вызывать задание через rules модуль и есть ли способ передать переменную в Стартовый URL.
Всем привет, подскажите как запарсить картинку которая подгружается вовремя прокрутки?
Донор:
http://www.idealista.com/inmueble/29726262/
Картинку выдает парсер:
...и это
А должен выдавать:
<img src="http://img2.idealista.com/thumbs?wi=850&he=0&en=e2QOq%2B%2BzUcbn%2B%2FRVSTVyZc6BNWlwC5wdWL4a68verM6lrS62OfBvxDW9gla65OfRVaLMnt3SeF0kt8O3qFU4Zkhka2%2Fpsfom%2B8UtUtfStjVXAJjtrgu%2FAHvnPKZ9oEtLaCs3u0nPlX1cFSD6wLdDPAC2xW0LfAH0OvyByooEqmg1mc3Qgp9%2Brts0FRL%2B3jfC&ch=1161940880">
Делаю так:
Как получить нормальный URL?
http://img2.idealista.com/thumbs?wi=850&he=0&en=e2QOq%2B%2BzUcbn%2B%2FRVSTVyZat1V3ri3FtH1mi0Mzqq81IIKMQDsO8eGAjuuACdBV0OVaLMnt3SeF0kt8O3qFU4Zkhka2%2Fpsfom%2B8UtUtfStjVXAJjtrgu%2FAHvnPKZ9oEtLaCs3u0nPlX1cFSD6wLdDPAC2xW0LfAH0OvyByooEqmg1mc3Qgp9%2Brts0FRL%2B3jfC&ch=-533351751
Помогите спарсить дату.
На сайте дата выводится в виде 02-03-2016
http://xandeadx.ru/blog/drupal/554#comment-8409
return strtotime("02-03-2016");
Добрый день!
Спасибо за отличный модуль.
К сожалению, не смог справиться с одним вопросом.
Имеется стартовая страница с ссылками на страницы которые нужно получить.
Список страниц ограничен, но при запуске задания, непонятно почему, сохраняются страницы на которые нет ссылок со стартовой.
Не важно ставлю я уровень 0 или 1, все равно они скачиваются.
Все поставил и настроил
Все тесты возвращают положенный результат, а в базу заносятся статьи игнорируя глубину, на которую парсер должен ходить по ссылкам, и вообще непонятно как выбирающимся ссылкам. Где же тут подвох?
Прошу прощения, разобрался!
Нужно было "Сохранить и начать", а я нажимал "Сохранить и продолжить"
Помогите не могу настроить парсинг:
<td valign=top>
На странице нет классов, немогу составить код, читал, гуглил, не помогло.
Решил проблему поиском второй таблицы
'value' => $doc->find('table:eq(2) > tr > td')->html(),
Возник следующий вопрос, как удалить из Текст основного поля body ненужную стоку (картинку)
<img src='http://www.example.com/show/24794/2944.jpg?800' width='800' height='370' border='0' align='left' style='margin: 0 16px 8px 0;' alt='example'>
Ответа еще нет а у меня уже есть вопрос.
Для поиска картинки я использовал :
'file' => $doc->find('img:eq(5)')->attr('src'),
Но как получить все картинки?
Можно ли использовать xpath?
Решил запарсить «Кинопоиск», но чего то не выходит. Главную парсит, а страницу фильма нет. Смотрю массив $doc, а в нем ерунда какая то. Наверное кинопоиск не отдает страницу парсеру. Может нужен юзерагент…
DoktorPC - Я парсю несколько картинок таким образом:
$images = array();
foreach ($doc->find('#gallery_group a') as $b) {
$images[] = (pq($b)->attr("href"));
}
return $images;
В настройках поля изображения обязательно установить "Без ограничений"
Все привет! У меня другой вопрос - на многих сайтах цена с пробелом, при парсинге остается только первая цифра, как удалить пробел?
Цену я беру так, магазин на Commerce:
return array(
$a = $summ = 'amount' => $doc->find('.product__price .js-price2')->text()*100,
);
Если можно код пожалуйста.
Приветствую.
Установил данный модуль, настроил задание - проверки прошли так как нужно.
Запустил парсер. Все URL обработаны, но сущности не созданы - выбирал Материал -> Статья.
Где я затупил?
Разобрался с созданием сущностей.
Возможно ли создавать несколько статей из одной страницы?
Пример: первая статья - первый блок со сраницы, вторая страница - второй блок со страницы и т.д.
Опция "Режим списка"
Не совсем получается...
Есть страница со списком моделей телефонов http://sigmakey.com/ru/Sigma-Overview/Supported-Models.html?brand=1
Нужно создать статьи из этой страницы по каждой модели
Пример результата:
Название: Разблокировать Alcatel 4045D
Текст: любой красивый текст по которому будет упоминаться Alcatel 4045D
Возможно ли это осуществить?
Включаете режим списка, возвращаете список, парсите как обычный сайт.
Есть какая-нибудь инструкция с примерами? Не могу список получить
http://xandeadx.ru/blog/drupal/605
Добавить комментарий