Что такое 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) для запланированных запусков.
- Настройки уведомлений о статусе выполнения.