[Parsing] Нужен совет по алгоритмам
От: skodnik  
Дата: 03.03.11 11:11
Оценка:
В очередной раз попросили написать парсер для очередного сайта. Работа скучная и нудная если решать "в лоб". Задумался написать нечто и назвать его фреймворком для подобного рода задач.
Но ни как не могу сформулировать "язык" который бы помогал решать задачу.
Первая моя попытка была — это набор атрибутов для классов и пропертей классов, а в конструктор классу передавать url. Но если данные для текущей сущности надо было вытягивать через несколько дополнительных загрузок страниц (загрузить url, распарсить в нем другие url и т.д.) то классы имели глубокую вложенность. Что неудобно. В результате на каждый класс приходилось писать прокси-класс (или адаптер, или мост) для сериализации в XML.
Посему два вопроса:
1. Есть ли какието библиотеки решающие подобного рода задачи. Конвертеры типа html->xml это не то. Потому как не решают проблем с вложеностями.
2. Как бы описать универсально процесс парсинга? Вопрос не тривиальный. Никак в общем виде не получается чтото вменяемое придумать.
Если кто с подобным сталкивался — буду благодарен за любую информацию.

03.03.11 21:16: Перенесено модератором из '.NET' — TK
Re: [Parsing] Нужен совет по алгоритмам
От: _Raz_  
Дата: 03.03.11 12:00
Оценка:
Здравствуйте, skodnik, Вы писали:

S>1. Есть ли какието библиотеки решающие подобного рода задачи. Конвертеры типа html->xml это не то. Потому как не решают проблем с вложеностями.

http://arachnode.net/
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Re: [Parsing] Нужен совет по алгоритмам
От: 0K Ниоткуда  
Дата: 03.03.11 16:44
Оценка:
Здравствуйте, skodnik, Вы писали:

S>В очередной раз попросили написать парсер для очередного сайта. Работа скучная и нудная если решать "в лоб". Задумался написать нечто и назвать его фреймворком для подобного рода задач.

S>Но ни как не могу сформулировать "язык" который бы помогал решать задачу.

Мне, к сожалению, так-же приходится подобной фигней страдать. Что же поделать -- судьба такая. Сайты парсить.

По этому я накатал себе библиотечку xml2http, в которой все делается декларативным методом. В файле конфигурации (XML-файл) прописываем шаги и параметры запроса. У каждого шага есть Url и параметры. Параметры могут быть либо переменными, либо константами. Переменные нужно задать в коде (можно динамически). Так-же предусмотрена возможность копирования параметров какой-либо формы.

Теперь когда мне нужно распарсить сайт -- я не пишу НИ ОДНОЙ СТРОЧКИ КОДА. НИ ОДНОЙ. Просто беру Fiddler, прохожусь по сайту. Вписываю параметры запроса в свой файл конфигурации XML -- и вауля! Все готово. Думаю еще автоматизировать процесс заполнения файла конфигурации по логам Fiddler (хотя лучше свою тулузу накатать).

В коде на каждом шаге я могу добавить нужные параметры (к примеру, одноразовый пароль, который приходит через СМС или который берется из таблицы паролей). Каждый шаг имеет название.
Re: [Parsing] Нужен совет по алгоритмам
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 04.03.11 07:24
Оценка:
Здравствуйте, skodnik, Вы писали:

S>В очередной раз попросили написать парсер для очередного сайта. Работа скучная и нудная если решать "в лоб". Задумался написать нечто и назвать его фреймворком для подобного рода задач.


У нас на промышленную основу поставлен разбор сайтов. По сути там все регвырами делается, которые вводятся специально обученным персоналам. За сам сбор информации отвечает другой механизм.
http://jvmmemory.com — простой способ настройки JVM
Re[2]: [Parsing] Нужен совет по алгоритмам
От: skodnik  
Дата: 04.03.11 10:42
Оценка:
Здравствуйте, LeonidV, Вы писали:

LV>Здравствуйте, skodnik, Вы писали:


S>>В очередной раз попросили написать парсер для очередного сайта. Работа скучная и нудная если решать "в лоб". Задумался написать нечто и назвать его фреймворком для подобного рода задач.


LV>У нас на промышленную основу поставлен разбор сайтов. По сути там все регвырами делается, которые вводятся специально обученным персоналам. За сам сбор информации отвечает другой механизм.


Разумеется регвырами, хотя недавно меня тут засмеяли что HTML регвырами обрабатываю, но таки регвырами и никак.
Сейчас задумался над "механизмом". Проект не срочный, даже вообще не обязательный, я решил творчески подойти.
Re[3]: [Parsing] Нужен совет по алгоритмам
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 04.03.11 12:25
Оценка:
S>Разумеется регвырами, хотя недавно меня тут засмеяли что HTML регвырами обрабатываю, но таки регвырами и никак.
S>Сейчас задумался над "механизмом". Проект не срочный, даже вообще не обязательный, я решил творчески подойти.
А в чем сложность? У нас классы по разбору меньше 1000 срок кода должны занимать.
http://jvmmemory.com — простой способ настройки JVM
Re[4]: [Parsing] Нужен совет по алгоритмам
От: skodnik  
Дата: 04.03.11 16:33
Оценка:
Здравствуйте, LeonidV, Вы писали:

