Как создать Actor в Apify: Полное руководство для начинающих

Что такое Actor в Apify и зачем они нужны?

Actor в Apify — это серверная бессерверная (serverless) микрослужба, предназначенная для выполнения произвольных вычислений в облаке Apify. Чаще всего Actors используются для веб-скрапинга, парсинга данных и автоматизации веб-процессов. Они инкапсулируют логику задачи, ее зависимости и конфигурацию, позволяя легко запускать, масштабировать и делиться решениями.

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

Основные концепции: Input, Output и жизненный цикл Actor

  • Input (Входные данные): JSON-объект, определяющий параметры запуска Actor’а. Позволяет гибко конфигурировать поведение Actor’а без изменения кода (например, указать URL для скрапинга, глубину обхода, прокси-настройки).
  • Output (Выходные данные): Результат работы Actor’а. Обычно это данные, сохраненные в Dataset (структурированные данные, похожие на таблицы), файлы в Key-Value Store (хранилище ключ-значение для сохранения состояния, файлов, скриншотов) или логи выполнения.
  • Жизненный цикл: Actor проходит через стадии инициализации, выполнения основной логики (скрапинг, обработка данных) и завершения. Apify Platform управляет выделением ресурсов, запуском контейнера с кодом Actor’а и его остановкой.

Преимущества использования Actors для веб-скрапинга и автоматизации

  • Масштабируемость: Платформа Apify автоматически масштабирует ресурсы под нагрузку Actor’а.
  • Надежность: Встроенные механизмы для обработки ошибок, повторных попыток (retries) и управления прокси.
  • Serverless: Нет необходимости управлять серверами или инфраструктурой.
  • Переиспользование: Готовые Actors доступны в Apify Store, а свои можно легко опубликовать и использовать в других проектах.
  • Интеграция: Легкая интеграция с другими сервисами через API и вебхуки.

Подготовка к созданию Actor

Установка и настройка Apify CLI

Apify CLI — основной инструмент для локальной разработки, тестирования и развертывания Actors. Установка выполняется через npm:

npm -g install apify-cli

После установки необходимо войти в свою учетную запись Apify:

apify login

Это потребует ваш API ключ.

Создание учетной записи Apify и получение API ключа

Регистрация на платформе Apify (apify.com) проста. После создания учетной записи API ключ можно найти в разделе Settings -> Integrations.

Выбор языка программирования для Actor (Node.js, Python)

Apify официально поддерживает SDK для Node.js (apify npm package) и Python (apify-sdk PyPI package). Выбор зависит от предпочтений разработчика и специфики задачи. Оба SDK предоставляют схожий набор инструментов для взаимодействия с платформой Apify (Dataset, Key-Value Store, Request Queue), управления прокси и обработки ошибок.

Создание Actor: Пошаговая инструкция

Инициализация нового Actor проекта с помощью Apify CLI

Для создания структуры проекта Actor’а используется команда apify create:

apify create my-new-actor

CLI предложит выбрать шаблон (например, ‘Hello world’ на Node.js или Python) и создаст необходимую файловую структуру, включая Dockerfile, файл с исходным кодом (например, main.py или main.js) и конфигурационный файл actor.json (или .actor/actor.json).

Разработка логики Actor: Скрапинг веб-сайта

Основная логика Actor’а размещается в главном файле (например, main.py). Задача — определить шаги для достижения цели, например, загрузить страницу, извлечь нужные элементы, перейти по ссылкам и сохранить результат.

Использование Apify SDK для обработки страниц и извлечения данных

Apify SDK значительно упрощает разработку. Рассмотрим пример на Python с использованием apify-sdk и httpx для запросов, beautifulsoup4 для парсинга HTML.

# main.py
from apify import Actor
from bs4 import BeautifulSoup
import httpx
from typing import Dict, Any, List

