Примеры наиболее известных библиотек для парсинга сайтов.
Определения
Парсинг – это процесс линейное сопоставление последовательности слов по правилам языка. Понятие «язык» рассматривается в самом широком контексте. Это может быть человеческий язык, используемый для коммуникации людей. А может и формализированный язык, в частности, любой язык программирования, а также разметки.
Парсинг сайтов – последовательный синтаксический анализ информации, размещённой на интернет-страницах. По сути – это автоматическое извлечение необходимой информации с сайта.
Для чего нужен парсинг?
Собственно парсинг нужен для извлечения корректной информации из страниц сайтов. За практическими примерами далеко ходить не надо:
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/