Drupal → Модуль Parser — парсинг сайтов

17.06.2011

Описание

Модуль Parser предназначен для парсинга любых html страниц в сущности (ноды, термины, юзеры и т.д.). Собственно на этом описание модуля можно закончить =)

Парсинг

Принцип работы парсера похож на работу поисковиков — он загружает одну из страниц сайта, ищет на ней ссылки и начинает ходить по ним в глубь. Встретив страницу, которая попадает под условие "распарсить эту страницу", модуль создает объект сущности и начинает выполнять пользовательский php код, заполняя поля и свойства. Картинки выкачиваются на сервер, создаются отсутствующие термины, значения приводятся к нужному типу.

Использование

Сразу хочу предупредить, что без знаний php работать с модулем будет крайне затруднительно.

Задания парсера находятся по адресу admin/structure/parser_jobs. По умолчанию там есть только одно — Парсинг шаблонов с drupal.org, которое можно использовать как мануал.

Как начать парсить сайт:

  1. Создаём задание admin/structure/parser_jobs/add.
  2. В поле Стартовый URL указываем начальный адрес. С него парсер начнёт работу.
  3. В поле URL тестовой страницы указываем адрес любой страницы, которая в будущем будет распарсена в ноду. HTML код этой страницы будет использован в качестве полигона.
  4. В поле Глубина указываем глубину, до которой парсер будет шагать по найденным ссылкам (простыми словами, глубина — это количество кликов, которые надо сделать относительно страницы указанной в Стартовый URL, чтобы добраться до страницы с контентом).
  5. Заполняем белый и чёрный список адресов.
  6. В поле Код проверки для дальнейшего парсинга страницы пишем код, который должен вернуть TRUE, если текущая страница попадает под условие "распарсить страницу в ноду".
  7. Указываем тип сущности, которая будут создаваться модулем.
  8. Для каждого поля пишем php код, возвращающий значение поля. В коде можно использовать весь функционал библиотеки phpQuery, парсинг с которой превращается в удовольствие :) С помощью кнопок "проверить" смотрим результат работы кода.
  9. Делаем полный бэкап базы и файлов! При неправильной конфигурации модуль может насоздавать много лишних нод.
  10. Начинаем парсинг.

Модуль запоминает адреса и идентификаторы нод, созданные из этих адресов. При повторном парсинге, модуль лишь обновляет уже существующие ноды.

Скриншот 1
Скриншот 2
Скриншот 3

Скачать модуль
Пример парсинга сайта drupalsn.ru

Написанное актуально для
Parser 7.x-2.x
Похожие записи

Комментарии

Михаил
27.12.2013, 14:27

$doc->find('br:last');

Нет, это выдает некорректный результат.

Михаил
28.12.2013, 01:48

preg_match('#Some (text to parse)#')
Прошу напишите код этого выражения годный для вставки в парсер, нет ни одного примера как вставлять php код, только DOT примеры.

А также назначение полезных функций - где их применить и как?

Полезные функции:
parser_get_pqelements_values($doc, $selector, $function = 'html', $map = 'trim') - возвращает массив значений элементов.
parser_get_entity_id_by_remote_id($remote_id, $job_id = NULL) - возвращает id созданной сущности по Remote ID.
parser_get_entity_by_conditions($entity_type, array $properties = NULL, array $fields = NULL) - возвращает объект сущности по значениям её свойств и полей.

Спасибо

Михаил
28.12.2013, 01:55

Напишите хоть как регуляркой спарсить - ведь

preg_match('#<title>(.*?)</title>#is', $text, $m);
echo $m[1];

Отдает пустой результат - что не так?

Михаил
28.12.2013, 03:04

Разобрался - сам ответил на свои вопросы - $page не использовал.

Михаил
29.12.2013, 04:47

Модуль замечательный, не нарадуюсь, будет ли версия для drupal 6?

Михаил
06.01.2014, 00:21