async def main():
    """
    Основная асинхронная функция Actor для скрапинга заголовков H1.
    """
    async with Actor:
        # Получение входных данных (Input)
        actor_input: Dict[str, Any] = await Actor.get_input() or {}
        start_url: str = actor_input.get('startUrl', 'https://example.com')

        Actor.log.info(f'Начинаем скрапинг URL: {start_url}')

        scraped_data: List[Dict[str, str]] = []

        try:
            # Асинхронный HTTP запрос с использованием httpx
            async with httpx.AsyncClient() as client:
                response = await client.get(start_url, timeout=30.0, follow_redirects=True)
                response.raise_for_status() # Вызовет исключение для кодов 4xx/5xx

                # Парсинг HTML
                soup = BeautifulSoup(response.text, 'html.parser')

                # Извлечение текста из всех тегов H1
                h1_tags = soup.find_all('h1')
                for tag in h1_tags:
                    title = tag.get_text(strip=True)
                    if title:
                        scraped_data.append({'title': title})
                        Actor.log.info(f'Извлечен заголовок: {title}')

            # Сохранение данных в Dataset Actor'а
            if scraped_data:
                await Actor.push_data(scraped_data)
                Actor.log.info(f'Успешно сохранено {len(scraped_data)} записей в Dataset.')
            else:
                Actor.log.warning(f'На странице {start_url} не найдено тегов H1.')

        except httpx.HTTPStatusError as e:
            Actor.log.error(f'Ошибка HTTP при запросе {start_url}: {e}')
            # Можно добавить логику обработки конкретных ошибок или использовать RequestQueue SDK для автоматических ретраев
        except Exception as e:
            # Логирование непредвиденных ошибок с traceback
            Actor.log.exception(f'Произошла непредвиденная ошибка: {e}')

# SDK автоматически вызывает эту функцию `main`
# Для локального запуска используйте `apify run` в терминале
Реклама

Обработка ошибок и повторные попытки (retry)

Apify SDK (особенно компоненты RequestQueue и Crawler‘ы) предоставляют встроенные механизмы для автоматических повторных попыток при сетевых сбоях или ошибках HTTP (например, 5xx). Для специфичных ошибок приложения необходимо реализовать кастомную логику try...except и, при необходимости, повторно добавлять запросы в очередь или использовать Actor.fail() для обозначения неуспешного выполнения.

Тестирование и отладка Actor

Локальное тестирование Actor перед развертыванием

Используйте Apify CLI для запуска Actor’а в локальном окружении, имитирующем облачную среду Apify:

apify run

Эта команда соберет Docker-образ (если он изменился) и запустит контейнер. Логи будут выводиться в консоль, а данные сохраняться в локальную папку apify_storage.

Для передачи входных данных (Input) можно создать файл .actor/input.json или использовать флаг --input.

Использование Apify Console для отладки

После развертывания Actor’а в Apify Cloud, его выполнение можно отслеживать через веб-интерфейс (Apify Console). В разделе Runs для каждого запуска доступны:

  • Log: Детальные логи выполнения Actor’а.
  • Input: Входные параметры запуска.
  • Dataset: Просмотр и экспорт собранных данных.
  • Key-Value Store: Просмотр сохраненных файлов и значений.

Настройка логирования для мониторинга работы Actor

Используйте встроенный логгер SDK (Actor.log в Python, Actor.log в Node.js) с различными уровнями (info, warning, error, debug, exception). Структурированное логирование помогает быстро находить проблемы как при локальной отладке, так и при анализе логов в Apify Console.

Развертывание и запуск Actor в Apify Cloud

Развертывание Actor с помощью Apify CLI

Когда Actor готов, его код развертывается в Apify Cloud командой:

apify push

Эта команда отправит исходный код и конфигурацию (actor.json) в платформу Apify, создаст или обновит Actor’а и запустит процесс сборки Docker-образа в облаке.

Настройка параметров запуска Actor (memory, timeout)

В Apify Console (в настройках Actor’а или при ручном запуске) или через actor.json можно настроить ресурсы, выделяемые для каждого запуска:

  • Memory: Объем оперативной памяти (например, 4096 MB).
  • Timeout: Максимальное время выполнения Actor’а (например, 3600 секунд).

Правильная настройка ресурсов важна для стабильности и эффективности затрат.

Мониторинг и управление Actor в Apify Console

Apify Console предоставляет полный интерфейс для:

  • Ручного запуска Actor’ов с заданными параметрами Input.
  • Просмотра истории запусков (Runs) и их статусов (Running, Succeeded, Failed, Timed-out).
  • Анализа логов и результатов каждого запуска.
  • Управления версиями Actor’а.

Планирование регулярных запусков Actor

Для автоматизации регулярного выполнения Actor’ов (например, ежедневный сбор данных) используется функционал Schedules. В Apify Console можно создать расписание, указав:

  • Actor для запуска.
  • Частоту выполнения (используется CRON-синтаксис).
  • Входные параметры (Input) для запланированных запусков.
  • Настройки уведомлений о статусе выполнения.

Добавить комментарий