Apify est une plateforme de web scraping et d’automatisation. Vous créez, exécutez et faites évoluer des programmes serverless dans le cloud appelés Actors. Les Actors extraient des données de sites web, parcourent le web, traitent des données ou automatisent des workflows. Chaque exécution d’un Actor produit une sortie structurée stockée dans des Datasets (collections d’objets JSON).
Chargez les données extraites ou traitées dans ClickHouse pour des pipelines d’analyse, de monitoring ou d’enrichissement.
Concepts clés
| Concept Apify | Ce que c’est |
|---|---|
| Actor | Un programme serverless dans le cloud qui s’exécute sur la plateforme Apify. Des milliers d’Actors prêts à l’emploi sont disponibles dans l’Apify Store. |
| Dataset | Le résultat d’une exécution d’Actor. Une collection d’objets JSON structurée comme une table, récupérable en JSON, CSV, XML ou dans d’autres formats via l’API Apify. |
| Webhook | Un appel HTTP déclenché par un événement lorsqu’une exécution d’Actor réussit, échoue ou atteint d’autres étapes de son cycle de vie. Utilisez les webhooks pour automatiser le pipeline d’Apify vers ClickHouse. |
Guide de configuration
Rassemblez vos informations de connexion ClickHouse
Pour vous connecter à ClickHouse via HTTP(S), vous avez besoin des informations suivantes :
| Paramètre(s) | Description |
|---|---|
HOST and PORT |
En général, le port est 8443 lors de l’utilisation de TLS, ou 8123 sans TLS. |
DATABASE NAME |
Par défaut, une base de données nommée default est disponible ; utilisez le nom de la base de données à laquelle vous voulez vous connecter. |
USERNAME and PASSWORD |
Par défaut, le nom d’utilisateur est default. Utilisez le nom d’utilisateur adapté à votre cas d’usage. |
Les informations de votre service ClickHouse Cloud sont disponibles dans la console ClickHouse Cloud. Sélectionnez un service, puis cliquez sur Connect :

Choisissez HTTPS. Les détails de connexion s’affichent dans un exemple de commande curl.

Si vous utilisez ClickHouse autogéré, les détails de connexion sont définis par votre administrateur ClickHouse.
Prérequis Apify
Vous aurez également besoin de :
- Un compte Apify (offre gratuite disponible).
- Un jeton API Apify, disponible dans Settings > Integrations de la Console Apify.
- Node.js 18+ installé localement (pour les exemples JavaScript).
Installer les dépendances
Installez le client JavaScript Apify et le client JavaScript ClickHouse :
npm install apify-client @clickhouse/clientCréer une table cible dans ClickHouse
Créez une table pour stocker les données extraites. Le schéma dépend de l’Actor que vous utilisez. Cet exemple utilise MergeTree pour un Actor de scraping de produits :
CREATE TABLE apify_products
(
url String,
title String,
price Float64,
currency String,
scraped_at DateTime DEFAULT now()
)
ENGINE = MergeTree()
ORDER BY (scraped_at, url);Récupérer le dataset Apify et le charger dans ClickHouse
Le script suivant récupère les résultats d’une exécution d’Actor Apify et les insère dans ClickHouse :
import { ApifyClient } from 'apify-client';
import { createClient } from '@clickhouse/client';
// Initialiser les clients
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',
});
// Récupérer les éléments du dataset de la dernière exécution d'un 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.`);
// Insérer dans ClickHouse
await clickhouse.insert({
table: 'apify_products',
values: items,
format: 'JSONEachRow',
});
console.log(`Inserted ${items.length} rows into ClickHouse.`);
await clickhouse.close();Automatiser avec des webhooks
Au lieu d’exécuter le script manuellement, automatisez le pipeline afin que les données soient chargées dans ClickHouse à chaque fin d’exécution d’un Actor :
- Dans la Console Apify, accédez à votre Actor et ouvrez l’onglet Integrations.
- Ajoutez un nouveau webhook avec :
- Event type:
ACTOR.RUN.SUCCEEDED - Action: une requête HTTP POST vers votre point de terminaison de chargement, ou le déclenchement d’un autre Actor chargé de l’insertion dans ClickHouse.
- Event type:
- Le payload du webhook inclut
defaultDatasetId, que vous pouvez utiliser pour récupérer les résultats de l’exécution.
Consultez la documentation des webhooks Apify pour plus de détails sur le payload et les options de configuration.
Une autre approche consiste à utiliser les Apify Schedules pour exécuter des Actors selon une planification de type cron, combinée à des webhooks pour l’étape de chargement.
Bonnes pratiques
Récupération de données depuis Apify
Utilisez la bibliothèque client Apify (apify-client pour JavaScript ou Python) plutôt que des appels HTTP directs. Elle gère pour vous la pagination, les tentatives de nouvelle exécution et l'authentification. Pour les datasets volumineux, parcourez les résultats avec pagination à l'aide des paramètres limit et offset de l'endpoint List dataset items.
Chargement dans ClickHouse
Utilisez le format JSONEachRow pour insérer des données dans ClickHouse. Il correspond directement à la sortie JSON d'Apify, sans nécessiter de transformation.
Faites correspondre le schéma de votre table ClickHouse aux champs de sortie de l'Actor. Vérifiez le schéma de sortie de l'Actor sur sa page Apify Store ou dans l'onglet Dataset après l'exécution.
Performances
Pour des insertions à haut débit depuis le client JavaScript, consultez les conseils d'optimisation des performances. Regroupez les lignes dans des insertions de plus grande taille plutôt que d'insérer une ligne à la fois, et envisagez les insertions asynchrones lorsque le batching côté client n'est pas pratique.
Sécurité
Les exemples de cette page utilisent l’utilisateur et la base de données default pour faire simple. En production, créez un utilisateur dédié avec le minimum de privilèges nécessaires pour insérer dans votre table cible, et stockez les identifiants de manière sécurisée (par exemple, dans des variables d’environnement ou un gestionnaire de secrets, plutôt que de les versionner dans le code source). Consultez la gestion des accès Cloud pour plus d’informations.