Как парсить различные данные из интернет-магазина с помощью Netpeak Spider

Кейсы
18Нравится
6Комментарии
Поделиться
Как парсить различные данные из интернет-магазина с помощью Netpeak Spider

Парсинг сайта — это извлечение текстовых данных с HTML-страниц. К сожалению, не всегда понятно, как правильно парсить данные с сайтов, и что делать в тех или иных ситуациях. Этот пост наглядно продемонстрирует различные аспекты, которые вам надо учесть для парсинга данных. Я отвечу на часто задаваемые вопросы и поделюсь лайфхаками.

1. Типы специальных выражений для парсинга

Для парсинга данных применяются специальные выражения. Они позволяют программе искать тот или иной тип данных для извлечения. В зависимости от сложности задачи применяют такие паттерны:

  • CSS-селекторы — паттерны, позволяющие выбрать нужные элементы разметки, как правило, для их последующей стилизации (но не в случае с парсингом).
  • XPath — специальный язык запросов, с помощью которого можно извлечь содержимое какого-либо тега или атрибута по его адресу в исходном коде HTML-страницы.
  • Regexp — язык, с помощью которого задаётся последовательность символов (паттерн), которая определяет, какой тип строки необходимо искать на странице.

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

2. Как искать элементы и подбирать специальные выражения

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

В качестве особенности выступают атрибуты тегов, чаще всего — атрибуты class, id или itemprop (микроразметка), так как в большинстве случаев их значения уникальны в пределах страницы.

Чтобы парсить элемент по его атрибуту, достаточно указать этот атрибут в квадратных скобках:

[attributeName]

Если просто наличия атрибута недостаточно, то можно указать поиск по значению внутри него:

С точным соответствием

[attributeName="attributeValue"]

Например, если необходимо извлечь элемент с уникальным значением «product_price» в атрибуте class, то необходимо использовать следующее условие:

[class="product_price"]

Содержит

[attributeName~="value"]

В случае, когда значение атрибута слишком длинное, но в нём есть какое-либо уникальное выражение или слово, например «flower», то можно использовать такое условие:

[title~="flower"]

Начинается на

[attributeName^="value"]

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

[href^="http://"]

Заканчивается на

[attributeName$="value"]

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

[href$=".html"]

Теперь перейдём к примерам.

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

Алгоритм подбора паттерна для парсинга следующий:

  1. Откройте любую карточку товара.
  2. Выделите элемент, который требуется извлечь и найдите его в исходном коде.
  3. Найдите его «особенность» и составьте соответствующее выражение.

В качестве примера я решил парсить характеристики велосипедов.

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

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

Цена указана в теге <span>, но у него нет какой-либо отличительной особенности, поэтому он не подходит. Но мы видим, что он заключён внутри другого тега <span>, который имеет уникальный класс — detail-price-uah. Его значение как раз и будем использовать. Задать поиск по значению тега class можно двумя способами:

Для любителей классики:

[class="detail-price-uah"]

Для профи:

.detail-price-uah

Только одной цены недостаточно. Необходимо также извлечь название товара, ссылку на фото и некоторые характеристики. К счастью, парсинг названия — это самое простое, что может быть. Зачастую оно содержится в теге <h1>, и его принято использовать один раз в исходном коде, так что достаточно просто указать название тега без указаний атрибутов и прочего.

А вот со ссылкой на фото и характеристиками порой нужно повозиться.

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

В данном случае можно использовать значения атрибута class или itemprop, так как они уникальны. Только парсить нужно не внутренний текст, а значение атрибута src, ведь именно он содержит искомую ссылку.

Способ 1

[itemprop="image"]

Способ 2

[class="ng-star-inserted"]

Фото собрали, теперь соберём характеристики. В парсинге всех характеристик нет необходимости, мне важно знать размер рамы и количество скоростей.

Характеристики товара

Есть множество вариантов, чтобы спарсить значения из таблицы. Но проблема заключается в том, что будут извлечены все значения в таблице, включая те, которые мне не нужны в отчёте: элементы в таблице имеют одинаковую разметку и одинаковые значения в атрибуте class.

В таком случае нужно использовать XPath. Он позволяет задать порядковый номер элемента. Чтобы спарсить размер рамы и количество скоростей, необходимо задать такие выражения:

Размер рамы

//table[@class="chars-t"]/tbody/tr[2]/td[2]

Количество скоростей

