2009-11-29 2 views
2

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

  1. Простая очистка экрана на основе URL-адреса, указывающего на страницу, где существует сегмент, который мне нужен. Самый простой способ сделать это просто для использования объекта WebClient и получения полного HTML-кода?

  2. После того, как HTML потянут и сохранен, проанализируйте его с помощью какого-либо скрипта и вытащите только сегмент и значения, которые мне нужны (например, стоимость цены продукта). Моя проблема заключается в том, что этот сценарий каким-то образом должен быть уникальным для каждого сайта, который я вытягиваю, он должен уметь обрабатывать действительно уродливый HTML (поэтому я не думаю, что XSLT будет делать ...), и мне нужно иметь возможность его изменить на лету, поскольку целевые сайты обновляют и изменяют. Я, наконец, принять конкретные значения и записать их в базу данных, чтобы сделать их доступными для поиска

Не могли бы вы дать мне несколько советов о том, как архитектору лучший способ? Не могли бы вы поступить иначе, чем описано выше?

ответ

1
  1. Да, WebClient может хорошо работать для этого. Элемент управления WebBrowser также будет работать в зависимости от ваших требований. Если вы собираетесь загрузить документ в HtmlDocument (IE HTML DOM), то может быть проще использовать элемент управления веб-браузера.

  2. Объект HtmlDocument, который теперь встроен в .NET, может использоваться для анализа HTML. Он предназначен для использования с элементом управления WebBrowser, но вы также можете использовать реализацию из dll mshtml. Я hav enot использовал HtmlAgilityPack, но я слышал, что он может выполнять аналогичную работу.

Объекты HTML DOM, как правило, обрабатывают и исправляют самый уродливый HTML-код, который вы бросаете на них. Кроме того, чтобы получить более удобный способ анализа html, document.GetElementsByTag, чтобы получить коллекцию объектов тегов, например.

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

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

Следует упомянуть, что вы можете добавить шаг очистки к своему подходу. Гибкий способ очистки HTML, поскольку он входит в процесс, был неоценим в коде, над которым я работал в прошлом. Возможно, внедрение типа pipeline было бы хорошим подходом, если вы считаете, что домен достаточно сложный, чтобы гарантировать его. Но даже метод, который запускает некоторые регулярные выражения над HTML, прежде чем разбирать его, будет ценным. Избавляясь от изображений, заменяя некоторые неправильно используемые теги с более приятным HTML и т. Д. Количество действительно изворотливого HTML, которое там, продолжает меня удивлять ...

+0

Как идея трубопровода! Спасибо – Riri

+0

http://www.openpipeline.org/ имеет открытый исходный код, предназначенный для обработки документов для поисковых систем. Я еще не посмотрел на него, но это может дать вам некоторые идеи. Другая вещь, котор нужно держать в разуме с этим будет threading и масштабируемостью. По мере роста вашей коллекции сайтов вы захотите обработать несколько документов одновременно. Windows Workflow Foundation (http://msdn.microsoft.com/en-us/netframework/aa663328.aspx) может также сформировать ваш «конвейер». – Glenn

3

Хорошо, я поеду так, как вы описали.

1. Сколько данных он собирается обрабатывать? Получение полного HTML-кода через WebClient/HttpWebRequest не должно быть проблемой.

2. Я хотел бы пойти на HtmlAgilityPack для HTML разбора. Он очень прощает и может справиться с уродливой разметкой. Поскольку HtmlAgilityPack поддерживает XPath, довольно просто иметь определенные выборки xpath для отдельных сайтов.

Я нахожусь в бегах и собираюсь расширить этот ответ как можно скорее.

+0

Мы говорим очень важные данные. Я видел HtmlAgilityPack, это здорово! Thnaks. – Riri

Смежные вопросы