メインコンテンツへスキップ
メインコンテンツへスキップ

Apify を ClickHouse に接続する

Community Maintained

Apify は、Web スクレイピングと自動化のためのプラットフォームです。Actors と呼ばれるサーバーレスのクラウドプログラムを構築、実行し、スケールできます。Actors は、Web サイトのスクレイピング、Web のクロール、データ処理、ワークフローの自動化を行います。Actor を実行するたびに、構造化された出力データが Datasets (JSON オブジェクトのコレクション) に保存されます。

スクレイピングまたは処理したデータを ClickHouse に取り込み、分析、監視、またはエンリッチメント パイプラインに活用します。

主要な概念

Apify の概念内容
ActorApify プラットフォーム上で実行されるサーバーレスのクラウドプログラムです。Apify Store では、すぐに使える Actor が数多く提供されています。
DatasetActor の実行結果です。JSON オブジェクトを表形式で格納したコレクションで、Apify API を介して JSON、CSV、XML などのフォーマットで取得できます。
WebhookActor の実行が成功・失敗したときや、その他のライフサイクルイベントに達したときにトリガーされる、イベント駆動型の HTTP 呼び出しです。Webhook を使用すると、Apify から ClickHouse へのパイプラインを自動化できます。

セットアップガイド

ClickHouse の接続情報を確認する

HTTP(S) で ClickHouse に接続するには、次の情報が必要です。

Parameter(s)Description
HOST and PORT通常、TLS を使用する場合のポートは 8443、TLS を使用しない場合のポートは 8123 です。
DATABASE NAME既定で default という名前のデータベースが用意されています。接続したいデータベースの名前を使用してください。
USERNAME and PASSWORD既定のユーザー名は default です。用途に応じて適切なユーザー名を使用してください。

ClickHouse Cloud サービスに関する詳細情報は、ClickHouse Cloud コンソールで確認できます。 サービスを選択し、Connect をクリックします。

ClickHouse Cloud サービスの Connect ボタン

HTTPS を選択します。接続情報は、サンプルの curl コマンド内に表示されます。

ClickHouse Cloud HTTPS 接続詳細

セルフマネージドの ClickHouse を使用している場合、接続情報は ClickHouse 管理者によって設定されます。

Apify の前提条件

以下も必要です。

依存関係をインストールする

Apify JavaScript クライアントと ClickHouse JavaScript クライアントをインストールします。

npm install apify-client @clickhouse/client
注記

Apify は Python クライアント も提供しています。Python を使用する場合は、apify-client を pip でインストールし、ClickHouse には clickhouse-connect を使用してください。

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);

Apify データセットを取得して ClickHouse に読み込む

次のスクリプトは、Apify Actor の実行結果を取得し、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',
});

// 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();
ヒント

大型データセットの場合は、List dataset items エンドポイントの limit パラメータと offset パラメータを使って結果をページ分割してください。clean=true を指定すると、空でない重複排除済みの項目のみを取得できます。

Webhook で自動化する

スクリプトを手動で実行する代わりに、Actor が完了するたびにデータが ClickHouse に読み込まれるよう、パイプラインを自動化します。

  1. Apify Console で対象の Actor を開き、Integrations タブを選択します。
  2. 次の内容で新しい webhook を追加します。
    • Event type: ACTOR.RUN.SUCCEEDED
    • Action: ローダー エンドポイントへの HTTP POST、または ClickHouse への挿入を処理する別の Actor のトリガー。
  3. webhook のペイロードには defaultDatasetId が含まれており、これを使って実行結果を取得できます。

ペイロードの詳細と設定オプションについては、Apify webhook documentation を参照してください。

別の方法として、Apify Schedules を使用して cron のようなスケジュールで Actor を実行し、読み込みステップに webhook を組み合わせることもできます。

ベストプラクティス

Apify からデータを取得する

生の HTTP リクエストではなく、Apify のクライアントライブラリ (JavaScript 用の apify-client または Python 用) を使用してください。これにより、ページネーション、再試行、認証を自動で処理できます。大型データセットでは、List dataset items エンドポイントの limitoffset パラメータを使用して、結果をページネーションしながら取得してください。

ClickHouse への読み込み

ClickHouse に挿入する際は、JSONEachRow フォーマットを使用してください。変換は不要で、Apify の JSON 出力にそのまま対応します。

ClickHouse テーブルの schema は、Actor の出力フィールドに合わせてください。Actor の出力 schema は、Apify Store ページ、または実行後の Dataset タブで確認できます。

パフォーマンス

JavaScriptクライアントから高い処理量で INSERT を行う場合は、パフォーマンス最適化のヒントに従ってください。1 行ずつ INSERT するのではなく、複数の行をまとめて、より大きな単位で INSERT してください。クライアント側でのバッチ化が現実的でない場合は、非同期 INSERTも検討してください。

セキュリティ

このページの例では、簡潔にするために default ユーザーとデータベースを使用しています。本番環境では、対象テーブルに挿入するために必要な最小限の特権だけを持つ専用ユーザーを作成し、認証情報は安全に保管してください (たとえば、ソースコードにコミットするのではなく、環境変数やシークレットマネージャーに保存します) 。詳細については、クラウドアクセス管理を参照してください。