×
Россия +7 (495) 139-20-33

Начало начал и основа основ: секреты парсинга

Россия +7 (495) 139-20-33
Шрифт:
0 4493

Парсинг – нулевой этап работы с аналитикой для любого SEO-специалиста. Перед тем как начать данные анализировать, в первую очередь требуется корректно их собрать. В SEOWORK данные собираются регулярно и в больших масштабах, поэтому специалисты компании отлично владеют инструментами парсинга и готовы поделиться навыками с вами! 

Данная статья написана по следам воркшопа «Начало начал и основа основ – секреты парсинга» от  Сергея Горобий, руководителя отдела аналитики SEOWORK.  

Что это такое и зачем? Парсинг vs Скрапинг vs Краулинг 

Парсинг – это структуризация и синтаксический разбор неструктурированных данных. Краулинг – это обход страниц сайта и сбор неструктурированных данных. Скрапинг – объединяет в себе первые 2 понятия: это и обход ссылок, и сбор данных, а также разбор и структуризация.  

В SEOWORK вы можете встретить парсинг при сборе: 

  • частотности запросов (парсинг Wordstat); 
  • поисковой выдачи (мы забираем данные про сниппеты, колдунщики, все данные про органику и контекстную рекламу); 
  • слепков HTML и их разбора в «Аналитике»; 
  • данных в «Тех мониторе»; 
  • результатов для большинства «инструментов»; 
  • данных с внешних источников (системы аналитики, Вебмастера и т. д.); 
  • данных для создания сегментов. 

Как можно парсить данные?  

Вручную в браузере. Вы можете использовать для этого расширения, такие как ScraperData Scraper. Этот способ подходит для небольшого количества страниц.  

Пример сайта

Используя десктопные приложения. Для 1000 и более страниц помогут инструменты Screaming Frog, A-Parser, Content Downloader.  

С помощью надстройки в Excel (ParserOK).  

Прямым парсингом в Google Таблицы (функции IMPORTXML и IMPORTHTML).  

И еще много других способов и парсеров (см. статью). 

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

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

1. Самые популярный – CSS selector (CSSPath) 

CSSPath = ‘html > body > span:nth-of-type(1) a’ 

За счет прописанных стилей селектор выбирает нужные блоки из структуры документа и уже с них забирает данные. 

