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

Парсинг – нулевой шаг работы с аналитикой для хоть какого SEO-специалиста. Перед тем как начать данные рассматривать, сначала требуется корректно их собрать. В SEOWORK данные собираются часто и в огромных масштабах, потому спецы компании непревзойденно обладают инструментами парсинга и готовы поделиться способностями с вами!
Данная статья написана по следам воркшопа «Начало начал и база основ – секреты парсинга» от Сергея Горобий, управляющего отдела аналитики SEOWORK.
Оглавление
Что же все-таки это такое и для чего? Парсинг vs Скрапинг vs Краулинг
Парсинг – это структуризация и синтаксический разбор неструктурированных данных. Краулинг – это обход страничек веб-сайта и сбор неструктурированных данных. Скрапинг – соединяет воединыжды внутри себя 1-ые 2 понятия: это и обход ссылок, и сбор данных, также разбор и структуризация.
В SEOWORK вы сможете повстречать парсинг при сборе:
- частотности запросов (парсинг Wordstat);
- поисковой выдачи (мы забираем данные про сниппеты, колдунщики, все данные про органику и контекстную рекламу);
- слепков HTML и их разбора в «Аналитике»;
- данных в «Тех мониторе»;
- результатов для большинства «инструментов»;
- данных с наружных источников (системы аналитики, Веб-мастера и т. д.);
- данных для сотворения частей.
Как можно парсить данные?
Вручную в браузере. Вы сможете употреблять для этого расширения, такие как Scraper, Data Scraper. Этот метод подступает для маленького количества страничек.
Используя десктопные приложения. Для 1000 и наиболее страничек посодействуют инструменты Screaming Frog, A-Parser, Content Downloader.
При помощи надстройки в Excel (ParserOK).
Прямым парсингом в Гугл Таблицы (функции 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 2-ух структур – 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 вы узнаете из воркшопа «Начало начал и база основ – секреты парсинга».