//table[@class="chars-t"]/tbody/tr[4]/td[2]

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

//table[@attribute="attributeValue"]/tbody/tr[i]/td[j]

где:

  • attribute — любой атрибут тега <table>;
  • attributeValue — значение атрибута, по которому можно идентифицировать таблицу;
  • i — порядковый номер строки в таблице;
  • j — порядковый номер столбца в таблице.

2. Как получить нужные данные с помощью функции парсинга в Netpeak Spider

Итак, все выражения для парсинга подобраны. Теперь необходимо проделать следующие действия:

  1. Откройте Netpeak Spider.
  2. Зайдите в настройки, откройте вкладку «Парсинг» и задайте подобранные условия.

    Настройки на вкладке «Парсинг» в Netpeak Spider

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

Программа по умолчанию анализирует много On-Page параметров, так как они необходимы для SEO-аудита. Для парсинга всё это не нужно. Разработчики позаботились о возможности включить только те параметры, которые вы считаете нужными для своей задачи. Перейдите на вкладку «Параметры», включите параметры парсинга и параметр «Код ответа сервера», а остальное отключите.

Настройки на вкладке «Параметры» в Netpeak Spider


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

Таблица со значениями найденных данных по заданным условиям парсинга в Netpeak Spider.

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

  • Через пункт меню «База данных» → «Сводка по парсингу».
  • Через вкладку «Парсинг» на боковой панели → «Все результаты».

Как открыть отчёт по парсингу в Netpeak Spider

Дополнительно можно открыть отчёт по конкретному параметру на вкладке «Парсинг» боковой панели программы.

Кстати, в программе есть удобная функция, позволяющая буквально в два клика фильтровать данные, — сегментация.

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

Как применить сегмент в Netpeak Spider

Отчёт перед использованием сегментации:

Отчёт перед использованием сегментации в Netpeak Spider

И после:

Отчёт после использования сегментации в Netpeak Spider

3. FAQ

1. Все настройки парсинга заданы верно, но всё равно данные не парсятся. Почему?

1.1. Код ответа сервера — не 200 OK

Данные не будут парситься, если страница вернула не 200 код ответа сервера, а, например, 503. Поэтому рекомендуется всегда оставлять этот параметр включённым. Как видно на скриншоте, количество найденных цен у страниц с 503 кодом ответа равно нулю, хотя если открыть их в браузере, то цены будут на страницах.

Страницы с 503 кодом ответа сервера в Netpeak Spider

Алгоритм:

  1. Задайте один-два потока сканирования («Настройки» → «Основные» → «Скорость сканирования»).
  2. Выберите URL с некорректным кодом ответа сервера и примените функцию «Фильтровать по значению».

    Функция «Фильтровать по значению» в Netpeak Spider

  3. Пересканируйте все URL с некорректным кодом ответа сервера.

    Функция «Пересканировать таблицу» в Netpeak Spider

    1.2. Исходный код, который передаётся программе, отличается от исходного кода в браузере

    Причиной может быть User Agent. Очевидно, что, например, разметка страницы для десктопного браузера Google Chrome и мобильного Safari будет разной.

    Инструмент «Анализ исходного кода и HTTP-заголовков» в Netpeak Spider

    2. В выгруженном отчёте данные склеиваются

    Это происходит при парсинге элемента, который внутри себя содержит другие элементы HTML. Например, если парсить всю строку в таблице (тег <tr>), этот элемент будет содержать в себе несколько тегов . Все данные, заключённые в этих тегах, будут извлечены в одну ячейку таблицы результатов и склеены между собой.

    Алгоритм следующий:

    Шаг 1. Выберите столбец со значениями и нажмите «Текст по столбцам».

    Работа в таблице MS Excel

    Шаг 2.

    
Мастер распределения текста по столбцам в MS Excel

    Шаг 3.

    
Мастер распределения текста по столбцам в MS Excel

    Шаг 4. Наслаждаемся результатом :)

    Результаты после разделения значений в MS Excel

    Подводим итоги

    Надеюсь, данный пост помог вам разобраться с парсингом в Netpeak Spider и ответил на вопросы, которые у вас могли возникнуть в процессе. Буду рад поддержке лайками и репостами.

    Если у вас есть какие-либо вопросы, задавайте их в комментариях или закажите персональную демонстрацию :)

    Понравился кейс? Давайте лично обсудим все детали и преимущества Netpeak Spider

    Book a personal demo