parsing-basis

Что такое парсинг?

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

Парсинг сайтов – последовательный синтаксический анализ информации, размещённой на интернет-страницах. Что представляет из себя текст интернет-страниц? Иерархичный набор данных, структурированный с помощью человеческих и компьютерных языков. На человеческом языке предоставлена информация, знания, ради которых, собственно, люди и пользуются Интернетом. Компьютерные языки (html, JavaScript, css) определяют как информация выглядит на мониторе.

Зачем нужен парсинг?

Создавая веб-сайт, его владелец неизбежно сталкивается с проблемой – где брать контент? Оптимальный вариант: найти информацию там где её очень много – в Интернете. Но при этом приходится решать такие задачи:

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

Парсинг сайтов является эффективным решением для автоматизации сбора и изменения информации.

По сравнению с человеком, компьютерная программа-парсер:

  1. быстро обойдёт тысячи веб-страниц;
  2. аккуратно отделит техническую информацию от «человеческой»;
  3. безошибочно отберёт нужное и отбросит лишнее;
  4. эффективно упакует конечные данные в необходимом виде.

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

Какие языки программирования используются для написания парсеров?

Любые, на которых создаются программы для работы со Всемирной Паутиной. Веб-приложения для парсинга обычно пишут на C++, Delphi, Perl, Ruby, Python, PHP.

Какие инструменты понадобятся?

parsing-basis-2

Спешу успокоить. Написание парсеров не требует монументальных знаний о используемом языке программирования будь то PHP, Ruby или Python. Также необязательно иметь академические сведения о сопутствующих технологиях. Однако, кое-что придётся выучить хотя бы на «хорошо» . Перечислим веб-технологии, которые придётся знать каждому, кого интересует профессиональное создание синтаксических анализаторов:

  • Чтобы набросать первичный алгоритм работы будущего парсера, придётся проанализировать исходный код страниц сайта-донора. Само собой, без знаний (хотя бы на среднем уровне) HTML, CSS и JavaScript никак не обойтись.
  • Для более глубокого погружения в тему рекомендуется к изучению технология DOM, позволяющая с максимальным эффектом работать с иерархическим деревом веб-документа.
  • На самом важном и сложном этапе – написании анализатора – потребуется знания какого-либо из инструментов текстовой обработки. «Продвинутые» кодеры, возможно, для поиска нужных кусков текста воспользуются регулярными выражениями. Безусловно, «регулярки» пользуются заслуженной славой как мощного средства для решения многих нетривиальных задач. Однако этот способ не является самым лучшим, а зачастую и нежелательным. Во-первых, всё-таки, регулярные выражения не под силу многим джедаям от программирования. Уж очень специфичным мышлением нужно обладать, чтобы чувствовать себя в этой теме как рыба в воде. Во-вторых, html-код на большинстве сайтов не валиден, а часто и некорректен. Даже отъявленные спецы могут запутаться в метасимволах и квантификаторах, пытаясь предусмотреть все случаи жизни. Поэтому, оптимальным выходом будет не изобретение колеса, а использование готовых библиотек для парсинга, чуть ниже указаны самые популярные решения для каждого из языков. Впрочем, это вовсе не означает что регулярные выражения можно и вовсе не изучать. Зачастую именно с помощью них удобно решать многие проблемы, перед которыми пасуют всесторонне разработанные библиотеки для парсинга.
  • Для эффективной работы с иерархическими структурами данных – желательно владеть парадигмой объектно-ориентированного программирования. Семантическое дерево можно строить и с помощью многомерных ассоциативных массивов, но, этот способ понравится только мазохистам 🙂 ООП отлично поддерживается всеми языками рассматриваемыми на страницах этого сайта.
  • Финальная обработка результатов предполагает сохранение данных в структурированном виде. Обычно на выходе нужна база данных. Так что понадобятся крепкие знания SQL, и, как минимум, MySql и PostgreSQL.
  • Не обойтись без уверенного владения функциями для работы с файлами. Вполне возможно, данные придётся дописывать в CSV-файлы или конвертировать в электронные таблицы.
  • Сведения о XML и XPath могут понадобиться как на этапе синтаксического анализа (иногда приходится парсить не сайты, а RSS-потоки), так и на стадии конечного сохранения результатов (то есть, на основе сторонних сайтов иногда необходимо создать всё ту же ленту RSS).
  • Иногда спарсеные данные заливаются в новую базу данных посредством JSON. Данную javascript-технологию тоже необходимо освоить, благо ничего сложного она из себя не представляет.

Что понадобится «пэхапэшникам»

PHP_Logo

  • Для получения исходного кода html-страниц понадобится уверенное знание библиотеки cURL. Это компактный набор мощных функций, предназначенных для работы с серверами по различным протоколам. . Кроме этого, нелишним будет знание стандартной php-функции file_get_contents, позволяющей легко получать текстовое содержимое удалённых файлов.
  • Из специализированных библиотек на данный момент наибольшее распространение получили PHP Simple HTML DOM Parser, PHPQuery, Zend_DOM_Query, Nokogiri.

