Вход Регистрация

Парсинг

Golang Scraper: зачем нужен Go и лучшие библиотеки для парсинга

Golang - отличный язык для веб-скраппинга благодаря своей высокой производительности, возможностям параллелизма и богатой экосистеме. В этой статье представлено вводное руководство по веб-скреппингу с помощью Go и лучшие библиотеки Go.

Команда Froxy 2 ноя 2023 6 мин
Golang Scraper: зачем нужен Go и лучшие библиотеки для парсинга

Наиболее популярным языком среди web-разработчиков является Python. И именно поэтому для него мы рассмотрели в первую очередь перечень библиотек и фреймворков, облегчающих разработку собственных web-парсеров: Python-библиотеки для парсинга.

Парсеры и вообще парсинг были и будут ещё долгое время оставаться важным направлением деятельности внутри любого бизнеса. Дело в том, что сканирование данных применяется для разных задач: для анализа конкурентов, для поиска свободных ниш, для создания срезов по рынку, для мониторинга цен и т.п. Подробнее про парсинг.

Но сейчас не об этом, а о наиболее интересной альтернативе для Python – о языке Go (он же Golang).

Введение в Golang

golang

Язык Golang – это кроссплатформенный язык программирования со строгой типизацией, разработанный корпорацией Google для эффективной замены C++ и Си. Последние чаще остальных применяются для написания многопоточных десктопных и серверных приложений, умеющих контролировать память, выделяемую для вычислительных операций.

Вместе с тем, Си и C++ имеют ряд нерешаемых проблем, среди которых долгая компиляция (сборка программы), слабый контроль зависимостей, большое количество подмножеств языков, плохое документирование и пр.

Всё это как раз решается в языке Go. Но это скорее про функции Golang. Зачем конкретно разрабатывался язык, если уже есть C++ и C? Ведь получается ситуация, когда вместо решения конкретной прикладной задачи на рынке просто появляется ещё один язык, который в будущем рискует остаться невостребованным.

Что можно писать на Golang:

  • Сетевые библиотеки и базы данных, требующие многопоточности и высокого быстродействия.
  • Веб-приложения и сервисы, работающие в том числе с микросервисной архитектурой.
  • Производительные мобильные и десктопные приложения.
  • Утилиты и скрипты для обработки данных, включая парсеры.
  • Игры и программы для работы с графикой.
  • Блокчейн-решения.
  • И т.п.

Хотя в каждой нише могут быть свои нюансы и особенности применения Golang.

Язык точно не стоит использовать для создания прототипов (MVP-моделей, когда в первую очередь важна скорость разработки, ведь для Go ещё нет большого числа готовых фреймворков), систем машинного обучения (для этого языка пока нет готовых библиотек под эту задачу), а также для организации определённых API (будет слишком много лишних транзакций).

Язык Go станет лучшим решением для распределённого программирования благодаря встроенным низкоуровневым сетевым библиотекам, поддерживающим работу с параллельными web-запросами.

Почему вам нужен веб-скрапинг (парсинг) на Go?

веб-скрапинг (парсинг) на 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

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

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 часов.
  • Предоставляется веб-интерфейс для формирования заданий на парсинг (утилита для выделения нужных элементов на страницах с помощью указателя мыши).

Заключение

golang парсинг

Выше мы привели только наиболее популярные решения для парсинга данных с web-страниц, написанные на языке программирования Golang.

Google явно постаралась на славу, так как при такой же простоте синтаксиса Go показывает себя заметно быстрее и производительнее в предметных задачам, если сравнивать его с Python.

Тем не менее, из-за меньшей распространённости языка готовых библиотек для него пока не так много, как для Python. Имеющиеся решения не такие мощные, как хотелось бы. Вместе с тем, есть и вполне интересные комплексные решения, как Colly, Ferret, Geziyor или Dataflow kit.

Работа таких программ-парсеров, даже если они написаны на языке Go и работают внутри производительного сервера, всё равно потребует большого пула прокси-адресов. Только через них можно ускорить процесс сбора данных и распараллелить потоки без риска блокировки.

Приобрести качественные резидентные и мобильные прокси с автоматической ротацией можно у Froxy. Мы предоставляем более 8 млн. IP с точным таргетингом (до уровня города и провайдера связи), 200+ локаций, до 1000 портов, полная анонимность, только чистые и валидные адреса, удобный формат выгрузки списков.

Получайте уведомления о новых функциях и обновлениях Froxy

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

Статьи по Теме

В чём разница между Web Crawling и Web Scraping?

Парсинг

В чём разница между Web Crawling и Web Scraping?

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

Команда Froxy 15 июн 2023 5 мин
Python-библиотеки для парсинга

Парсинг

Python-библиотеки для парсинга

Парсинг данных с сайтов конкурентов или даже с собственных сайтов может быть организован несколькими способами: с использованием готовых решений,...

Команда Froxy 12 окт 2023 6 мин