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

Парсинг

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.

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

Использование скрапера для сбора данных из поиска Google

Парсинг

Использование скрапера для сбора данных из поиска Google

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

Команда Froxy 21 ноя 2024 5 мин
Что такое скрапинг на базе ИИ и в чем его главный недостаток

Парсинг

Что такое скрапинг на базе ИИ и в чем его главный недостаток

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

Команда Froxy 31 окт 2024 4 мин