Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Я недавно кое-что сделал, и вот мои впечатления.

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

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

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


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

Ответ 2

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

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

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

Нижняя строка, grepping конкретных элементов с regexp будет мрачной. Лучшим подходом является построение DOM-модели страницы и поиск "привязок" к символьным данным в тегах.

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

Ответ 3

Вы не говорите, какой язык вы используете. В области 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"

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

Пример из hpricot wiki:

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

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

Ответ 7

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

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

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

EDIT: И если вы используете PHP, я бы рекомендовал SimpleHTMLDOM

Ответ 8

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

  • Beatiful Soup
  • mechanize: аналогично perl WWW: Mechanize. Дает вам браузер, как объект, для входа в веб-страницы.
  • lxml: привязка python к libwww
  • scrapemark: использует шаблоны для очистки фрагментов страниц.
  • pyquery: позволяет создавать запросы jQuery в документах xml/xhtml.
  • scrapy: скремблирование на высоком уровне и веб-обходной рамки для написания пауков для сканирования и анализа веб-страниц.

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

Как говорили другие, вы можете использовать парсер HTML, который создает представление DOM и запрашивает его с помощью XPath/XQuery. Я нашел здесь очень интересную статью: теория и практика Java: скрипинг экрана с помощью XQuery - http://www.ibm.com/developerworks/xml/library/j-jtp03225.html

Ответ 12

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

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