Простой скриншот и анализ в .NET - PullRequest
2 голосов
/ 29 ноября 2009

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 29 ноября 2009

Ну, я бы пошел так, как вы описываете.

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

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

Я в процессе и собираюсь расширить этот ответ как можно скорее.

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

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

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

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

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

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

...