Есть ли возможность сделать паузу между запросами менее 1 секунды, но более 0?
при попытке ввода 0,5 или 0.5 сбрасывает на 0.
Вопрос - скажем, спарсили 30 000 нод. Далее необходимо парсить все новые страницы (которые еще не встречались) по крону каждые 3 минуты по 100 нод. В этом случае парсер будет каждые раз по крону проходить 30 000 нод, смотреть что нет изменений и только потом начинать парсить? Есть ли возможность парсить только новые страницы?

Есть ли возможность сделать паузу между запросами менее 1 секунды, но более 0?

нет

В этом случае парсер будет каждые раз по крону проходить 30 000 нод, смотреть что нет изменений и только потом начинать парсить?

парсинг начинается с момента нажатия на кнопку "Сохранить и начать"

Есть ли возможность парсить только новые страницы?

нет

Михаил
06.01.2014, 17:44

В этом случае парсер будет каждые раз по крону проходить 30 000 нод, смотреть что нет изменений и только потом начинать парсить?

парсинг начинается с момента нажатия на кнопку "Сохранить и начать"

Разве "Периодичность запуска в фоне" - это не запуск задания парсера по крону?
Поясню вопрос еще раз. Отпарсили 30 000 страниц кнопкой сохранить и начать, затем поставили данное задание выполняться по крону. В определенный момент на целевом сайте увеличилось число страниц до 30 005, после этого момента у нас включился крон. Получается парсер пройдет 30 000 уже отпарсенных страниц и только затем дойдет до новых 5 и обработает их?
И еще вопрос - всегда ли парсер обновляет сущности - даже если на таргетовой странице не было изменений, парсер все-равно обновит сущность?. Соответвенно "Не обновлять сущности" это решает?

Есть ли возможность парсить только новые страницы?
Нет

Хм, чисто теоретически, возможно ли сразу после парсинга страницы занесение ее урла в "Чёрный список адресов"?

Получается парсер пройдет 30 000 уже отпарсенных страниц и только затем дойдет до новых 5 и обработает их?

зависит от того где находятся ссылки на новые страницы, если в начале — то обработает первыми

всегда ли парсер обновляет сущности - даже если на таргетовой странице не было изменений, парсер все-равно обновит сущность?

зависит от состояния опции "Не обновлять сущности"

Хм, чисто теоретически, возможно ли сразу после парсинга страницы занесение ее урла в "Чёрный список адресов"?

нет

Михаил
06.01.2014, 18:25

Как ускорить работу парсера в случае "внутренней" работы - то есть когда он обходит страницы уже сохраненные на диске - увеличить количество потоков или что-то типа того?
Чтобы в случае моих 30 000 страниц уже сохраненных на диске и в том случае если ссылки на новые 5 страниц находятся в конце парсер пробегал эти 30 000 быстро.

Михаил
06.01.2014, 18:29

По поводу занесения страниц в "черный список" после парсинга - вижу опцию "Сохранять адреса", как надстройка к этой опции или из нее вытекающей могли бы Вы сделать "Сохранять адреса в черный список"

никак. предназначение модуля — миграция контента, а не сбор данных. если вам нужно что-то иное — пишите своё решение

Михаил
06.01.2014, 18:41

Поясните почему нельзя использовать модуль для сбора данных? Какие потенциальные нагрузки он может выдержать в случае грамотно настроенного сервера и отличного оборудования. Не будет ли он "задыхаться" от нескольких миллионов страниц из кэша?
В сравнее Feeds vs xandeadx parser, что предпочтительнее для подобного рода задач?

Архитектура модуля рассчитана на запуск в Batch-е, в этом случае никаких ограничений нет, только ресурсы вашего компьютера. Запуск в кроне добавлен в качестве костыля по многочисленным просьбам пользователей. Про нагрузки понятия не имею, посчитайте сами, сколько нужно памяти и процессорного времени, чтобы создать DOM представление 30000 html страниц.

Feeds так же не предназначен для этого.

