Примеры наиболее известных библиотек для парсинга сайтов.

Определения

Парсинг – это процесс линейное сопоставление последовательности слов по правилам языка. Понятие «язык» рассматривается в самом широком контексте. Это может быть человеческий язык, используемый для коммуникации людей. А может и формализированный язык, в частности, любой язык программирования, а также разметки.

Парсинг сайтов – последовательный синтаксический анализ информации, размещённой на интернет-страницах. По сути – это автоматическое извлечение необходимой информации с сайта.

Для чего нужен парсинг?

Собственно парсинг нужен для извлечения корректной информации из страниц сайтов. За практическими примерами далеко ходить не надо:

1. Любая поисковая система парсит сайты. Так, например, ключевое слово в заголовке «ценится» больше, чем в обычном параграфе. Даже существует целое направление, по тому, как организовать информацию на сайте, чтобы он «поднялся в поиске»: SEO оптимизация.

2. Получение текущих курсов валют со специализированных сайтов.

3. На сайте УлГТУ (http://www.ulstu.ru/) почти всегда есть текущее официальное расписание занятий для всех групп всех курсов УлГТУ. Но есть несколько «но»: не всегда есть доступ в интернет, может случится так, что в самый ответственный момент сайт окажется недоступен. Поэтому некоторое время назад было создано приложение «Расписание занятий УлГТУ». Оно позволяет получать с сайта и хранить offline информацию о занятиях в университете.

4. Ну и, разумеется, все браузеры.

Почему именно парсинг?

Разумеется, извлекать информацию можно и без парсинга: вручную. Но есть несколько обстоятельств, которые будут склонять к парсингу (автоматическом способу):

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

2. Частое обновление. Обслуживание огромного потока динамично меняющейся информации не в силах обеспечить один человек или даже слаженная команда операторов. Порой информация изменяется ежеминутно и в ручном режиме обновлять её вряд ли целесообразно.

В таких ситуация программа-парсер имеет огромное преимущество перед человеком, так как:

1. быстро обойдёт тысячи веб-страниц;

2. аккуратно отделит техническую информацию от «человеческой»;

3. безошибочно отберёт нужное и отбросит лишнее;

4. эффективно упакует конечные данные в необходимом виде.

Механизм работы

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

Можно по-разному получать необходимую информацию из html-страниц:

Банальный поиск подстрок. Так, например, можно получить все гиперссылки с веб-страницы (началом будет: href=”, между ними гиперссылка, а концом:”,)

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

Основной предыдущих двух методов – то, что они рассматривают html-страницы, как строки. А язык html-разметки реализует DOM-модель, что позволяет html-страницы, как дерево. Поэтому третий и самый лучший способ – парсинг (извлечение информации с учетом синтаксиса и DOM-модели).

Преимущества DOM-модели

Допустим, у нас есть html-документ и между открывающим и закрывающем тегом body есть что-то вроде этого:

<div class=”CattleCurrencyBox”>

<div class=”CattleCurrency” name=”usd”>

<div name=”16.06.2016”>значение</div>

<div name=”15.06.2016”>значение</div>

<div name=”14.06.2016”>значение</div>

</div>

<div class=”CattleCurrency” name=”eur”>

<div name=”16.06.2016”>значение</div>

<div name=”15.06.2016”>значение</div>

<div name=”14.06.2016”>значение</div>

</div>

</div>

Очевидно, что в данном случае поиск подстрок не поможет, так как существует несколько типовых элементов, которые тем не менее относятся к разным группам информации. Будет гораздо проще, если представить теги, как узлы графа, а сам html-код, как граф. Тогда будет достаточно найти узел с классом CattleCurrencyBox, получить все его дочерние элементы (CattleCurrency) и уже с учетом атрибута name составить таблицу, где строками будут элементы с классом CattleCurrency.

Единственный нюанс – это необходимость преобразовать обычную html-страницу в структуру, поддерживающую DOM-модель (граф). К счастью, нет необходимости писать код для этой задачи: для этого и многого другого существует множество библиотек практически на каждом языке программирования, который обеспечивает работу с HTTP протоколом.

Примеры наиболее известных библиотек для парсинга сайтов.

На Java: библиотека Jsoup - предназначена для разбора html-страниц (парсинг), позволяет извлечь необходимые данные, используя DOM, CSS и методы в стиле jQuery.

Библиотека поддерживает спецификации HTML5 и позволяет с высокой скоростью парсить страницы, как это делают современные браузеры.

Библиотеке может получить html-страницу по URL, из файла или как строку.

Основные классы:

Document (можно сравнить с графом – html-страница). Обладает множеством полезных методов: getElementsByClass, getElementsByTag, getElementsByName, getElementById, getElementsByAttributeValue, которые позволяют получать дочерние элементы, удовлетворяющие каким-либо условиям.

Element (можно сравнить с элементом графа-тег). К выше написанному можно добавить весьма полезный метод attr, который получает значение конкретного атрибута тега.

На С#: Html Agility Pack – библиотека для разбора html-страниц. По своему механизму практически идентична Jsoup. Только вместо Document - HtmlWeb, вместо Element – HtmlNode, атрибут получается не в виде строки, а специальным классом HtmlAttribute, а для хранения списков элементов используется специальный класс HtmlNodeCollection . А базируется на той-же идее: получение списка дочерних элементов, удоволетворяющих каким-либо условиям.

На PHP: PHP Simple HTML DOM Parser – простая библиотека для парсинга, при помощи которого выполнять поиск нужных элементов на html-странице гораздо легче чем с другими подобными библиотеками, но, как часто бывает, в погоне за простотой его использования , он проигрывает в скорости. Зато она способна находить элементы соответствующие нескольким условиям (запросам), для этого существует функция find, её пример:

$html->find(‘div. CattleCurrency div') – найдет все элементы div, являющиеся дочерними элемента div класса CattleCurrency.

Список используемой литературы:

1. Всё о парсинге // http://tceburashka.com/

2. Синтаксический анализ // https://ru.wikipedia.org/wiki/Синтаксический_анализ

3. Официальный сайт библиотеки Jsoup // https://jsoup.org/

4. Html Agility Pack - удобный .NET парсер HTML // https://habrahabr.ru/post/112325/

5. Парсинг сайтов с помощью PHP Simple HTML DOM Parser // https://web2033.com/parsing-php-simple-html-dom/

Наши рекомендации