Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

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

По умолчанию большинство программ технического аудита сайтов собирают только содержимое заголовков H1 и H2, однако, если например, вы хотите собрать заголовки H5, то их уже нужно будет извлекать отдельно. И чтобы избежать рутинной ручной работы по парсингу и извлечению данных из HTML-кода страниц – обычно используют веб-скраперы.

Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

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

Возможные сферы применения веб-скрейпинга:

  • Отслеживание цен на товары в интернет-магазинах.
  • Извлечение описаний товаров и услуг, получение числа товаров и картинок в листинге.
  • Извлечение контактной информации (адреса электронной почты, телефоны и т.д.).
  • Сбор данных для маркетинговых исследований (лайки, шеры, оценки в рейтингах).
  • Извлечение специфичных данных из кода HTML-страниц (поиск систем аналитики, проверка наличия микроразметки).
  • Мониторинг объявлений.

Основными способами веб-скрейпинга являются методы разбора данных используя XPath, CSS-селекторы, XQuery, RegExp и HTML templates.

  • XPath представляет собой специальный язык запросов к элементам документа формата XML / XHTML. Для доступа к элементам XPath использует навигацию по DOM путем описания пути до нужного элемента на странице. С его помощью можно получить значение элемента по его порядковому номеру в документе, извлечь его текстовое содержимое или внутренний код, проверить наличие определенного элемента на странице. Описание XPath >>
  • CSS-селекторы используются для поиска элемента его части (атрибут). CSS синтаксически похож на XPath, при этом в некоторых случаях CSS-локаторы работают быстрее и описываются более наглядно и кратко. Минусом CSS является то, что он работает лишь в одном направлении – вглубь документа. XPath же работает в обе стороны (например, можно искать родительский элемент по дочернему). Таблица сравнения CSS и XPath >>
  • XQuery имеет в качестве основы язык XPath. XQuery имитирует XML, что позволяет создавать вложенные выражения в таким способом, который невозможен в XSLT. Описание XQuery >>
  • RegExp – формальный язык поиска для извлечения значений из множества текстовых строк, соответствующих требуемым условиям (регулярному выражению). Описание RegExp >>
  • HTML templates – язык извлечения данных из HTML документов, который представляет собой комбинацию HTML-разметки для описания шаблона поиска нужного фрагмента плюс функции и операции для извлечения и преобразования данных. Описание HTML templates >>

Обычно при помощи парсинга решаются задачи, с которыми сложно справиться вручную. Это может быть веб скрейпинг описаний товаров при создании нового интернет-магазина, скрейпинг в маркетинговых исследованиях для мониторинга цен, либо для мониторинга объявлений (например, по продаже квартир). Для задач SEO-оптимизации обычно используются узко специализированные инструменты, в которых уже встроены парсеры со всеми необходимыми настройками извлечения основных SEO параметров.

BatchURLScraper

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

Поэтому нами был создан простой и бесплатный инструмент – BatchURLScraper, предназначенный для сбора данных из списка URL с возможностью экспорта полученных результатов в Excel.

Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

Интерфейс программы достаточно прост и состоит всего из 3-х вкладок:

  • Вкладка "Список URL" предназначена для добавления страниц парсинга и отображения результатов извлечения данных с возможностью их последующего экспорта.
  • На вкладке "Правила" производится настройка правил скрейпинга при помощи XPath, CSS-локаторов, XQuery, RegExp или HTML templates.
  • Вкладка "Настройки" содержит общие настройки программы (число потоков, User-Agent и т.п.).
Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта
Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

Также нами был добавлен модуль для отладки правил.

Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

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

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

Извлечение данных со страниц сайтов в примерах

Так как BatchURLScraper позволяет извлекать данные из произвольного списка страниц, в котором могут встречаться URL от разных доменов и, соответственно, разных типов сайта, то для примеров тестирования извлечения данных мы будем использовать все пять вариантов скрейпинга: XPath, CSS, RegExp, XQuery и HTML templates. Список тестовых URL и настроек правил находятся в дистрибутиве программы, таким образом можно протестировать все это лично, используя пресеты (предустановленные настройки парсинга).

Механика извлечения данных

1. Пример скрейпинга через XPath.

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

Для извлечения цен нам нужно:

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

Для извлечения признака наличия товара на сайте операция будет аналогичной.

Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

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

Далее, в списке правил программы мы добавляем поочередно правила и вставляем в них ранее скопированные коды элементов XPath из браузера.

2. Определяем присутствие счетчика Google Analytics при помощи RegExp или XPath.

  • XPath: Открываем исходный код любой страницы по Ctrl-U, затем ищем в нем текст "gtm.start", ищем в коде идентификатор UA-..., и далее также используя отображение кода элемента копируем его XPath и вставляем в новое правило в BatchURLScraper.
  • RegExp: Поиск счетчика через регулярные выражения еще проще: код правила извлечения данных вставляем ['](UA-.*?)['].
Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

3. Извлечь контактный Email используя CSS.

Тут совсем все просто. Если на страницах сайта встречаются гиперссылки вида "mailto:", то из них можно извлечь все почтовые адреса.

Для этого мы добавляем новое правило, выбираем в нем CSSPath, и в код правила извлечения данных вставляем правило a[href^="mailto:"].

Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

4. Извлечь значения в списках или в таблице при помощи XQuery.

В отличии от других селекторов, XQuery позволяет использовать циклы и прочие возможности языков программирования.

Например, при помощи оператора FOR можно получить значения всех списков LI. Пример:

Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

Либо узнать, есть ли почта на страницах сайта:

  • if (count(//a[starts-with(@href, 'mailto:')])) then "Есть почта" else "Нет почты"

5. Использование HTML templates.

В данном языке извлечения данных в качестве функций можно использовать XPath/XQuery, CSSpath, JSONiq и обычные выражения.

Тестовая таблица:

Веб-скрейпинг: как бесплатно спарсить и извлечь данные с сайта

Например, данный шаблон ищет таблицу с атрибутом id="t2" и извлекает текст из второго столбца таблицы:

  • <table id="t2"><template:loop><tr><td></td><td>{text()}</td></tr></template:loop></table>

Извлечение данных из второй строки:

  • <table id="t2"><tr></tr><tr><template:loop><td>{text()}</td></template:loop></tr></table>

А этот темплейт вычисляет сумму чисел в колонке таблицы:

  • <table id="t2">{_tmp := 0}<template:loop><tr><td>{_tmp := $_tmp + .}</td></tr></template:loop>{result := $_tmp}</table>

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

Скачать BatchURLScraper и протестировать работу правил извлечения данных можно по этой ссылке

3636
22 комментария

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

2
Ответить

Если говорим про SEO,  то не проще ли ScreamingFrog воспользоваться?) 

1
Ответить

Пожалуйста! Уже выложили апдейт )

1
Ответить

А еще лучше просто использовать многопоточный Puppeteer, гораздо больше возможностей. Бесплатно, гибко и масштабируемо. Нужно было найти свой номер на страницах одного сайта, написал скрипт и распарсил на скорости 600 страниц в минуту (машина MBP 15" 2018). https://www.npmjs.com/package/puppeteer-cluster

1
Ответить

Комментарий недоступен

2
Ответить

Понятно, что для серьезных задач можно нанять программиста, который все это настроит или выучить язык программирования за неделю)) Но на все это нужно время либо финансовые ресурсы, которых зачастую нет.

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

2
Ответить

Написал свой скрипт, ради того чтобы найти свой номер на страницах ОДНОГО сайта... Уважаемый, а вы точно сеошник?)

1
Ответить