что нужно знать для парсинга
Как спарсить любой сайт?
Меня зовут Даниил Охлопков, и я расскажу про свой подход к написанию скриптов, извлекающих данные из интернета: с чего начать, куда смотреть и что использовать.
Написав тонну парсеров, я придумал алгоритм действий, который не только минимизирует затраченное время на разработку, но и увеличивает их живучесть, робастность, масштабируемость.
Чтобы спарсить данные с вебсайта, пробуйте подходы именно в таком порядке:
Найдите официальное API,
Найдите XHR запросы в консоли разработчика вашего браузера,
Найдите сырые JSON в html странице,
Отрендерите код страницы через автоматизацию браузера,
Совет профессионалов: не начинайте с BS4/Scrapy
Крутые вебсайты с крутыми продактами делают тонну A/B тестов, чтобы повышать конверсии, вовлеченности и другие бизнес-метрики. Для нас это значит одно: элементы на вебстранице будут меняться и переставляться. В идеальном мире, наш написанный парсер не должен требовать доработки каждую неделю из-за изменений на сайте.
Приходим к выводу, что не надо извлекать данные из HTML тегов раньше времени: разметка страницы может сильно поменяться, а CSS-селекторы и XPath могут не помочь. Используйте другие методы, о которых ниже. ⬇️
Используйте официальный API
Поищите XHR запросы в консоли разработчика
Все современные вебсайты (но не в дарк вебе, лол) используют Javascript, чтобы догружать данные с бекенда. Это позволяет сайтам открываться плавно и скачивать контент постепенно после получения структуры страницы (HTML, скелетон страницы).
В итоге, даже не имея официального API, можно воспользоваться красивым и удобным закрытым API. ☺️
Даже если фронт поменяется полностью, этот API с большой вероятностью будет работать. Да, добавятся новые поля, да, возможно, некоторые данные уберут из выдачи. Но структура ответа останется, а значит, ваш парсер почти не изменится.
Алгорим действий такой:
Открывайте вебстраницу, которую хотите спарсить
Открывайте вкладку Network и кликайте на фильтр XHR запросов
Обновляйте страницу, чтобы в логах стали появляться запросы
Найдите запрос, который запрашивает данные, которые вам нужны
Копируйте запрос как cURL и переносите его в свой язык программирования для дальнейшей автоматизации.
Кнопка, которую я искал месяцы
Поищите JSON в HTML коде страницы
Как было удобно с XHR запросами, да? Ощущение, что ты используешь официальное API. 🤗 Приходит много данных, ты все сохраняешь в базу. Ты счастлив. Ты бог парсинга.
Но тут надо парсить другой сайт, а там нет нужных GET/POST запросов! Ну вот нет и все. И ты думаешь: неужели расчехлять XPath/CSS-selectors? 🙅♀️ Нет! 🙅♂️
Чтобы страница хорошо проиндексировалась поисковиками, необходимо, чтобы в HTML коде уже содержалась вся полезная информация: поисковики не рендерят Javascript, довольствуясь только HTML. А значит, где-то в коде должны быть все данные.
Современные SSR-движки (server-side-rendering) оставляют внизу страницы JSON со всеми данные, добавленный бекендом при генерации страницы. Стоп, это же и есть ответ API, который нам нужен! 😱😱😱
Вот несколько примеров, где такой клад может быть зарыт (не баньте, плиз):
Красивый JSON на главной странице Habr.com. Почти официальный API! Надеюсь, меня не забанят. И наш любимый (у парсеров) Linkedin!
Алгоритм действий такой:
В dev tools берете самый первый запрос, где браузер запрашивает HTML страницу (не код текущий уже отрендеренной страницы, а именно ответ GET запроса).
Внизу ищите длинную длинную строчку с данными.
Вырезаете JSON из HTML любыми костылямии (я использую html.find(«=<") ).
Отрендерите JS через Headless Browsers
Если коротко, то есть инструменты, которые позволяют управлять браузером: открывать страницы, вводить текст, скроллить, кликать. Конечно же, это все было сделано для того, чтобы автоматизировать тесты веб интерфейса. I’m something of a web QA myself.
После того, как вы открыли страницу, чуть подождали (пока JS сделает все свои 100500 запросов), можно смотреть на HTML страницу опять и поискать там тот заветный JSON со всеми данными.
Для масштабируемости и простоты, я советую использовать удалённые браузерные кластеры (remote Selenium grid).
Вот так я подключаюсь к Selenoid из своего кода: по факту нужно просто указать адрес запущенного Selenoid, но я еще зачем-то передаю кучу параметров бразеру, вдруг вы тоже захотите. На выходе этой функции у меня обычный Selenium driver, который я использую также, как если бы я запускал браузер локально (через файлик chromedriver).
Парсите HTML теги
Если случилось чудо и у сайта нет ни официального API, ни вкусных XHR запросов, ни жирного JSON внизу HTML, если рендеринг браузерами вам тоже не помог, то остается последний, самый нудный и неблагодарный метод. Да, это взять и начать парсить HTML разметку страницы. То есть, например, из Cool website достать ссылку. Это можно делать как простыми регулярными выражениями, так и через более умные инструменты (в питоне это BeautifulSoup4 и Scrapy) и фильтры (XPath, CSS-selectors).
Мой единственный совет: постараться минимизировать число фильтров и условий, чтобы меньше переобучаться на текущей структуре HTML страницы, которая может измениться в следующем A/B тесте.
Подписывайтесь на мой Телеграм канал, где я рассказываю свои истории из парсинга и сливаю датасеты.
Почему стоит научиться «парсить» сайты, или как написать свой первый парсер на Python
В этой статье я постараюсь понятно рассказать о парсинге данных и его нюансах.
Для начала давайте разберемся, что же действительно означает на первый взгляд непонятное слово — парсинг. Прежде всего это процесс сбора данных с последующей их обработкой и анализом. К этому способу прибегают, когда предстоит обработать большой массив информации, с которым сложно справиться вручную. Понятно, что программу, которая занимается парсингом, называют — парсер. С этим вроде бы разобрались.
Перейдем к этапам парсинга.
И так, рассмотрим первый этап парсинга — Поиск данных.
Так как нужно парсить что-то полезное и интересное давайте попробуем спарсить информацию с сайта work.ua.
Для начала работы, установим 3 библиотеки Python.
pip install beautifulsoup4
Без цифры 4 вы ставите старый BS3, который работает только под Python(2.х).
pip install requests
pip install pandas
Теперь с помощью этих трех библиотек Python, можно проанализировать нашу веб-страницу.
Второй этап парсинга — Извлечение информации.
Попробуем получить структуру html-кода нашего сайта.
Давайте подключим наши новые библиотеки.
И сделаем наш первый get-запрос.
Статус 200 состояния HTTP — означает, что мы получили положительный ответ от сервера. Прекрасно, теперь получим код странички.
Получилось очень много, правда? Давайте попробуем получить названия вакансий на этой страничке. Для этого посмотрим в каком элементе html-кода хранится эта информация.
У нас есть тег h2 с классом «add-bottom-sm», внутри которого содержится тег a. Отлично, теперь получим title элемента a.
Хорошо, мы получили названия вакансий. Давайте спарсим теперь каждую ссылку на вакансию и ее описание. Описание находится в теге p с классом overflow. Ссылка находится все в том же элементе a.
Получаем такой код.
И последний этап парсинга — Сохранение данных.
Давайте соберем всю полученную информацию по страничке и запишем в удобный формат — csv.
После запуска появится файл test.csv — с результатами поиска.
«Кто владеет информацией, тот владеет миром» (Н. Ротшильд).
Как выбрать решение для парсинга сайтов: классификация и большой обзор программ, сервисов и фреймворков
Парсинг или как его еще иногда называют web scraping – процесс автоматического сбора информации с различных сайтов. Форумы, новостные сайты, социальные сети, маркейтплейсы, интернет-магазины и даже поисковая выдача, вот далеко не полный список ресурсов с которых собирают контент.
И часто контент требуется собирать в больших объемах, массово, а если еще данные нужны с определенной периодичностью, то решить такую задачу руками не представляется возможным. Вот тут на помощь приходят специальные алгоритмы, которые по определенным условиям собирают информацию, структурируют и выдают в нужном виде.
Кому и зачем нужно парсить сайты?
В основном парсинг используют профессионалы для решения рабочих задач, поскольку автоматизация позволяет получить сразу большой массив данных, но также он пригодится и для решения частных задач.
Классификация программ и инструментов для парсинга
По использованию ресурсов
Это важный момент, если парсер будет использоваться для бизнес задач и регулярно, вам нужно решить на чьей стороне будет работать алгоритм, на стороне исполнителя или вашей. С одной стороны, для развертывания облачного решения у себя, потребуется специалист для установки и поддержки софта, выделенное место на сервере, и работа программы будет отъедать серверные мощности. И это дорого. С другой, если вы можете себе это позволить, возможно такое решение обойдется дешевле (если масштабы сбора данных действительно промышленные), нужно изучать тарифные сетки.
Есть еще момент с приватностью, политики некоторых компаний не позволяют хранить данные на чужих серверах и тут нужно смотреть на конкретный сервис, во-первых, собранные парсером данные могут передаваться сразу по API, во-вторых, этот момент решается дополнительным пунктом в соглашении.
По способу доступа
Удаленные решения
Сюда отнесем облачные программы (SaaS-решения), главное преимущество таких решений в том, что они установлены на удаленном сервере и не используют ресурсы вашего компьютера. Вы подключаетесь к серверу через браузер (в этом случае возможна работа с любой ОС) или приложение и берете нужные вам данные.
Облачные сервисы, как и все готовые решения в этой статье, не гарантируют, что вы сможете парсить любой сайт. Вы можете столкнуться со сложной структурой, технологией сайта, которую “не понимает” сервис, защитой, которая окажется “не по зубам” или невозможностью интерпретировать данные (например, вывод текстовых данных не текстом, а картинками).
Octoparse – один из популярных облачных сервисов.
Mozenda – популярный сервис позволяющий работать в облаке и на локальной машине, имеет интерфейс для визуального захвата данных без знания программирования.
Десктоп решения (программы для парсинга)
Такие программы устанавливаются на компьютер. Применяются для нерегулярных и нересурсоемких задач. Многие позволяют настраивать параметры сбора данных визуально.
По используемому фреймворку
Если задачи, стоящие при сборе данных нестандартные, нужно выстроить подходящую архитектуру, работать с множеством потоков, и существующие решения вас не устраивают, нужно писать свой собственный парсер. Для этого нужны ресурсы, программисты, сервера и специальный инструментарий, облегчающий написание и интеграцию парсинг программы, ну и конечно поддержка (потребуется регулярная поддержка, если изменится источник данных, нужно будет поменять код). Рассмотрим какие библиотеки существуют в настоящее время. В этом разделе не будем оценивать достоинства и недостатки решений, т.к. выбор может быть обусловлен характеристиками текущего программного обеспечения и другими особенностями окружения, что для одних будет достоинством для других – недостатком.
Парсинг сайтов Python
Библиотеки для парсинга сайтов на Python предоставляют возможность создания быстрых и эффективных программ, с последующей интеграцией по API. Важной особенностью является, что представленные ниже фреймворки имеют открытый исходный код.
Scrapy – наиболее распространенный фреймворк, имеет большое сообщество и подробную документацию, хорошо структурирован.
BeautifulSoup – предназначен для анализа HTML и XML документов, имеет документацию на русском, особенности – быстрый, автоматически распознает кодировки.
Лицензия: Creative Commons, Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0)
PySpider – мощный и быстрый, поддерживает Javascript, нет встроенной поддержки прокси.
Лицензия: Apache License, Version 2.0
Grab – особенность – асинхронный, позволяет писать парсеры с большим количеством сетевых потоков, есть документация на русском, работает по API.
Лицензия: MIT License
Lxml – простая и быстрая при анализе больших документов библиотека, позволяет работать с XML и HTML документами, преобразовывает исходную информацию в типы данных Python, хорошо документирована. Совместима с BeautifulSoup, в этом случае последняя использует Lxml как парсер.
Selenium – инструментарий для автоматизации браузеров, включает ряд библиотек для развертывания, управления браузерами, возможность записывать и воспроизводить действия пользователя. Предоставляет возможность писать сценарии на различных языках, Java, C#, JavaScript, Ruby.
Лицензия: Apache License, Version 2.0
Парсинг сайтов на JavaScript
JavaScript также предлагает готовые фреймворки для создания парсеров с удобными API.
Puppeteer — это headless Chrome API для NodeJS программистов, которые хотят детально контролировать свою работу, когда работают над парсингом. Как инструмент с открытым исходным кодом, Puppeteer можно использовать бесплатно. Он активно разрабатывается и поддерживается самой командой Google Chrome. Он имеет хорошо продуманный API и автоматически устанавливает совместимый двоичный файл Chromium в процессе установки, а это означает, что вам не нужно самостоятельно отслеживать версии браузера. Хотя это гораздо больше, чем просто библиотека для парсинга сайтов, она очень часто используется для парсинга данных, для отображения которых требуется JavaScript, она обрабатывает скрипты, таблицы стилей и шрифты, как настоящий браузер. Обратите внимание, что хотя это отличное решение для сайтов, которым для отображения данных требуется javascript, этот инструмент требует значительных ресурсов процессора и памяти.
Лицензия: Apache License, Version 2.0
Cheerio – быстрый, анализирует разметку страницы и предлагает функции для обработки полученных данных. Работает с HTML, имеет API устроенное так же, как API jQuery.
Лицензия: MIT License
Apify SDK – является библиотекой Node.js, позволяет работать с JSON, JSONL, CSV, XML,XLSX или HTML, CSS. Работает с прокси.
Лицензия: Apache License, Version 2.0
Osmosis – написан на Node.js, ищет и загружает AJAX, поддерживает селекторы CSS 3.0 и XPath 1.0, логирует URL, заполняет формы.
Лицензия: MIT License
Парсинг сайтов на Java
Java также предлагает различные библиотеки, которые можно применять для парсинга сайтов.
Jaunt – библиотека предлагает легкий headless браузер (без графического интерфейса) для парсинга и автоматизации. Позволяет взаимодействовать с REST API или веб приложениями (JSON, HTML, XHTML, XML). Заполняет формы, скачивает файлы, работает с табличными данными, поддерживает Regex.
Лицензия: Apache License (Срок действия программного обеспечения истекает ежемесячно, после чего должна быть загружена самая последняя версия)
Jsoup – библиотека для работы с HTML, предоставляет удобный API для получения URL-адресов, извлечения и обработки данных с использованием методов HTML5 DOM и селекторов CSS. Поддерживает прокси. Не поддерживает XPath.
Лицензия: MIT License
HtmlUnit – не является универсальной средой для модульного тестирования, это браузер без графического интерфейса. Моделирует HTML страницы и предоставляет API, который позволяет вызывать страницы, заполнять формы, кликать ссылки. Поддерживает JavaScript и парсинг на основе XPath.
Лицензия: Apache License, Version 2.0
CyberNeko HTML Parser – простой парсер, позволяет анализировать HTML документы и обрабатывать с помощью XPath.
Лицензия: Apache License, Version 2.0
Расширения для браузеров
Парсеры сайтов выполненные в виде расширений для браузера удобны с точки зрения использования, установка минимальная – нужен всего лишь браузер, захват данных визуальный – не требует программирования.
Scrape.it – расширение для браузера Chrome для сбора данных с сайтов с визуальным Point-Click интерфейсом.
В зависимости от решаемых задач
Мониторинг конкурентов
Сервисы для мониторинга цен позволяют отслеживать динамику цен конкурентов на те же товарные позиции, которые продаете и вы. Далее цены сравниваются и вы можете повышать или понижать стоимость в зависимости от ситуации на рынке. Это позволяет в каждый момент времени предлагать самую выгодную цену на рынке, делая покупку в вашем магазине привлекательнее чем у конкурента, и не упустить прибыль, если конкуренты по какой-то причине подняли цены.
Подобные сервисы часто адаптированы к какому-либо маркетплейсу, для того чтобы получить цены интернет-магазинов, торгующих со своего сайта, нужно настраивать сбор данных самостоятельно или заказывать настройку парсинга индивидуально.
Монетизация подобных сервисов – подписочная модель с тарифной сеткой, ранжирующей количество собираемых цен/конкурентов.
Организация совместных закупок
Подобные сервисы предназначены для организации совестных закупок в социальных сетях. Такие парсеры собирают данные о товарах выгружают их в группы ВКонтакте и Одноклассники, что позволяет автоматизировать процесс наполнения витрины и мониторить ассортимент, остатки и цены на сайтах поставщиков. Как правило, эти парсеры имеют личный кабинет с возможностью управления, настроенные интеграции для сбора данных, систему уведомлений, возможность экспортировать данные и не требуют доработки.
Монетизация – подписка с тарификацией, зависящей от количества сайтов.
Автоматизация интернет-магазинов
Такие сервисы позволяют автоматизировать загрузку товаров (картинки, описания, характеристики) от оптовика, синхронизируют цены и остатки. Это позволяет вести работу по добавлению товара и управлению ценами в полностью автоматизированном режиме и экономить на персонале. В качестве источника может выступать как xml или csv файл, так и сайт, с которого робот забирает информацию.
Парсинг SEO данных и аналитика
Парсеры применяемые для целей поисковой оптимизации помогают собирать мета данные (H1, Title, Description), ключевые слова, составлять семантическое ядро, собирать поведенческие и количественные аналитические данные о конкурентах. Спектр инструментов очень широк по функциональности, рассмотрим популярные сервисы, чтобы вы могли подобрать подходящий.
SiteAnalyzer – парсинг-программа для проверки основных технических и SEO данных сайтов. Главная особенность – программа полностью бесплатна. Работает на локальном компьютере, доступна только для ОС Windows.
Парсеры на основе таблиц
Такие парсеры собирают данные прямо в таблицы excel и google sheets. В основе действия таких парсеров лежат макросы автоматизирующие действия или специальные формулы извлекающие данные с сайтов. Подобные парсеры подходят для несложных задач, когда собираемые данные не защищены и находятся на простых, не динамичных сайтах.
ParserOk – парсинг сайтов на основе vba(макросов) в таблицы Microsoft Excel. Надстройка позволяет импортировать данные с сайтов по заранее созданным шаблонам и относительно проста в настройке. Недостатком является то, что если шаблон не соответствует вашему запросу, то потребуется доработка.
Стоимость лицензии составляет 2700 р., демо версия рассчитана на 10 дней.
Функции google sheets – importhtml и importxml – функции позволяющие импортировать данные прямо в таблицы. При помощи этих функций можно организовать несложный сбор данных по заранее запрограммированным вводным. Знание языка запросов “Xpath” существенно расширит область применения формул.
Настраиваемые решения для парсинга
Подобные сервисы работают “под ключ”, подходят к задаче индивидуально, парсинг пишется под конкретный запрос. Такие решения лучше всего подходят для частных задач бизнеса, например, когда нужно анализировать конкурентов, собирать определенные типы данных и делать это регулярно. Плюсы таких решений в том, что специально разработанное под задачу решение соберет данные даже с хорошо защищенных сайтов или данные, которые требуют интерпретации, например когда цена выводится не текстом, а в виде картинки. Программы и сервисы с самостоятельной настройкой в этих ситуациях не справятся с подобной задачей. Плюс, подобные сервисы не требуют выделять время отдельного сотрудника на сбор данных или переделку парсинга в случае изменения на сайте источнике.
Стоимость работы с индивидуально настроенным парсингом, если у вас несколько разных сайтов и необходимость регулярно получать данные будет выгодней, это не сложно проверить если посчитать стоимость готового решения + стоимость программиста для написания парсинга и его поддержки + стоимость содержания серверов.
Примеры подобных сервисов есть в начале статьи в разделе облачных парсеров, многие из них предлагают настраиваемые решения. Добавим русскоязычный сервис.
iDatica – сервис специализируется на организации парсинга, очистки данных, матчинга и визуализации данных под запрос. iDatica имеет русскоязычную поддержку, опытных специалистов и зарекомендовала себя как надежный партнер для разработки решений сбора и визуализации данных. По запросу команда выделяет аналитика для работы с вашими проектами.
iDatica – сервис специализируется на организации парсинга, очистки данных, матчинга и визуализации данных под запрос
Как правильно выбрать парсер
Для парсинга сложных сайтов с определенной регулярностью обратите внимание на облачные решения. Вам потребуется отдельный сотрудник для ведения этого проекта.
Если задача завязана на увеличение прибыли или даже жизнеспособность проекта стоит обратить внимание на облачный сервис с возможностью программировать или библиотеки для парсинга, выделить отдельного программиста для этой задачи и серверные мощности.
Если нужно получить решение быстро и нужно быть уверенным в качестве результата, стоить выбрать компанию реализующую проект под ключ.