Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Apify を ClickHouse に接続する

コミュニティ管理

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

スクレイピングまたは処理したデータを ClickHouse に取り込み、分析、監視、または enrichment パイプラインに活用できます。

主要な概念

Apify の概念 概要
Actor Apify プラットフォーム上で実行されるサーバーレスのクラウドプログラムです。Apify Store では、何千もの既製の Actor を利用できます。
Dataset Actor の実行結果です。JSON オブジェクトを表形式でまとめたもので、Apify API を通じて JSON、CSV、XML などのフォーマットで取得できます。
Webhook Actor の実行が成功したとき、失敗したとき、またはそのほかのライフサイクルイベントが発生したときにトリガーされる、イベント駆動型の 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 サービスの接続ボタン

HTTPS を選択します。接続情報は curl コマンドの例として表示されます。

ClickHouse Cloud HTTPS 接続情報

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

Apify の前提条件

あわせて、以下が必要です。

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

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

npm install apify-client @clickhouse/client

ClickHouse にターゲットテーブルを作成する

スクレイピングしたデータを格納するテーブルを作成します。スキーマは使用する 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 Dataset を取得して 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 の直近の実行から Dataset 項目を取得
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();

webhook で自動化する

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

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

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

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

ベストプラクティス

Apify からデータを取得する

HTTP を直接呼び出す代わりに、Apify のクライアントライブラリ (JavaScript 用の apify-client または Python) を使用してください。ページネーション、再試行、認証を自動で処理してくれます。大規模な Dataset では、List dataset items エンドポイントの limit パラメータと offset パラメータを使って、結果をページ分割しながら取得してください。

ClickHouse へのロード

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

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

パフォーマンス

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

セキュリティ

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

Navigation