Михаил
06.01.2014, 19:00

Вы недооцениваете потенциал своего модуля, по-моему, он вполне подходит для сбора данных.
Если есть статистика, с какими максимальными объемами данных Вам приходилось работать при помощи этого модуля?
Если интересно, у меня примерно такие результаты:
8400 страниц обработано
2100 скачано
6300 взято из кэша
Это за 21 минуту.

В случае работы таргетингового сайта на том же хосте что и сайт-приёмник как-то можно ускорить работу модуля?

Михаил
06.01.2014, 19:07

admin/structure/parser_jobs/results/* - думаю, следует сделать постраничный вывод по 100 резалтов на страницу - уже при нескольких тысячах браузер начинает страдать.

Михаил
09.01.2014, 03:47

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

Михаил
11.01.2014, 16:38

Парсер периодически прекращает работу. Например, при оставшихся 30 000 в очереди парсер может прервать работу на 3%, а может на 5%.
Это происходит из-за не получения ответа от сервера с которого парсят? Почему парсер прекрабщает работу?

Гость
12.03.2014, 14:14

Тип сущности: материал - не появляется поле созданное модулем YouTube Field
можно ли это исправить?

Гость
02.05.2014, 15:44

Здраствуйте xandeadx, скажите ваш модуль позволяет мигрировать любые элементы с других веб-страниц в Друпал, интенгрируя их значения в поля, я правильно понимаю?

модуль позволяет из html страниц создавать сущности

Гость
02.05.2014, 20:02

Простите за навязчивость, но мне не совсем понятно что такое сущности?
То есть если на HTML страничке есть картинки и их много, значит с помощью данного модуля можно мигрировать данные картинки в поле(field IMAGE) типа контента, а также различные файлы, то есть процесс реализации миграции схож с модулем Feeds ?
сущности это fields Drupal?

Модуль Parser предназначен для парсинга любых html страниц в сущности (ноды, термины, юзеры и т.д.)

Гость
02.05.2014, 20:52

Спасибо, будем пробовать, если это так как вы говорите, значит это очень мощный модуль и раз html можно распарсить, asp странички также

@xandeadx привет и большой сенкс за модуль
как справится с бедой?
цель class="t11_2" (body), "живьём" выглядит так:
Управляющий Красноярским региональным отделением Фонда Леонид Адашкин провел выездное совещание с директорами филиалов по вопросам оказания услуг по оздоровлению граждан льготной категории на примере курорта «Озеро Учум».
при проверке и парсинге получается так:
Управляющий Красноярским региональным отделением Фонда Леонид Адашкин провел
выездное совещание с директорами филиалов по вопросам оказания услуг по
оздоровлению граждан льготной категории на примере курорта «Озеро Учум».

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

$content = $doc->find('.t11_2')->html();
$content = explode("<br>",$content);
return array(
  'value' => $content[0],
  'format' => 'full_html',
);

толку - ноль

))) решить беду, выглядит некрасиво, вручную перелопачивать нереально
может непонятно объяснил, сейчас скрины выложу

текстовый фильтр расставляет <br /> на каждый конец строки. стандартное поведение друпала

xandeadx, слов нет ))
спасибо большое!
$content =str_replace("\n","",$content);

Гость
09.09.2014, 16:15

Уважаемый 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&amp;op=finished">страницу ошибки</a>";} [:db_condition_placeholder_0] => 42 ) in _batch_shutdown() (line 537 of /var/www/--/data/www/----/includes/batch.inc).

Сергей
07.10.2014, 10:58

Добрый день. А где в модуле исправляется текст: "Контент спарсен со страницы..."?
А так же где можно убрать перенаправление на anonim.to/? в ссылке?

в настройках модуля admin/structure/parser_jobs/settings

Сергей
09.10.2014, 22:39

в настройках модуля admin/structure/parser_jobs/settings

Это я нашел. Иногда можно отключить, но сейчас интересует как можно изменить саму надпись "Контент спарсен со страницы" допустим на "ссылка на источник", и убрать из ссылки перенаправление, если первоисточник требует обратной ссылки?

добавьте поле, сохраняйте в нём адрес страницы, темизируйте по желанию

Andry Sobolev
13.10.2014, 16:08

xandeadx, день добрый!
Отличный модуль. Столкнулся с проблемой при парсинге youtube видео с других сайтов, так чтобы в Drupal складывало url видео для отображения через Youtube field https://www.drupal.org/project/youtube
Под строкой кода написано:
PHP код, который должен вернуть массив значений поля (array(значение1, значение2, ...)). Каждое значение должно быть в формате:

array(
  'input' => $input, // YouTube URL (text, optional)
  'video_id' => $video_id, // YouTube Video ID (text, optional)
)

Код для парсинга

$html = $doc->find('div#tab-4')->html();
$html = str_replace("No data found", "", $html);
preg_match_all('/src=\"\/\/www.youtube.com\/embed\/([a-z0-9\._]+)/isu', $html, $matches);
$youtube = array();
if(isset($matches[1])){
  foreach ($matches[1] as $key => $value) {
    $youtube[] = array(
       'input' =>"http://www.youtube.com/watch?v=".$value, 
       'video_id' => $value);
  }
return $youtube;
}

При тесте выводит:
https://yadi.sk/i/S1hVBeLObyHAc
При парсинге значения не сохраняются, ошибка в журнале:
https://yadi.sk/i/xQEO46pqbyHPy
Просьба о помощи, что может быть не так?

скачайте последнюю версию парсера

Алексей
01.12.2014, 09:11

Модуль может с одной скормленной ему страницы создать несколько нод одного типа? Если нет, то может быть у вас есть совет?)

Алексей
01.12.2014, 09:27

Увидел галочку "Режим списка" похоже это оно. Есть какие-то тонкости при установке этой галки?

Александр
26.02.2015, 17:04

'summary' => $doc->find('div.ss11')->html(),
'format' => 'NEWS',

Стоит в body так
в формате NEWS все отлично настроено, но при переносе все теги отображаются как текс, если зайти в это новость и нажать сохранить еще раз то все ок.

Где ошибаюсь?

Александр
26.02.2015, 17:07

Показывать любой HTML как обычный текст - убрана
Пропускать указанные ниже HTML-теги - стоит и указаны все нужные теги

Александр
05.03.2015, 06:20
Возникла AJAX HTTP ошибка. Полученный код HTTP: 500 Следует отладочная информация. Путь: /batch?id=213&op=do Текст Состояния: Service unavailable (with message) Текст Ответа: PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'public://1403079345_1402886999-5369.jpg' for key 'uri': INSERT INTO {file_managed} (uid, filename, uri, filemime, filesize, timestamp) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5); Array ( [:db_insert_placeholder_0] => 1 [:db_insert_placeholder_1] => 1403079345_1402886999-5369.jpg [:db_insert_placeholder_2] => public://1403079345_1402886999-5369.jpg [:db_insert_placeholder_3] => application/octet-stream [:db_insert_placeholder_4] => 115308 [:db_insert_placeholder_5] => 1425525169 ) 

Собственно вот ошибка, я так понимаю он не может вставить в бд потому что данная картинка уже есть?

Как побороть?

Александр
05.03.2015, 06:50

Сори вопрос решен!
Сам вызвал ошибку, появились не удаленные записи в базе.
Удалил все норм.

Александр
05.03.2015, 09:08

Эх все такие нет, видать не все так просто. Опять та же ошибка с другой картинкой.
Объясните пожалуйста, что за ошибка, это дубликат именно картинки или поля?
Как такое могло возникнуть и как победить?

Андрей
19.03.2015, 08:36

Добрый день!
Отличный модуль, спасибо вам за работу.
При переносе страниц создаю и термины для них.

$terms = array();
foreach($doc->find('#breadcrumbs')->find('a') as $a) {
  $terms[] = pq($a)->html();
}
$terms = parser_create_terms_hierarchy($terms, 'catalog');
end($terms);
return array(key($terms));

В случае когда каталог двухуровневый работает верно, а когда 3 уровня в каталоге, создаются дубли 3-его уровня. В чем может быть проблема?

Андрей
22.03.2015, 13:59

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

$breadcrumbs = array();
foreach($doc->find('#breadcrumbs')->find('a') as $a) {
  $breadcrumb = pq($a)->text();
  $breadcrumb = str_replace("\r\n", '', $breadcrumb);
  $breadcrumb = str_replace("\n", '', $breadcrumb);
  $breadcrumbs[] = $breadcrumb;
}
$terms = parser_create_terms_hierarchy($breadcrumbs, 'catalog');

Надо бы в parser_create_terms_hierarchy() добавить удаление переносов строки.

Евгений
05.06.2015, 12:25

Очень классный модуль. Аналога нормального пока не нашел. Подскажите пожалуйста: парсит он супер, но вот когда пытаюсь вытащить изображение, с сайта-донора, постоянная ошибка: "Возникла 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');,
);
Проверка возвращает правильный результат. В чем может быть дело?

Евгений
05.06.2015, 12:53

Спасибо. Но это я случайно тут написал точку с запятой. Дело в том что в настройках поля "количество" изображений, стоит "Неограничено." Когда ставлю в настройках "одно" изображение, то все работает. Не подскажете, как использовать поле с несколькими изображениями?

как сказано в описании к полю - надо возвращать массив значений, а не значение

Евгений
05.06.2015, 13:12

Спасибо, пять раз смотрел и не заметил... Бывает. Успехов в разработке.

Гость
16.06.2015, 20:45

Как сохранить фотографии и передать переменную в Entity wrapper? спасибо.

Гость
18.06.2015, 12:26

Добрый день!
Не знаю на сколько важно, но лучше отписаться.
Мы заказываем сервер и его обслуживание у Хетзнера. С некоторой периодичностью они проверяют все файлы сайтов на наличие распространенных дыр. Сегодня поругались на Ваш модуль:
./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

Александр
16.08.2015, 22:17

Привет xandeadx!
Подскажи у меня все работало, а сейчас какая-то беда с датой. Я так думаю это из за секунд.

$lolo= $doc->find('div.newsdate_l')->text();
И получаю
09.03.2015 22:17
Потом добавляю таймзону

$loloshka = ' +1000';
$lolo = $lolo.$loloshka;

И получаю
09.03.2015 22:17 +1000
Потом первожу в понятный вид для drupal

$date = new DateTime("$lolo");
return  $date->format("U");

И получаю
1425903420

И до этого все работало, а сейчас дата в новости такая 09.03.2015 00:00
Тоесть он не понимает время, и указывает 00:00
Это может быть из за секунд?
Если да то как указать ему секунды, на сайте исходнике их нет :(

Александр
18.08.2015, 14:03

Эх жаль ответа нет, так и не разобрался я.

Евгений
25.08.2015, 13:25

Здрасте. Я еще хотел узнать, как подружить парсинг с Cron-ом? То есть добавить в автозагрузку?

Роман
04.09.2015, 21:13

Здрасте. Замечательный продукт. Вопросс: Я настроил парсинг, кождое поле дает положительный результат при проверке, но почему то дальше первой страницы не заходит. Не создает ни одной сущьности. С чем это может быть связанно?

Привет!
Скажи, пожалуйста, если сделать rollback, почему могут подгружаться старые данные при повторной загрузке?
Как правильно "актуализировать" контент на двух сайтах? (если с одного удалили материал, на втором тоже убрать)

Спасибо!

все страницы сохраняются в кэше и в дальнейшем берутся из него

Это понятно, но смотри: тут всего два http://mart-igr.ru/catalog/item140 (это донар)
а после сканирования http://urfinjus.ru/catalog/575 - гораздо больше. При том я делал и rollback, и ставил для всех товаров status 0 перед импортом (в процессе импорта возвращал в 1).

По мне так он не должен отображать из кжша, если его нет на сайте? или я не понял чего-то?

если какая-то страница есть в кэше, то она берётся из него

Повторюсь.
Тут ситуация в том, что в этом разделе у донора всего две позиции, а на сайт закачиваются все. И те, которые были закачены раньше.
Т.е. парсер проверяет сначала кэш, а потом сайт-донар?

парсер ничего не проверяет, если страница есть в кэше то она берётся из него

Даже если ее уже нет на сайте-донаре? Мне кажется не совсем логично.
Тогда как сделать актуальную версию сайта донора? удалять кэш?

Гость
10.10.2015, 17:03

Из группы Вконтакта этим можно посты парсить?

Андрей
10.10.2015, 17:20

У ВКонтакте есть API, посты получать проще и удобней

А можно как-то спарсить запароленный сайт, да к томуже с капчей?

т.е. я готов ввести и пароль и капчу руками, но как научить задание их спрашивать?

Александр
29.10.2015, 13:40

Уточните, возможно ли вызывать задание через rules модуль и есть ли способ передать переменную в Стартовый URL.

Андрей
19.11.2015, 18:03

Всем привет, подскажите как запарсить картинку которая подгружается вовремя прокрутки?
Донор:
http://www.idealista.com/inmueble/29726262/

Картинку выдает парсер:

<img src="http://st1.idealista.com/static/common/img/icons/px.png" />

...и это

<img src="http://img2.idealista.com/thumbs,W,H,wi,e2QOq++zUcbn+/RVSTVyZat1V3ri3FtH1mi0Mzqq81IIKMQDsO8eGAjuuACdBV0OVaLMnt3SeF0kt8O3qFU4Zkhka2/psfom+8UtUtfStjVXAJjtrgu/AHvnPKZ9oEtLaCs3u0nPlX1cFSD6wLdDPAC2xW0LfAH0OvyByooEqmg1mc3Qgp9+rts0FRL+3jfC" />

А должен выдавать:
<img src="http://img2.idealista.com/thumbs?wi=850&amp;he=0&amp;en=e2QOq%2B%2BzUcbn%2B%2FRVSTVyZc6BNWlwC5wdWL4a68verM6lrS62OfBvxDW9gla65OfRVaLMnt3SeF0kt8O3qFU4Zkhka2%2Fpsfom%2B8UtUtfStjVXAJjtrgu%2FAHvnPKZ9oEtLaCs3u0nPlX1cFSD6wLdDPAC2xW0LfAH0OvyByooEqmg1mc3Qgp9%2Brts0FRL%2B3jfC&amp;ch=1161940880">

Делаю так:

$images = array();
foreach ($doc->find('#main-multimedia img') as $b) {
$images[] = pq($b)->attr('src');
}
return $images;

Как получить нормальный URL?

Андрей
19.11.2015, 18:06

http://img2.idealista.com/thumbs?wi=850&he=0&en=e2QOq%2B%2BzUcbn%2B%2FRVSTVyZat1V3ri3FtH1mi0Mzqq81IIKMQDsO8eGAjuuACdBV0OVaLMnt3SeF0kt8O3qFU4Zkhka2%2Fpsfom%2B8UtUtfStjVXAJjtrgu%2FAHvnPKZ9oEtLaCs3u0nPlX1cFSD6wLdDPAC2xW0LfAH0OvyByooEqmg1mc3Qgp9%2Brts0FRL%2B3jfC&ch=-533351751

Гость
04.03.2016, 18:24

Помогите спарсить дату.
На сайте дата выводится в виде 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
Возможно ли это осуществить?

Включаете режим списка, возвращаете список, парсите как обычный сайт.

Есть какая-нибудь инструкция с примерами? Не могу список получить

Добавить комментарий