Наиболее популярным языком среди web-разработчиков является Python. И именно поэтому для него мы рассмотрели в первую очередь перечень библиотек и фреймворков, облегчающих разработку собственных web-парсеров: Python-библиотеки для парсинга.
Парсеры и вообще парсинг были и будут ещё долгое время оставаться важным направлением деятельности внутри любого бизнеса. Дело в том, что сканирование данных применяется для разных задач: для анализа конкурентов, для поиска свободных ниш, для создания срезов по рынку, для мониторинга цен и т.п. Подробнее про парсинг.
Но сейчас не об этом, а о наиболее интересной альтернативе для Python – о языке Go (он же Golang).
Введение в Golang
Язык Golang – это кроссплатформенный язык программирования со строгой типизацией, разработанный корпорацией Google для эффективной замены C++ и Си. Последние чаще остальных применяются для написания многопоточных десктопных и серверных приложений, умеющих контролировать память, выделяемую для вычислительных операций.
Вместе с тем, Си и C++ имеют ряд нерешаемых проблем, среди которых долгая компиляция (сборка программы), слабый контроль зависимостей, большое количество подмножеств языков, плохое документирование и пр.
Всё это как раз решается в языке Go. Но это скорее про функции Golang. Зачем конкретно разрабатывался язык, если уже есть C++ и C? Ведь получается ситуация, когда вместо решения конкретной прикладной задачи на рынке просто появляется ещё один язык, который в будущем рискует остаться невостребованным.
Что можно писать на Golang:
- Сетевые библиотеки и базы данных, требующие многопоточности и высокого быстродействия.
- Веб-приложения и сервисы, работающие в том числе с микросервисной архитектурой.
- Производительные мобильные и десктопные приложения.
- Утилиты и скрипты для обработки данных, включая парсеры.
- Игры и программы для работы с графикой.
- Блокчейн-решения.
- И т.п.
Хотя в каждой нише могут быть свои нюансы и особенности применения Golang.
Язык точно не стоит использовать для создания прототипов (MVP-моделей, когда в первую очередь важна скорость разработки, ведь для Go ещё нет большого числа готовых фреймворков), систем машинного обучения (для этого языка пока нет готовых библиотек под эту задачу), а также для организации определённых API (будет слишком много лишних транзакций).
Язык Go станет лучшим решением для распределённого программирования благодаря встроенным низкоуровневым сетевым библиотекам, поддерживающим работу с параллельными web-запросами.
Почему вам нужен веб-скрапинг (парсинг) на Go?
Как раз благодаря качественной многопоточности и встроенному параллелизму Go идеален для работы с web-сайтами и парсингом.
Более того, стандартный набор библиотек языка уже включает в себя средства для анализа HTML-структур (документов) и HTTP-заголовков.
При желании штатные решения можно расширить и дополнить за счёт внешних библиотек. О них и поговорим ниже.
Но почему парсить нужно на Go, а не на Python? На самом деле оба языка хороши для этой задачи, но у Go есть ряд преимуществ:
- В отдельных случаях Go быстрее Python почти в 40 раз (конкретные тесты для сравнения), а в практических задачах парсинга Go стабильно показывает двукратное преимущество (пример реального кейса).
- Go – компилируемый язык, поэтому ему не нужны виртуальные машины или иная среда для запуска кода.
- Приложения на Go потребляют минимум вычислительных ресурсов (а значит они энергоэффективнее и производительнее). На одном и том же сервере вы сможете больше реализовать на Go, чем на Python.
При этом синтаксис Go такой же простой, как и у Питона, внутри есть специальные решения для очистки от мусора, для тестирования и профилирования, отслеживания состояния гонки, для выявления устаревших конструкций и для автоматического создания документации из комментариев к коду.
Лучшие библиотеки Go для парсинга данных
Ниже список наиболее популярных библиотек, фреймворков и средств автоматизации для языка программирования Go при работе с парсингом (скрейпингом) данных. На всякий случай материал об отличии web-сканирования от web-парсинга.
Colly
Colly (интересный симбиоз слов Collie, как порода собак «колли», и Call, «вызов/запрос») – это крутой фреймворк для ускорения написания программ-парсеров, web-пауков и сканеров любой сложности. Разрабатывается с 2017 года, имеет своё сложившееся комьюнити, распространяется по модели с открытым исходным кодом. Разработчики дополнительно зарабатывают на услугах профессионального сбора данных (на заказ).
Особенности:
- В комплекте уже есть готовая реализация API и средства для анализа DOM-структуры.
- Colly позволяет работать как с синхронным, так и с асинхронным сканированием (включая обработку параллельных запросов).
- Есть здесь и своя система расширений (можно легко нарастить недостающий функционал или написать свой модуль без переделки основной кодовой базы фреймворка).
- Разработчики приводят большое количество примеров готовых реализаций парсеров на базе Colly (их можно взять за основу для доработки под себя или использовать для обучения/понимания принципов работы фреймворка).
- Colly способен обрабатывать более 1 тыс. запросов в секунду на одном ядре процессора.
- Из коробки есть поддержка работы через прокси (ProxyFunc).
- Colly не умеет работать с динамическим контентом (например, задействующим технологии Ajax или JavaScript). Для обеспечения поддержки потребуется автономный headless-браузер (например, через расширение chromedp или Selenium)
Преимущества:
- Простая процедура установки и развёртывания.
- Возможность бесплатного использования в коммерческих целях и проектах.
- Чистый API.
- Высокая скорость работы.
- Возможность управления задержками и параллельными запросами для каждого отдельного домена.
- Автоматическая обработка файлов cookie и сеансов.
- Встроенная система кеширования.
- Конвертация сторонних кодировок в Юникод.
- Поддержка распределённого парсинга данных.
- Средства для анализа файлов robots.txt.
- Система расширений.
- Поддержка Google App Engine.
GoQuery
GoQuery – библиотека для языка Go, обеспечивающая тот же синтаксис при обращении с DOM-структурой, что и jQuery. Естественно, как и прототип, может использоваться не только для написания скриптов и создания интерфейсов, но и для удобного парсинга данных.
GoQuery основана на стандартном пакете net/html Go и на сторонней библиотеке cascadia (нужна для обработки CSS-селекторов).
Особенности:
- Синтаксис GoQuery максимально схож с синтаксисом, используемом в библиотеке jQuery.
- Открытый исходный код и возможность использования в коммерческих целях.
- Поскольку анализатор net/html возвращает узлы, а не полнофункциональное дерево DOM, функции манипулирования состоянием jQuery (такие как height(), css(), detach()) были исключены.
- Предоставляется подробная документация и API.
- Для библиотеки важно, чтобы HTML-документы имели кодировку UTF-8 (для других кодировок потребуется обязательная конвертация).
- GoQuery не умеет работать с динамическим контентом. Потребуется headless-браузер (например, webloop) и парсер JavaScript (например, otto).
Преимущества:
- GoQuery использует ту же лицензию, что и язык Go (распространяется бесплатно).
- Библиотека позволяет работать со структурой web-страниц также удобно, как и в случае с jQuery (а это одна из самых популярных библиотек для web-разработки).
- Значительно уменьшается объём кода при написании парсеров.
- Простая установка и минимум зависимостей.
Ferret
Ferret («Хорёк») – это готовая система для извлечения данных с web-страниц (софт для парсинга). Распространяется ПО с открытыми исходниками, большая часть кода написана на языке Go (альтернативная реализация на Python называется PyFer). Ferret может также использоваться для тестирования пользовательских интерфейсов, формирования баз для процесса машинного обучения, аналитики и подобных задач. Особое внимание разработчики уделяют абстракции данных, она достигается за счёт специального декларативного языка FQL.
Особенности:
- Это не фреймворк, это полноценный парсер, готовый к работе.
- В качестве основного интерфейса используется CLI (командная строка). При желании можно разработать свой вариант web-интерфейса или stand-alone-софта.
- Есть готовая реализация сервера с web-интерфейсом.
- Данные со страниц берутся не за счёт прямого подключения, а по API браузера (CDP-драйвер для Google Chrome). По этой же причине Ferret успешно работает с любым динамическим контентом (с JavaScript-кодом).
- В наличии поддержка прокси, но со своими особенностями, например, при работе через драйвер Chrome нужно запускать новый экземпляр браузера под новый прокси).
Преимущества:
- Открытый исходный код. При желании парсер Ferret можно переделать под свои нужды: дополнить и расширить, что-то ненужное удалить.
- Есть режим прямых HTTP-запросов и возможность интеграции с headless-браузером.
- Браузер и Ferret могут работать внутри виртуальных машин (Docker-контейнеров, для Ferret есть даже готовая контейнеризированная версия).
- Программа полностью готова к работе по назначению.
- Есть готовая серверная реализация + web-интерфейс.
- Максимально подробная документация и мануалы для быстрого старта.
Gocrawly
Gocrawly – легковесный web-краулер (сканер), написанный на языке Go. В зависимостях значатся другие смежные библиотеки: goquery (уже упоминалась выше), purell и robotstxt.go (для соблюдения правил из файла robots.txt).
Особенности:
- Полный контроль над списком web-адресов, которые числятся в очереди на обход (сканирование).
- Синтаксис HTML-документа анализируется с помощью библиотеки goquery (во многом аналогична jQuery).
- Парсер анализирует правила из файлов robots.txt и соблюдает их.
- Можно настроить логику ведения журнала действий.
- Поддержка параллельных запросов (на базе горутин, представленных в языке Go).
- Краулер Gocrawly не умеет работать с JavaScript-страницами/сайтами. Возможен только прямой парсинг HTML.
Преимущества:
- Минималистичный web-сканер. Простой синтаксис и продуманная структура фреймворка.
- На базе Gocrawly можно построить полноценную индексную систему со своим кешированием.
- Поддерживается параллельное сканирование большого количества хостов. Все потоки будут работать независимо друг от друга.
- Метод Crawler.Run() можно расширить и дополнить необходимыми функциями.
- Если не установить максимальное количество посещений для web-ресурса, то сканер остановится только тогда, когда обойдёт все его URL-адреса (поэтому не забудьте ограничить сканирование хотя бы одним доменом).
Soup
Soup – это web-парсер, реализованный по аналогии с парсером BeautifulSoup, написанным на Python. Пока это небольшой проект (если сравнивать с тем же BeautifulSoup), который ведёт всего один разработчик из Индии – Анас Хан.
Особенности:
- Проект максимально простой и лёгкий (пока ему ещё далеко до прототипа на Python).
- Тем не менее библиотека Soup вполне может использоваться для парсинга (анализа структуры) HTML-страниц.
- По аналогии с BeautifulSoup используются методы Find и FindAll.
- В отличие от BeautifulSoup библиотека не поддерживает XPath и выбор селекторов CSS.
Преимущества:
- С помощью Soup можно существенно ускорить процедуру разработки собственного парсера.
- Минимум кода и привычные методы (для тех, кто раньше программировал на Python).
- В доступе достаточное количество примеров использования и настройки.
- Поддерживается работа с cookies и HTTP-заголовками.
Hakrawler
Hakrawler – это ещё один миниатюрный web-парсер, написанный на Golang. Автор позиционирует библиотеку, как более простую реализацию Gocolly для сбора URL-адресов и местоположений JavaScript-файлов.
Особенности:
- Полностью готовый к работе краулер.
- Очень простой синтаксис командной строки.
- Поддержка работы через прокси.
- Многопоточное сканирование.
- Работа с HTTPS-версиями сайтов (с TLS/SSL-сертификатами шифрования).
- Hakrawler не умеет парсить динамический контент.
- Нельзя сохранить какой-то определённый контент со страницы (фактически сохраняются только найденные URL-адреса).
Преимущества:
- Поддерживается работа с Docker-контейнерами.
- Hakrawler представлен в репозитории Kali Linux (можно установить с помощью консольной команды apt).
- Данные выгружаются в JSON-формате (легко конвертировать в любой другой табличный формат).
- Можно ограничить число параллельных потоков сканирования.
Geziyor
Geziyor – это максимально быстрая платформа web-парсинга с широким ассортиментом встроенных функций. В отличие от большинства конкурентов, Geziyor поддерживает JS (умеет парсить динамический контент, загружаемый с помощью JavaScript и Ajax).
Особенности:
- Своя система кэширования (на диск, в оперативную память, в специальную базу данных).
- Встроенные метрики для оценки качества работы.
- Автоматическая конвертация ответа сервера в UTF-8.
- Обработка файлов cookies и robots.txt.
- Для рендеринга JavaScript нужен установленный браузер Chrome (chromedp/Chrome DevTools Protocol).
Преимущества:
- Высокая производительность – свыше 5000 запросов в секунду.
- Полноценный рендеринг JS-кода.
- Тонкие настройки параллелизма (по домену или глобально).
- Возможность настройки задержек (случайно или с постоянным значением).
- Внятное управление списками прокси – на основе кастомной логики (плюс, прокси можно установить глобально для всех запросов). Принимаются HTTP, HTTPS и SOCKS5.
- Поддержка разных форматов выгрузки данных (свой формат, JSON, CSV).
Dataflow kit (DFK)
Dataflow kit – это web-парсер с графическим интерфейсом, работающий по принципу «наведи и щёлкни». DFK позволяет извлекать данные с любых сайтов и web-страниц, достаточно открыть страницу и указать мышкой элемент, из которого нужно спарсить информацию.
Особенности:
- Конвейер скрейпера Dataflow kit состоит из трёх компонентов: сервис получения данных (отвечает за загрузку web-страницы), сервис анализа (слой синтаксического анализа HTML-кода) и система экспорта (для сохранения данных в нужном формате).
- Если контент страницы невозможно распарсить штатными средствами, то подключается система обработки JavaScript (через API/драйвер браузера Google Chrome).
- Уже в задаче на парсинг сразу же определяется структура будущей таблицы данных.
- Dataflow kit – это готовый к работе программный комплекс. Для максимальной эффективности его следует загружать внутри среды виртуализации (рекомендуется Docker).
Преимущества:
- Поддержка парсинга страниц с динамическим контентом (JavaScript).
- Работа со страницами, имеющими бесконечный скроллинг.
- Возможность авторизации на сайтах, защищёнными формами входа.
- Обработка cookies и сессий.
- Обход всех найденных ссылок.
- Поддержка работы через прокси.
- Разные форматы экспорта данных (JSON, CSV, XLS, XML). Промежуточные данные хранятся в базах DiskV или MongoDB.
- Dataflow kit эффективен при работе с большим количеством страниц и параллельных потоков – до 4 млн. URL за 7 часов.
- Предоставляется веб-интерфейс для формирования заданий на парсинг (утилита для выделения нужных элементов на страницах с помощью указателя мыши).
Заключение
Выше мы привели только наиболее популярные решения для парсинга данных с web-страниц, написанные на языке программирования Golang.
Google явно постаралась на славу, так как при такой же простоте синтаксиса Go показывает себя заметно быстрее и производительнее в предметных задачам, если сравнивать его с Python.
Тем не менее, из-за меньшей распространённости языка готовых библиотек для него пока не так много, как для Python. Имеющиеся решения не такие мощные, как хотелось бы. Вместе с тем, есть и вполне интересные комплексные решения, как Colly, Ferret, Geziyor или Dataflow kit.
Работа таких программ-парсеров, даже если они написаны на языке Go и работают внутри производительного сервера, всё равно потребует большого пула прокси-адресов. Только через них можно ускорить процесс сбора данных и распараллелить потоки без риска блокировки.
Приобрести качественные резидентные и мобильные прокси с автоматической ротацией можно у Froxy. Мы предоставляем более 8 млн. IP с точным таргетингом (до уровня города и провайдера связи), 200+ локаций, до 1000 портов, полная анонимность, только чистые и валидные адреса, удобный формат выгрузки списков.