“Умный” способ анализа и использования данных веб-сайта?

StackOverflow https://stackoverflow.com/questions/1223458

Вопрос

Как разумно анализировать данные, возвращаемые результатами поиска на странице?

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

RSS - действительно замечательный вариант, но на многих сайтах нет поиска на основе XML / JSON.

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

Это было полезно?

Решение

Я недавно проделал кое-что из этого, и вот мой опыт.

Существует три основных подхода:

  1. Регулярные выражения.
    • Самый гибкий, простой в использовании со слабо структурированной информацией и меняющимися форматами.
    • Сложнее выполнить структурный анализ / анализ тегов, но проще выполнить сопоставление текста.
    • Встроенная проверка форматирования данных.
    • Поддерживать сложнее, чем другие, потому что вам нужно написать регулярное выражение для каждого шаблона, который вы хотите использовать для извлечения / преобразования документа
    • Обычно медленнее, чем 2 и 3.
    • Хорошо работает для списков элементов аналогичного формата
    • Вам помогут хороший инструмент для разработки / тестирования регулярных выражений и несколько примеров страниц.У меня есть что сказать хорошего о RegexBuddy здесь.Попробуйте их демо-версию.
    • В этом я добился наибольшего успеха.Гибкость позволяет вам работать с неприятным, грубым, нестандартным HTML-кодом.
  2. Преобразуйте HTML в XHTML и используйте инструменты извлечения XML. Очистите HTML, преобразуйте его в легальный XHTML и используйте XPath / XQuery / X-whatever для запроса его как XML-данных.
    • Инструменты:TagSoup, HTMLTidy и т. Д
    • Качество преобразования HTML в XHML очень важно и сильно варьируется.
    • Лучшее решение, если нужные вам данные структурированы с помощью HTML-макета и тегов (данные в HTML-таблицах, списках, группах DIV / SPAN и т.д.)
    • Наиболее подходит для получения ссылочных структур, вложенных таблиц, изображений, списков и так далее
    • Должно быть быстрее, чем вариант 1, но медленнее, чем вариант 3.
    • Работает хорошо, если форматирование содержимого изменяется / является переменной величиной, но структура / макет документа - нет.
    • Если данные не структурированы с помощью HTML-тегов, у вас проблемы.
    • Может использоваться с вариантом 1.
  3. Генератор синтаксических анализаторов (ANTLR и т.д.) -- создайте грамматику для синтаксического анализа страницы.
    • Я не пробовал это, потому что это не подходило для моих (грязных) страниц
    • Наиболее подходит, если структура HTML является высокоструктурированной, очень постоянной, регулярной и никогда не меняется.
    • Используйте это, если в документе есть простые для описания шаблоны, но они не содержат HTML-тегов и предполагают рекурсию или сложное поведение
    • Не требует ввода XHTML
    • САМАЯ ВЫСОКАЯ пропускная способность, как правило
    • Большая кривая обучения, но более простая в обслуживании

Я повозился с сбор урожая из паутины для варианта 2, но я нахожу их синтаксис несколько странным.Смесь XML и какого-то псевдо-Java скриптового языка.Если вам нравится Java и нравится извлечение данных в стиле XML (XPath, XQuery), возможно, это то, что вам нужно.


Редактировать:если вы используете регулярные выражения, убедитесь, что вы используете библиотеку с отложенными квантификаторами и группами захвата!В старых библиотеках регулярных выражений PHP они отсутствуют, и они незаменимы для сопоставления данных между тегами open / close в HTML.

Другие советы

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

Очевидно, что лучший способ - это вывод XML из движка с фиксированной разметкой, который вы можете анализировать и проверять. Я думаю, что HTML-библиотека для разбора с некоторым «в темноте» зондированием созданного дерева будет проще поддерживать, чем регулярные выражения.

Таким образом, вам просто нужно проверить < a href = " blah " class = " cache_link " > ... превращается в < a href = "blah" class = " cache_result " > ... или что-то подобное.

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

Или отправьте электронное письмо на сайт с указанием случая использования XML API ... вас могут нанять!

