Бессерверный парсинг веб-сайтов на Apache NiFi и OpenFaaS с Selenium

Автор Категория ,
Бессерверный парсинг веб-сайтов на Apache NiFi и OpenFaaS с Selenium

Сегодня разберемся с serverless-технологиями и рассмотрим, как самостоятельно создать и интегрировать бессерверный парсер Selenium с Apache Nifi. Краткий ликбез по OpenFaaS, Selenium и Chromium, а также преимущества serverless-технологий и пример вызова функции сбора данных с веб-страницы на Python.

Введение: serverless, OpenFaaS и Selenium с Chromium

Serverless-стратегия организации платформенных облачных услуг, когда облако автоматически и динамически управляет выделением ресурсов в зависимости от пользовательской нагрузки, сегодня очень востребована. Это связано с популярностью контейнерных технологий (Kubernetes, Docker), которые позволяют предоставлять функцию как услугу. Для выполнения запроса, т.е. при вызове функции создаётся отдельный контейнер или виртуальная машина, которые уничтожаются после выполнения. Пользователям не нужно самостоятельно выделять и настраивать инфраструктуру: все виртуальные машины, контейнеры, сервера баз данных и приложений, а также экземпляры сред выполнения управляются облачным провайдером. Все настройки и планирование вычислительных ресурсов для запуска кода по требованию или по событию скрыты от пользователей. При этом serverless-код может быть частью приложений на традиционной архитектуре, включая микросервисы.

Главным плюсом бессерверной парадигмы является гибкость: их можно вызывать serverless-функции из любого места, включая Apache Nifi. В качестве примера рассмотрим, как разработать бессерверную функцию для удаления содержимого списка URL-адресов с помощью Selenium с Chromium. Напомним, Selenium WebDriver — это популярный инструмент автоматизации действий веб-браузера, который часто используется для тестирования веб-приложений, администрирования сайтов и парсинга данных из различных источников. А Chromium – это open-source проект по созданию легкого и быстрого браузера. Именно на нем основан Google Chrome.

Фреймворк Selenium включает целый набор инструментов, в т.ч. Grid. Selenium Grid позволяет массово собирать данные параллельным способом, выполняя сценарии WebDriver на виртуальных или реальных машинах путем маршрутизации команд, отправляемых клиентом, в удаленные экземпляры браузера. Это упрощает запуск тестов параллельно на нескольких машинах и позволяет централизованно управлять разными версиями браузеров и их конфигурациями.

Хотя Selenium Grid решает подмножество общих проблем делегирования и распределения, он не будет управлять инфраструктурой. Поэтому для вызова serverless-функций из Apache NiFi следует создать собственное решение.

Одним из популярных бессерверных фреймворков является OpenFaaS – проект с открытым исходным кодом. Он упрощает разработчикам развертывание в Kubernetes функций и микросервисов, управляемых событиями, без повторяющегося шаблонного кодирования. Достаточно просто упаковать код или бинарный файл в Docker-образ, чтобы получить хорошо масштабируемую конечную точку с автоматическим масштабированием и метриками. OpenFaaS предоставляет GUI и CLI, легко устанавливается и масштабируется на лету.

Далее рассмотрим, как реализовать вызов serverless-функций по парсингу веб-сайтов из Apache NiFi с OpenFaaS, Selenium и Chromium.

Apache NiFI для инженеров данных

Код курса
NFED
Ближайшая дата курса
27 января, 2022
Длительность обучения
16 ак.часов
Стоимость обучения
40 000 руб.

Бессерверный парсинг с Apache NiFi

Сначала следует создать шаблон OpenFaaS с поддержкой Selenium. Далее нужно создать простой веб-парсер и, наконец, вызвать serverless-функцию из Apache NiFi.

Шаблон OpenFaaS действует как оболочка между HTTP-запросом и функцией обработчика. Когда OpenFaaS создает бессерверную функцию, он генерирует Docker-образ с шаблоном и кодом функции.

faas template pull https://github.com/jmrobles/python3-http-selenium

faas new –lang python3-http-selenium of-scraper

Для упрощения примера serverless-функция будет такой:

  • в качестве аргументов передается список URL-адресов;
  • функция открывает новый сеанс Chrome;
  • для каждого URL-адреса функция пытается получить некоторую базовую информацию с html-страницы – заголовки, текстовое содержимое и изображения;
  • чтобы защитить ресурсы от несанкционированного использования, можно добавить простую аутентификацию на основе общего секрета, передав заголовок «auth-code» для кода авторизации;
  • по завершении работы сеанс Chromium закрывается, возвращая все результаты.

Код самой функции парсинга веб-страниц, написанный на Python приведен в источнике [1].

Обработка одного URL занимает в среднем около 1 минуты. Поэтому нужно настроить таймауты для исполнителя OpenFaaS, движка OpenFaaS и Kubernetes Ingress. YAML-файл для serverless-функции будет отражать следующее:

version: 1.0

provider:

name: openfaas

  gateway: <your-openfaas-gateway-url>

functions:

  of-scrap:

    lang: python3-http-selenium

    handler: ./of-scrap

    image: <your-docker-registry>/of-scraper:latest

    secrets:

      – docker-registry

    build_options:

      – selenium

    environment:

      exec_timeout: “30m”

      read_timeout: “30m” 

      write_timeout: “30m” 

      upstream_timeout: “30m”

Администрирование кластера Apache NiFi

Код курса
NIFI
Ближайшая дата курса
27 января, 2022
Длительность обучения
16 ак.часов
Стоимость обучения
40 000 руб.

Для тайм-аутов в OpenFaaS Engine обновлены значения параметров read_timeout, write_timeout и exec_timeout в переменных среды для «шлюза» пода: контейнеров шлюза и faas-netes. Также нужно добавить аннотации для настройки времени ожидания входа. В случае nginx это будет тайм-аут прокси-соединения, отправки и чтения прокси. Установим время ожидания входа на 1800, равным 30 минут.

Далее следует собрать Docker-образ и выполнить развертывание. О том, как Apache NiFi работает с Docker и Kubernetes мы рассказывали здесь.

$ faas publish –platforms linux/amd64 -f of-scraper.yml

$ faas deploy -f of-scraper.yml

Наконец, необходимо вызвать созданную serverless-функцию из Apache NiFi. Для простого теста добавим следующие три готовых процессора:

  • Generate Flow File, который создает файл потока. Используя атрибут «custom text», можно установить запрос JSON и заголовок.
  • InvokeHTTP – вызов бессерверной функции через HTTP-команду «POST». В параметрах этого блока следует увеличить время ожидания чтения, например, на 10 минут.
  • PutFile, который записывает вывод в файлы и сохраняет их в нужную директорию, например, /tmp/scraped-webs. Проверить это можно, открыв контейнер NiFi и выполнив команду ls/cat для файлов. Также следует связать выходные данные процессора InvokeHTTP с процессором записи этих файлов.
NiFi pipeline, пример Apache NiFi курсы обучение, NiFi для инженеров данных
Конвейер из процессоров в Apache NiFi (кликабельно, нажмите для увеличения)

Освойте все тонкости администрирования и эксплуатации Apache NiFi для эффективной аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://blog.devgenius.io/serverless-web-scraping-with-nifi-and-openfaas-ba7ac675a200
  2. https://docs.openfaas.com/
  3. https://www.selenium.dev/documentation/grid/