2. Xpath selector (удобное расширение для браузера

Xpath = ‘html/body/span[1]//a’ 

Изначально использовался для xml, но также актуален и для html-структуры. В отличии от CSS-селектора он может обращаться в глубину и обратно – можно провалиться в родительскую ноду/элемент и после вернуться обратно. Он предпочтительнее, так как это передвижение по осям закрывает множество потребностей для парсинга.  

3. jQuery selector 

XPath 

Работать с XPath можно через copy XPath непосредственно через интерфейс браузера, но лучше прописывать путь XPath самостоятельно. Казалось бы, что копировать путь – достаточно для получения необходимых данных, но как показывает практика, без синтаксиса все равно не обойтись.  

Поэтому давайте разберем синтаксис XPath подробнее. 

Для работы с XPath мы используем ноды (ссылка): 

Ноды

предикаты (ссылка): 

предикаты

Оси (ссылка): 

Оси

а также операторы (ссылка): 

Операторы

Функции 

Облегчить работу с данными можно еще на этапе подготовки к парсингу, используя функции XPath.  

Основные полезные функции: 

  • count(),
  • last() / position(),
  • string-length(), 
  • contains(), 
  • starts-with() или ends-with(), 
  • boolean(), 
  • substring-before() или substring-after(), 
  • normalize-space(). 
Больше функций (источник 1источник 2источник 3). 

Задача #1. Собрать с листинга все ссылки на товары, которые стоят больше 50 руб. 

Пример парсинга

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

Пример парсинга

И тут же мы можем ограничить вывод данных через какое-то условие, например, больше 50 руб. Обращаемся к ноде через точку и задаем условие.  

Страница, на которой работал: https://lenta.com/catalog/hleb-i-hlebobulochnye-izdeliya/vypechka/izdeliya-iz-sdobnogo-testa/ 

Xpath //div[@class='price-label sku-card-small-prices__price price-label--small price-label--primary']//span[1][.>50] 

Как вы видите, в out выводятся пока только числа. Как достать ссылки товаров? Обратимся к структуре и увидим, что ссылка находится по структуре выше, чем div.  

Пример парсинга

То есть наша цена вложена в эту ссылку, и так как мы используем XPath, мы можем перемещаться по оси вверх и вниз. Обратимся к элементу предку, используем ось ancestor и забираем атрибутом href у элементов a.  

В результате для страницы: https://lenta.com/catalog/hleb-i-hlebobulochnye-izdeliya/vypechka/izdeliya-iz-sdobnogo-testa/ получаем Xpath

//div[@class='price-label sku-card-small-prices__price price-label--small price-label--primary']//span[1][.>50]//ancestor::a/@href 

Задача #2. Подсчет количества товара на странице 

Разберем функцию “count” – функция подсчета. Например, мы выбрали все товары на странице и хотим посчитать их количество на странице.  

Пример сайта Лента

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

Страница, на которой работал: https://lenta.com/catalog/hleb-i-hlebobulochnye-izdeliya/vypechka/izdeliya-iz-sdobnogo-testa/ 

Xpath: count(//div[@class='sku-card-small-container']) 

Задача #3. Как посчитать количество символов в статье 

Находим в структуре элемент, в котором располагается вся статья, в нашем случае обращаемся к div с атрибутом itemprop со значением articleBody.  

Пример

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

Страница, на которой работал: https://club.dns-shop.ru/digest/78762-ryzen-9-7950x-okazalsya-do-26-medlennee-core-i9-13900k-v-cinebe/ 

Xpath: string-length(//div[@itemprop='articleBody']) 

Задача #4. Собрать все ссылки на один тип товара/страницы с общей страницы витрины/листинга 

Следующая полезная функция – contains. По ней можно находить различные элементы, которые содержат, например, определенный текст. Разберем на примере Окко.  

У нас есть страница-коллекция, и мы хотим забрать с нее все линки карточек фильмов, не затрагивая карточки, в которых располагаются сериалы. 

Пример

Для начала обратимся к графу всех карточек в верхнем уровне, выбираем этот граф. Получилось 20 карточек (отмечаем, что есть url двух структур – movie и serial, по ним и будем разграничивать фильмы и сериалы). После чего обращаемся к линкам и задаем нужные условия (фильтрация по movie).  

Фильтрация

Страница: https://okko.tv/collection/russian-fantasy-col  

Получаем: //div[@class='_3JAWn']//a[contains(@href, '/movie/')]/@href 

По итогу видим, что в выборке остается 16 карточек фильмов.  

Задача #5. Фильтрация по тексту 

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

Страница: https://lenta.com/catalog/hleb-i-hlebobulochnye-izdeliya/vypechka/izdeliya-iz-sdobnogo-testa/ 

Пример

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

//div[@class='sku-card-small-header__title'][contains(. , Ватрушка)] 

пример

Находим 2 подходящих товара.  

Задача #6. Поиск элементов, которые начинаются или заканчиваются с нужного значения 

Дальше остановимся на функции starts-with() или ends-with(). На примере, который мы рассматривали на сайте Окко, мы можем заменить функцию contains и задать starts-with. Это будет означать, что строка должна начинаться с movie. 

Парсинг

Страница: https://okko.tv/collection/russian-fantasy-col  

Получаем: //div[@class='_3JAWn']//a[starts-with(@href, '/movie/')]/@href 

Задача #7. Дублируются ли заголовки H1 на странице?  

Функция boolean отдает бинарное значение true/false на заданное нами условие. Например, есть задача найти страницы, где могут дублироваться несколько H1. Если вы нашли их на какой-то странице и хотите убедиться, что на других страницах сайта такой проблемы нет – это легко сделать через функцию boolean.  

Прописываем условия, что на странице более 1 заголовка H1, и на выходе получаем false или true. 

Парсинг

Страница: https://market.yandex.ru/catalog--noutbuki/54544/list 

Получаем: boolean(count(//h1)>1) 

Если на странице H1 не дублируется и только один, то в out мы будем получать false. Если же H1 на странице несколько, то в out мы получим true. 

Задача #8. Узнать количество товаров на листинге + отсекаем текст 

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

Парсинг

Страница: https://www.detmir.ru/catalog/index/name/konstruktory/ 

Xpath: //div[@class='wQ']//button[2] 

Но мы видим в нашем out текст «9526 товаров». Воспользовавшись функцией substring-before(), мы можем отсечь значение “ товаров” и в out получим только число 9526. 

Страница: https://www.detmir.ru/catalog/index/name/konstruktory/ 

Xpath: substring-before(//div[@class='wQ']//button[2], ' товаров') //итоговый запрос// 

Задача #9. Как собрать значения без лишних пробелов?  

Например, мы планируем спарсить все H1, но откуда-то появились странные пробелы. Исправить ситуацию быстро можно функцией normalize-space().  

Парсинг

Для этого прописываем xpath normalize-space(//h1).  

Задача №10. Как собрать ссылки на изображения?  

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

Парсинг

Страница, на которой работал: https://www.mvideo.ru/sadovaya-tehnika-i-oborudovanie-8027/vozduhoduvki-9489 

Xpath //div[@class='mobile-img ng-star-inserted']//picture//source/@srcset[contains(., '/200/')] 

и //div[@class='mobile-img ng-star-inserted']//picture//img/@src 

Еще больше примеров работы с XPath вы узнаете из воркшопа «Начало начал и основа основ – секреты парсинга».

(Голосов: 11, Рейтинг: 4.45)
Читайте нас в Telegram - digital_bar

Есть о чем рассказать? Тогда присылайте свои материалы Марине Ибушевой


Новые 
Новые
Лучшие
Старые
Сообщество
Подписаться 
Подписаться на дискуссию:
E-mail:
ОК
Вы подписаны на комментарии
Ошибка. Пожалуйста, попробуйте ещё раз.
Отправить отзыв
ПОПУЛЯРНЫЕ ОБСУЖДЕНИЯ НА SEONEWS
13 инструментов для SEO-специалиста, актуальных в 2022 году
Саша
8
комментариев
0
читателей
Полный профиль
Саша - кажись какой-то британец
Продуктовый подход в SEO: новая эпоха поисковой оптимизации
Борис
1
комментарий
0
читателей
Полный профиль
Борис - Почитал и спич очень близок к тому, что гугловоды говорят у себя на курсере. К комменту ниже: инклюзивность, доступность - это часть маркетинга и seo становится. Удивился даже, что в снг о таком слышали)))))
Скоринг запросов: почему он необходим при сборе семантического ядра
Илья Горбачев
3
комментария
0
читателей
Полный профиль
Илья Горбачев - Сбор сезонности в последней версии находится на вкладке "Парсинг" и вызывается кликом по иконке с графиком на черном фоне. Только он собирает общую частоту, поэтому лучше собирать данные с фраз (маркеров), которые не пересекаются в реальных запросах.
Альманах фатальных ошибок b2b-сайта: как владельцы бизнеса обрекают сайты на бесславное существование. Часть первая
Сергей Ерофеев
3
комментария
0
читателей
Полный профиль
Сергей Ерофеев - Спасибо за комментарий! Вы правы, если за CMS следит заинтересованный профессионал - риски минимальны. Но мы же с вами понимаем, что: а) Не каждый разработчик делает все, как "для себя". б) После создания сайта разработчик редко остается на проекте в) Часто разработчик не является маркетологом. В этом случае принцип "функционал работает и этого достаточно" может быть на первом месте. Мы тоже видели большое количество хороших и качественных проектов на бесплатных CMS, но проблемных проектов мы видели сильно больше. Просто статистика.
Почему не стоит отказываться от SEO на этапе разработки
Максимус
3
комментария
0
читателей
Полный профиль
Максимус - Я уже сделал и сегодня в первый класс отвёл!
Как автоматизировать мессенджеры для бизнеса в CRM-системе
Алиналина
1
комментарий
0
читателей
Полный профиль
Алиналина - Кстати да. Но мы зарегались, CRMка реально интересная
Санкции поисковых систем: как узнать, что сайт попал под фильтры. Обзор главных инструментов
Volodyka Filipov
6
комментариев
0
читателей
Полный профиль
Volodyka Filipov - Нужно не крутить, а по честному развивать)))
Белые и серые методы продвижения. Тренды 2023
Гость
1
комментарий
0
читателей
Полный профиль
Гость - Я тоже заметил. Если встать в 5 утра и шёпотом сказать 3 раза Ажгибесов. Сайт в гугле растёт.
Кейс MediaNation: увеличили еженедельный трафик автомобильной компании на 50% за год и вышли в топ поиска по 300 запросам
Игорь Скляр
1
комментарий
0
читателей
Полный профиль
Игорь Скляр - Действительно, изначально рост был именно по информационным запросам. Но рост позиций и трафика по информационным запросам положительно повлиял и на связанные позиции по коммерческим запросам и сдвинул видимость с мёртвой точки
Количество запросов по теме онлайн-образования выросло на 17%. Исследование Яндекса
Марина Ибушева
63
комментария
0
читателей
Полный профиль
Марина Ибушева - Это релиз от пресс-службы Яндекса
ТОП КОММЕНТАТОРОВ
Комментариев
910
Комментариев
834
Комментариев
554
Комментариев
540
Комментариев
483
Комментариев
385
Комментариев
373
Комментариев
262
Комментариев
249
Комментариев
171
Комментариев
156
Комментариев
141
Комментариев
121
Комментариев
115
Комментариев
100
Комментариев
97
Комментариев
97
Комментариев
96
Комментариев
80
Комментариев
77
Комментариев
74
Комментариев
67
Комментариев
63
Комментариев
60
Комментариев
59

Отправьте отзыв!
Отправьте отзыв!