Последние 2 недели было несколько заказов на написание парсеров на PHP. И я за них бралась, в основном за чисто символическую плату, чтобы повариться в PHP-шной кухне, попробовать разные способы парсинга и, заодним, подучиться не на чистом энтузиазме. ;)
Хочу рассказать о своих впечатлениях.
Парсер на PHP — это удобно и менее време- и ресурсозатратно для разработчика. Естественно, если скрипт предназначен только для скачивания какой-либо базы и последующей проверки обновлений. Ни тебе особых интерфейсов, ни тебе всяких ненужных классов: скачиваешь страницу, парсишь, в базу, по кругу. Для многофункционального ПО по-прежнему использую Delphi.
Скрипты удобны для удаленного запуска по расписанию (не забудьте установить set_time_limit(), чтобы скрипт не останавливался, не доработав до конца).
Когда-то я спрашивала читателей блога, чем удобнее парсить, регулярками или через библиотеку DOM. Тогда прозвучал только один конкретный ответ. Что ж, зато у меня был повод самостоятельно потестировать разные инструменты. Что могу сказать по поводу того, каким способом удобнее парсить html? Чаще всего я все-таки использовала регулярные выражения, потому что привыкла, наверное. Пару раз использовала комбинированный метод: сначала большой табличный кусок "добывала" регуляркой, а потом уже эти хорошо структурированные данные разбирала через DOM.
Чем неудобна библиотека DOM? Тем, что она все-таки не очень хорошо разбирает данные, если они невалидны. Если у вас включено отображение ошибок (php_value display_errors 1), вы можете легко убедиться в этом, взяв произвольный ресурс и попробовав загрузить его страницу в dom-объект
$dom->loadHTML($html);
Выдается список ошибок: то неизвестный тэг, то точка с запятой лишняя, то еще какая-нибудь фигня.
Так что мой выбор все-таки в пользу регулярок, а dom я оставляю для парсинга XML.
Чтобы быть в курсе обновлений блога, можно подписаться на RSS.
Добрый день
ОтветитьУдалитьА каким образом в Delphi решается вопрос "просмотр вперед" ?
Есть у меня выражение
(?=<span>)(.*?)(?=<\/span>)
Результат такой:
<SPAN>Crespi Estates
Если делаю так:
(?<=<span>)(.*?)(?=<\/span>)
Возникает ошибка, а в тестере все нормально. =(
simplehtmldom - отличный парсер!
ОтветитьУдалитьЕсли что то и парсюто только им.
Кончено не только им, но и регулярками. Но в начале я полюбому выдеркиваю кусок текста/кода из html спомощью simplehtmldom, а потом уже этот кусок отдаю регуляркам так получается занчительно быстрей!
> Пару раз использовала комбинированный метод:
ОтветитьУдалить> сначала большой табличный кусок "добывала" регуляркой,
> а потом уже эти хорошо структурированные данные
> разбирала через DOM.
Я немного не так комбинирую.
Есть такая функция: strip_tags ( string str [, string allowable_tags] )
Так вот все забывают про allowable_tags
А зря. Ведь вы можете оставить только нужные вам для парсинга теги. Затем добавить в начало и конец html и body, чтобы получился валидный html. А дильше уже при помощи DOM разбирать.
Регулярки хороши, но мне они кажутся медленными.
> Скрипты удобны для удаленного запуска по расписанию
ОтветитьУдалить> (не забудьте установить set_time_limit(),
> чтобы скрипт не останавливался,
> не доработав до конца).
На шаред-хостингах не всегда есть такая возможность. Скорее ее нет, как правило.
Тут я такую хитрость советую -- делите скрипт на три части: извлекатель ссылок, скачиватель, парсер.
Извлекатель просто анализирует начальный html и складывает ссылки на закачку в файл.
Затем по крону запускаете wget, который скачивает все страницы в папку.
А дальше уже скачанные файлы распарсиваете и снова по кругу.
Таким образом можно дикие объемы прогнать.