Этапы парсинга

parsing-basis-3

Парсинг html-страницы представляет из себя процесс, который можно разбить на три этапа:

  1. Получение исходного кода веб-страницы. В разных языках для этого предусмотрены различные способы, Например, в PHP чаще всего используют библиотеку cURL или же встроенную функцию file_get_contents.
  2. Извлечение из html-кода необходимых данных. Получив страницу, необходимо обработать её – отделить обычный текст от гипертекстовой разметки, выстроить иерархическое дерево элементов документа, корректно среагировать на невалидный код, вычленить со страницы именно ту информацию, ради которой и затевается весь сыр-бор. Можно, конечно же, использовать для этого регулярные выражения, однако есть более удобный путь – специализированные библиотеки.
  3. Фиксация результата. Благополучно обработав данные на странице, требуется их сохранить в необходимом виде для последующей обработки. Спарсенное обычно заносится в базу данных, однако есть и другие варианты. Иногда требуется записать в CSV-файл или строить иерархические JSON-структуры, иногда конвертировать в excel-таблицу, а может даже генерировать динамический rss-поток.

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

Обход всех нужных страниц сайта обеспечивается разными способами.

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

Во-вторых, при первичном анализе сайта зачастую возможно проследить логику формирования url для страниц. И затем, генерировать адреса в соответствии с выявленными закономерностями.

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

Разумеется, совмещать разные методы ничто не мешает.

Импорт контента

content-logo

Прежде чем парсить html-код – его надо откуда-то взять.

Очевидность постановки данной задачи отнюдь не означает простоту реализации. В большинстве случаев решение сводится к загрузке интернет-страницы стандартными методами, однако не всегда всё оказывается так просто.

Некоторые сайты без труда опознают ботов для парсинга (как бы те искусно ни маскировались под «белковых» пользователей) и блокируют получение страниц. Зачастую непросто добраться до содержимого фреймов и участков, подгружаемых через Ajax. Очень часто для получения нужных страниц требуется авторизация, а это обещает различные прелести в виде сессий и coockie. Особняком стоят случаи, когда веб-страница полностью генерируется на стороне клиента, динамически формируясь с помощью JavaScript. Не редкость ситуация, в которой иностранные сайты-доноры игнорируют любые запросы по IP из стран СНГ. В конце концов, приходится работать с веб-сайтами, которые медленно/частично загружаются или вообще работают «через раз».

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

Синтаксический анализ

html5-code-preview

Итак, получив исходный код страницы, можно начинать её  «пилить», отделяя ту информацию, ради которой парсится сайт.

Вполне резонен вопрос – какой инструмент выбрать для обработки? Лобзик, ножовку, болгарку, циркулярку, бензопилу, а может, просто так отломать?

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

Неприятной реальностью в использовании регулярных выражений является полу-корректный html-код большинства сайтов. Хотя терпеливые браузеры в большинстве случаев отображают всё верно, немногие веб-ресурсы похвастают 100% соответствием стандартам W3C.

В принципе, можно самостоятельно построить дерево документа и затем работать с ним с помощью технологии Document Object Model. После этого некорректный html-код вылавливать будет проще. Однако, времени и сил на написание собственного интерпретатора страниц уйдёт немало.

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

Экспорт данных

xml_vs_json

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

Чаще всего это базы данных MySql/PostgreSQL. Заливать в БД можно не только посредством запросов SQL, но и с помощью JSON через Ajax. Во многих случаях из спарсенного контента с помощью XML формируется RSS-поток, что весьма удобно при использовании данных «как есть», без процедуры рерайтинга. Иногда результат парсинга помещают в CSV-файл – поскольку этот текстовый формат очень прост в дальнейшей обработке, легко конвертируется в SQL-запросы и без проблем открывается в Excel’е. В специальных случаях требуется, чтобы конечные данные были представлены в виде электронных таблиц XLS.

SQL

При парсинге каждой страницы сайта-донора, извлечённые данные, как правило, тут же заносятся в базу данных. Поскольку следующая статья посвящёна парсингу средствами PHP, парсер-кодеру не обойтись без уверенных знаний о MySql и PostgreSQL – двух наиболее используемых СУБД для веб-разработок.

Обычно в виде БД спарсенный контент и требуется для переноса на другой веб-ресурс. Однако часто наполнением базы данных дело не заканчивается. Информацию из SQL приходится конвертировать в другие форматы: JSON, текстовый CSV (который, в свою очередь, является удобным буфером для последующей обработки); таблично-процессорный XLS (в PHP есть специальные дополнительные библиотеки для преобразования SQL-данных в электронные таблицы Excel); разметочный XML (порой финальным аккордом парсерной сюиты является веб-серверный RSS-агрегатор).