S>>Разумеется регвырами, хотя недавно меня тут засмеяли что HTML регвырами обрабатываю, но таки регвырами и никак.

S>>Сейчас задумался над "механизмом". Проект не срочный, даже вообще не обязательный, я решил творчески подойти.
LV>А в чем сложность? У нас классы по разбору меньше 1000 срок кода должны занимать.
Сложность заключается в том, как формализировать парсинг сайта.
К примеру есть сайт в нем можно распарсить 20 урлов на продукты. Надо взять каждый урл, загрузить, там распарсить урл на каменты к продукту. Зайти по этому урлу, распарсить урлы-страницы с каментами (страница 1, 2, и т.д.) Далее каждую страницу загрузить и распарсить каменты. И вот после всего этого нам надо id продукта и список каментов.
Как такой сценарий представить максимально обобщенно.
Re[5]: [Parsing] Нужен совет по алгоритмам
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 04.03.11 19:19
Оценка:
У нас с каждой страницы выдираются три сущности: заголовок, статья и дата. Формализовано так. По URL'у определяет набор регулярных выражений для каждой сущности. Для каждой сущности может быть несколько регвыров, как именно они обрабатываются уже не помню — либо поочередно соединяются, либо первый подошедший. Изначально было заложено гибко — какие именно сущности выдираются определяется данными в БД. Плюс некоторые регвыры помечаются как "Чистильщики" — они применяются к уже извлеченным данным и удаляют из них мусор.

Алгоритм такой:
На вход поступает URL+текст статьи;
По URL'у определяем подходящий набор регвыров;
Применяем регвыры к странице и получаем сущности;
Возвращаем найденные сущности.
http://jvmmemory.com — простой способ настройки JVM
Re[6]: [Parsing] Нужен совет по алгоритмам
От: skodnik  
Дата: 07.03.11 11:00
Оценка:
Здравствуйте, LeonidV, Вы писали:
LV>Алгоритм такой:
LV>На вход поступает URL+текст статьи;
LV>По URL'у определяем подходящий набор регвыров;
LV>Применяем регвыры к странице и получаем сущности;
LV>Возвращаем найденные сущности.
Ну вот то то и оно — что сильно упрощенная модель.
У меня атрибуты сущности могут храниться на странице которая доступна через несколько загрузок страниц.
Re[7]: [Parsing] Нужен совет по алгоритмам
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 07.03.11 15:40
Оценка:
Здравствуйте, skodnik, Вы писали:
S>У меня атрибуты сущности могут храниться на странице которая доступна через несколько загрузок страниц.
Вам интересен был алгоритм разбора или алгоритм сборки? Или вы что-то другое имеете ввиду?
http://jvmmemory.com — простой способ настройки JVM
Re[8]: [Parsing] Нужен совет по алгоритмам
От: skodnik  
Дата: 07.03.11 16:01
Оценка:
Здравствуйте, LeonidV, Вы писали:

LV>Здравствуйте, skodnik, Вы писали:

S>>У меня атрибуты сущности могут храниться на странице которая доступна через несколько загрузок страниц.
LV>Вам интересен был алгоритм разбора или алгоритм сборки? Или вы что-то другое имеете ввиду?

Мне было интересно максимально общно описать алгоритмически задачу парсинга любого контента.
Как вариант, рассмотреть сбор информации о продукте в интернет-магазине.
У нас есть ссылка на перечень продуктов. Каждый продукт имеет свой URL, перейдя по которому можно извлечь информацию о продукте. Также на странице продукта могут быть еще ссылки на информацию — например "детальное описание" или "отзывы".
А задача — собрать нужную информацию о всех продуктах.
Хотелось бы чтобы при смене источника информации, например сегодня парсим этот сайт а завтра другой, не переделывать код, а декларативно в некоем XML задать Patterns'ы для регвыров и поля в выходном XML с данными. Хорошо если вся информация о продукте есть на одной странице. Но когда до нужной порции информации необходимо сделать несколько загрузок страниц — я затрудняюсь с формальным описанием задачи.

Впрочем, сейчас меня несколько озарило, и я активно провожу исследования в данной области )))
Re[9]: [Parsing] Нужен совет по алгоритмам
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 07.03.11 18:30
Оценка:
Здравствуйте, skodnik, Вы писали:

S>Хорошо если вся информация о продукте есть на одной странице. Но когда до нужной порции информации необходимо сделать несколько загрузок страниц — я затрудняюсь с формальным описанием задачи.

Не вижу сложности. Так или иначе на странице должен быть ID товара, к которому относится информация. Считываем этот ID, потом всю информацию по ID сопоставляем одному товару.
http://jvmmemory.com — простой способ настройки JVM
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.