Вы не говорите, какой язык вы используете. В земле Java вы можете использовать TagSoup и XPath, чтобы минимизировать боль. Вот пример из этого блога (конечно, XPath может быть намного сложнее, как того требуют ваши требования):

URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);

Я бы порекомендовал экстернализировать выражения XPath, чтобы у вас была некоторая мера защиты в случае изменения сайта.

Вот пример XPath, который я определенно не использую для скрининга этого сайта. Ни за что, не я:

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3"

Вы не упомянули, какой технологический стек вы используете.Если вы разбираете HTML, я бы использовал библиотеку синтаксического анализа:

Существуют также веб-сервисы, которые делают именно то, что вы говорите, - коммерческие и бесплатные.Они очищают сайты и предлагают интерфейсы веб-сервисов.

И общий веб-сервис, который предлагает некоторую очистку экрана, - это Yahoo Pipes. предыдущий вопрос stackoverflow по этому поводу

Он не защищен от ошибок, но вы можете посмотреть на такой анализатор, как Beautiful Soup Он не сможет найти ту же самую информацию, если раскладка изменится, но это намного проще, чем писать сложные регулярные выражения. Обратите внимание, что это модуль Python.

К сожалению, «очистка» является наиболее распространенным решением, как вы сказали, пытаясь анализировать HTML с веб-сайтов. Вы можете обнаружить структурные изменения на странице и пометить предупреждение для исправления, поэтому изменение в их конце не приведет к ошибочным данным. До тех пор пока семантическая сеть не станет реальностью, это практически единственный способ гарантировать большой набор данных.

В качестве альтернативы вы можете использовать небольшие наборы данных, предоставляемые API. Yahoo очень усердно работает над предоставлением данных для поиска через API (см. YDN), я думаю, что Amazon API открывает много книжных данных и т. Д. И т. Д.

Надеюсь, это немного поможет!

РЕДАКТИРОВАТЬ: И если вы используете PHP, я бы порекомендовал SimpleHTMLDOM

Вы изучали использование библиотеки html-манипуляций? У Руби есть несколько очень хороших. например, hpricot

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

Пример из hpricot wiki:

 doc = Hpricot(open("qwantz.html"))
 (doc/'div img[@src^="http://www.qwantz.com/comics/"]')
   #=> Elements[...]

Я уверен, что вы можете найти библиотеку, которая делает подобные вещи в .NET или Python и т. д.

Попробуйте поискать в Google очистку экрана на том языке, который вы предпочитаете.Я знаю несколько вариантов для python, вы можете найти эквивалент для вашего предпочтительного языка:

  • Вкусный Суп
  • механизировать:аналогично perl WWW:Механизировать.Предоставляет вам объект, подобный браузеру, для взаимодействия с веб-страницами
  • lxml:привязка python к libwww
  • метка для вырезки:использует шаблоны для удаления фрагментов страниц
  • запрос:позволяет создавать запросы jQuery в документах xml / xhtml
  • шершавый:высокоуровневый фреймворк для сканирования веб-страниц, позволяющий создавать пауки для сканирования и синтаксического анализа веб-страниц.

В зависимости от веб-сайта для очистки вам может потребоваться использовать один или несколько из описанных выше подходов.

Если вы можете использовать что-то вроде Tag Soup , это было бы место для начала. Тогда вы могли бы воспринимать страницу как XML API, вроде того.

Он имеет реализацию на Java и C ++, может работать!

Петрушка на http://www.parselets.com выглядит довольно привлекательно.

Он позволяет вам определять «parslets», используя JSON, то, что вы определяете, что искать на странице, а затем анализирует эти данные для вас.

Как уже говорили другие, вы можете использовать анализатор HTML, который создает представление DOM и запрашивает его с помощью XPath / XQuery. Я нашел очень интересную статью здесь: теория и практика Java: очистка экрана с помощью XQuery -

Достаточно справедливо, я собираюсь использовать метод супа Tag, как рекомендовано.

В качестве дополнительного вопроса - как же эти большие сайты типа скребка делают это? Я видел поисковик по работе (например, на самом деле.com), который сканирует тысячи сайтов! Это тысячи регулярных выражений? Его почти невозможно ...

scroll top