Ну, и конечно же, приходится иногда преобразовывать данных из MySql в PostgreSQL и обратно, ибо предпочитаемая веб-программистом и требуемая для конкретной задачи СУБД могут не совпадать.

CSV

CSV (англ. Comma-Separated Values — значения через запятую) – формат текстовых файлов для хранения табличной информации. Одна строка – одна запись в таблице. Разделитель значения полей в записи – запятая. Впрочем, вместо запятой можно использовать и другие символы.

Формат CSV популярен поскольку подкупающе прост и универсален. Его можно легко:

  • править в любом текстовом редакторе;
  • открывать в Microsoft Excel и OpenOffice.org Calc;
  • изменять функциями PHP для работы с файлами;
  • конвертировать в SQL и обратно.

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

Пример CSV-файла:
Иванов,Иван,29
Краснодубцева,Мария,32
Иртеньев,Василий,45

RSS

XML-документы (являющиеся технологией для RSS) в парсинге используется в двух противоположных задачах.

По сути дела RSS-поток — это спарсенная информация с интересующего сайта. Если канал и является источником контента, то задача программиста сводится к несложной фильтрации или объединению нескольких RSS-feed’ов из различных источников в один общий. По сути дела, парсер в данном случае представляет из себя веб-серверный RSS-агрегатор, «заточенный» под решение конкретной задачи.

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

XLS

Иногда спарсенный материал требуется представить в виде электронной таблицы Excel.

Безусловно, электронные таблицы невозможно редактировать как обычный текстовый файл. Достаточно открыть документ XLS в текстовом редакторе (Notepad++, к примеру) и обнаружить там набор кракозябр, дабы придти к выводу о бесполезности стандартных функций для работы с файлами. Просто дописать в конец файла очередные данные (как в случае с CSV), вытянутые с сайта-донора, не получится.

Что ж, если стандартные функции не подходят, то выручат нестандартные. Существует немало библиотек, призванных облегчить работу с книгами Excel. Подключив их, можно как считывать информацию с готовых электронных таблиц, так и средствами языков веб-программирования формировать «на лету» XLS-документы. Добавлять новые записи в таблицу можно непосредственно сразу после извлечения контента из сайта-донора. Или же спарсить материал в базу данных SQL, а затем из БД сформировать электронную таблицу.

JSON

По мере обхода страниц сайта-донора зачастую собранная информация тут же посредством запросов SQL заносится в базу данных. Альтернативой является JSON – текстовый формат обмена данными в духе JavaScript.

У данного метода немало несомненных преимуществ перед тем же SQL. JSON отличают языконезависимость, крайняя простота и лаконичность синтаксиса, наличие готовых решений для обработки данных. Но главное фишка – это возможность прямого взаимодействия браузера и сервера, что позволяет реализовывать алгоритмы связанные с фоновым занесением информации в базу данных, работой с файловым кэшем, сериализацией/десериализацией динамических структур и пр.

Document Object Model

dom-logo

DOM (Document Object Model) – кроссплатформенный мультиязычный программный интерфейс, предоставляющий приложениям и скриптам доступ (в том числе и на изменение) к структуре и содержанию HTML, XHTML, XML-документов.

Document Object Model позволяет эффективно выстроить иерархическое дерево веб-документа для дальнейшей работы с ним.

Большая часть библиотек для парсинга основаны на DOM.

DOM является потомком Dynamic HTML Object Model – объектной моделью веб-документов, разработанной для Netscape Navigator и Internet Explore 4 в 1997 году. Новинка позволяла с помощью JavaScript на стороне клиента изменять HTML-структуру документа и манипулировать каскадными таблицами стилей. Оба браузера со временем перестали самостоятельно развивать Dynamic HTML Object Model, которая сейчас считается морально устаревшей технологией. Netscape со временем вообще прекратил существование, IE поддерживает данную технологию в целях обратной совместимости.

Модели, существовавшие до DOM1 и вошедшие в первый и последующие уровни, известны как «DOM уровень 0» (DOM0, DOM level 0). Здесь, в частности, можно упомянуть document.images, document.forms, document.layers и document.all. Данные модели не являются спецификациями DOM, название «DOM уровень 0» это свидетельство того, что предшествовало официальным разработкам W3C.

К слову, разработчики браузеров не обязаны интерпретировать веб-документы с позиции Document Object Model. Но именно с помощью DOM язык JavaScript получает доступ к структуре и содержанию HTML-документов. Поэтому выбора – поддерживать или нет – по большому счёту, нет.

Текущей версией является DOM2, её взяли на вооружение все браузерные движки. DOM3 пока что имеет экспериментальный (рекомендованный) статус и даже основные браузеры поддерживают его не в полной мере. В PHP5, Ruby1.9.x и Python3 также DOM3 реализован лишь частично.

Использованы материалы сайта parsing.valemak.com