Перейти к основному содержимому
Перейти к основному содержимому

Подключите Apify к ClickHouse

Community Maintained

Apify — платформа для веб-скрапинга и автоматизации. В ней можно создавать, запускать и масштабировать бессерверные облачные программы — Actors. Actors собирают данные с сайтов, сканируют веб, обрабатывают данные и автоматизируют рабочие процессы. Каждый запуск Actor создает структурированный результат, который сохраняется в Datasets (коллекциях JSON-объектов).

Загружайте собранные или обработанные данные в ClickHouse для анализа, мониторинга или обогащения данных.

Ключевые понятия

Понятие в ApifyЧто это
ActorБессерверная облачная программа, которая запускается на платформе Apify. В Apify Store доступны тысячи готовых Actor.
DatasetРезультат запуска Actor. Табличная коллекция JSON-объектов, доступная в форматах JSON, CSV, XML и других через Apify API.
WebhookHTTP-вызов, запускаемый по событию, например при успешном завершении Actor, ошибке или наступлении других событий жизненного цикла. Используйте вебхуки, чтобы автоматизировать конвейер Apify-to-ClickHouse.

Руководство по настройке

Подготовьте данные для подключения к ClickHouse

Чтобы подключиться к ClickHouse по HTTP(S) вам потребуется следующая информация:

Параметр(ы)Описание
HOST and PORTTypically, the port is 8443 when using TLS or 8123 when not using TLS.
DATABASE NAMEOut of the box, there is a database named default, use the name of the database that you want to connect to.
USERNAME and PASSWORDOut of the box, the username is default. Use the username appropriate for your use case.

The details for your ClickHouse Cloud service are available in the ClickHouse Cloud console. Select a service and click Connect:

ClickHouse Cloud service connect button

Choose HTTPS. Connection details are displayed in an example curl command.

ClickHouse Cloud HTTPS connection details

If you're using self-managed ClickHouse, the connection details are set by your ClickHouse administrator.

Предварительные требования для Apify

Также вам понадобятся:

Установите зависимости

Установите JavaScript-клиент Apify и JavaScript-клиент ClickHouse:

npm install apify-client @clickhouse/client
Примечание

Apify также предоставляет клиент Python. Если вы предпочитаете Python, установите apify-client через pip и используйте clickhouse-connect для ClickHouse.

Создайте целевую таблицу в ClickHouse

Создайте таблицу для хранения собранных данных. schema зависит от используемого Actor. В этом примере для Actor, собирающего данные о товарах, используется MergeTree:

CREATE TABLE apify_products
(
    url        String,
    title      String,
    price      Float64,
    currency   String,
    scraped_at DateTime DEFAULT now()
)
ENGINE = MergeTree()
ORDER BY (scraped_at, url);

Получите dataset Apify и загрузите его в ClickHouse

Следующий скрипт получает результаты выполнения Actor в Apify и вставляет их в ClickHouse:

import { ApifyClient } from 'apify-client';
import { createClient } from '@clickhouse/client';

// Инициализация клиентов
const apify = new ApifyClient({ token: 'YOUR_APIFY_API_TOKEN' });
const clickhouse = createClient({
    url: 'https://YOUR_CLICKHOUSE_HOST:8443',
    username: 'default',
    password: 'YOUR_CLICKHOUSE_PASSWORD',
    database: 'default',
});

// Получение элементов dataset из последнего запуска Actor
const run = await apify.actor('YOUR_ACTOR_ID').call();
const { items } = await apify.dataset(run.defaultDatasetId).listItems();

console.log(`Fetched ${items.length} items from Apify dataset.`);

// Вставка в ClickHouse
await clickhouse.insert({
    table: 'apify_products',
    values: items,
    format: 'JSONEachRow',
});

console.log(`Inserted ${items.length} rows into ClickHouse.`);
await clickhouse.close();
Совет

Для больших наборов данных используйте постраничную загрузку результатов с помощью параметров limit и offset конечной точки List dataset items. Также можно передать clean=true, чтобы получать только непустые элементы без дубликатов.

Автоматизируйте процесс с помощью вебхуков

Вместо ручного запуска скрипта автоматизируйте пайплайн, чтобы данные загружались в ClickHouse каждый раз после завершения Actor:

  1. В консоли Apify перейдите к нужному Actor и откройте вкладку Integrations.
  2. Добавьте новый вебхук со следующими параметрами:
    • Тип события: ACTOR.RUN.SUCCEEDED
    • Действие: HTTP POST в вашу конечную точку загрузчика или запуск другого Actor, который выполняет вставку в ClickHouse.
  3. Полезная нагрузка вебхука включает defaultDatasetId, который можно использовать для получения результатов запуска.

Подробнее о полезной нагрузке и доступных настройках см. в документации по вебхукам Apify.

В качестве альтернативы можно использовать Apify Schedules для запуска Actor по cron-подобному расписанию в сочетании с вебхуками на этапе загрузки.

Лучшие практики

Получение данных из Apify

Используйте клиентскую библиотеку Apify (apify-client для JavaScript или Python) вместо прямых HTTP-запросов. Она сама обрабатывает пагинацию, повторные попытки и аутентификацию. Для больших наборов данных постранично извлекайте результаты с помощью параметров limit и offset конечной точки List dataset items.

Загрузка в ClickHouse

Используйте формат JSONEachRow при вставке в ClickHouse. Он напрямую соответствует JSON-выводу Apify и не требует преобразования.

Schema таблицы ClickHouse должна соответствовать полям вывода Actor. Проверьте выходную schema Actor на странице Apify Store или на вкладке Dataset после выполнения.

Производительность

Для высоконагруженных вставок из JavaScript-клиента следуйте рекомендациям из раздела Советы по оптимизации производительности. Группируйте строки в более крупные вставки, а не вставляйте их по одной, и рассмотрите асинхронные вставки, если пакетная обработка на стороне клиента непрактична.

Безопасность

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