n8n、Bright Data、OpenAIでニュースレターを自動化する

n8n、Bright Data、OpenAIを使ってスマートなニュースレターを自動化する方法をご紹介します。データをスクレイピングし、コンテンツを生成し、パーソナライズされたメールを送信します。
3 分読
Forms + Bright Data + GPT-4o-mini integration on n8n blog image

完全に自動化されたニュースレターを発行できるとしたらどうだろう。n8nBright DataOpenAIは、まさにこれを実現する力を与えてくれる。

今日は、このプロセスが本当に簡単であることをお見せしよう!

はじめに

まずはワークフローにアクセスすることから始めよう(無料で使い始めることができる)。彼の投稿の一番上にある “ワークフローを使う “というボタンをクリックする。プロンプトが表示されたら、必ずn8nのセルフホスト・インスタンスを実行してください。

n8nワークフローを使う

セルフ・ホスティング n8n

sudo snap install docker

dockerを起動し、n8nを立ち上げる。

sudo docker volume create n8n_data
sudo docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

コミュニティ・ノードの設置

さて、いよいよコミュニティ・ノードをいくつかインストールしましょう。設定」から「コミュニティ・ノード」をクリックしてください。

コミュニティ・ノードのインストール

npm “入力ボックスにBright Data nodeを入力します。

n8n-nodes-brightdata

次に、Document Generatorも同じようにします。

n8n-nodes-document-generator
ドキュメント・ジェネレーターの追加

これらのノードをインストールしたら、ctrl+cでDockerインスタンスを終了させる。

その後、再起動する。

sudo docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

コミュニティ・ノードのインストールに関する完全なドキュメントはこちらをご覧ください。

APIキーの取得

ブライトデータ

もしまだなら、Web Unlockerにサインアップする必要がある。このツールは、CAPTCHAバイパスやプロキシ統合など、あらゆる種類のクールなスクレイピング機能を提供している。プレイグラウンドでは、APIキーを取得できる。

Bright Data APIキーの取得

この鍵を持って、安全な場所に保存しておいてください。

オープンAI

OpenAI のダッシュボードから、API Keys タブで新しいキーを表示したり作成したりできます。

OpenAI APIキー

もう一度言うが、鍵は安全な場所に保管すること。

SMTP

SMTPにはElastic Emailを使っている。無料プランでは自分宛にしかメールを送れないが、このチュートリアルではこれで十分だ。

注:SMTP接続を作成する際にエラーに遭遇しました。SSLを無効にすると解決しました。

SSLオフ

SMTPの場合、どのクライアント(Elastic Emailでもその他でも)を使う場合でも、ユーザー名、パスワード、接続の詳細を保存する必要があります。Elastic Emailの場合、ここでこれらの情報を見ることができます。

SMTPクレドを取得する

ワークフローの調整

Web Unlockerでサイトを取得する

ワークフローのBright Dataアイコンを右クリックし、”Open “をクリックします。鉛筆アイコンをクリックして設定を編集します。

ブライトデータの編集

Token」セクションにWeb Unlocker API Keyを追加します。

Web Unlocker API キーを追加する

では、スキーマを調整して、すべてが正しく機能するようにしよう。設定の一番下で、フォーマットが “JSON “に設定されていることを確認する。下の画像では、urlがhttps://www.mediamarkt.de/、これをスクレイピングしたいurlに置き換えてください。ゾーン名をあなたのウェブアンロッカーのゾーン名に置き換えてください。

フォーマットをJSONに設定する

HTMLの抽出

では、HTML抽出が適切に設定されていることを確認しましょう。ソースデータ」が「JSON」に設定されていることを確認してください。抽出値は、以下の画像に表示されているものと一致する必要があります:キー:title, CSSセレクタ:title, 返り値:テキスト。異なるサイトで作業している場合は、ニーズに合わせてこれらのフィールドを調整できますが、ページに本文や タイトルがない場合は、いずれにせよスクレイピングする価値はないでしょう。

HTMLプロパティ

閉じる前に、スクロールダウンして、他のフィールドにもマッチさせてください:キー:body、CSSセレクタ:body、戻り値:テキスト。

その他のHTMLプロパティ

ChatGPTにデータを渡す

ChatGPTはデータを解析してくれます。LLMの力を使えば、パーサーを書く必要すらありません。AIモデルによるスクレイピングについてはこちらをご覧ください。ChatGPTにウェブページを渡すと、きれいな商品リストを吐き出します。

さて、ChatGPT接続の設定です。カテゴリ別の案件リストを生成する」というノードの設定を開きます。Bright Data API キーを追加したのと同じように、OpenAI API キーを追加します。そして以下のフィールドが正しいことを確認してください:Resource:テキストMessage a Model.別のモデルを使用したい場合は、自由に変更してください。

OpenAIの設定

下までスクロールし、残りのフィールドが正しいことを確認する。

OpenAIの設定 その2

ChatGPTから結果を取り出す

次に、「結果から項目を抽出する」というタイトルのノードの設定を開きます。分割するフィールド」がmessage.content.resultsに設定されていることを確認する。

ChatGPT抽出設定

HTMLドキュメントの生成

さて、いよいよHTMLドキュメントの作成です。これが実際のメールを構成する生のHTMLです。ワークフローテストを実行すると、実際にHTMLテンプレートに入力値をドラッグ&ドロップすることができます。Template String “がExpressionに設定されていることを確認してください。

HTML構造を書く

必要であれば、私のHTMLテンプレートを以下からコピー&ペーストしてください。以下のHTMLは必須ではありません。JSONデータを正しく挿入してください。

<h1>{{ $json.name }}</h1>

<p>{{ $json.description }}</p>

<a href={{ $('Generate List of Deals by Category').item.json.message.content.results[0].link }}>
    {{ $('Generate List of Deals by Category').item.json.message.content.results[0].link }}
</a>

<h2>{{ $('Generate List of Deals by Category').item.json.message.content.results[1].name }}</h2>
<ul>
    <li><p>{{ $('Generate List of Deals by Category').item.json.message.content.results[1].description }}</p></li>
    <li>{{ $('Generate List of Deals by Category').item.json.message.content.results[1].price }}</li>
    <li>
        <a href={{ $('Generate List of Deals by Category').item.json.message.content.results[1].link }}>
            {{ $('Generate List of Deals by Category').item.json.message.content.results[1].link }}
        </a>
    </li>
</ul>

<h2>{{ $('Generate List of Deals by Category').item.json.message.content.results[2].name }}</h2>
<ul>
    <li><p>{{ $('Generate List of Deals by Category').item.json.message.content.results[2].description }}</p></li>
    <li>{{ $('Generate List of Deals by Category').item.json.message.content.results[2].price }}</li>
    <li>
        <a href={{ $('Generate List of Deals by Category').item.json.message.content.results[2].link }}>
            {{ $('Generate List of Deals by Category').item.json.message.content.results[2].link }}
        </a>
    </li>
</ul>

<h2>{{ $('Generate List of Deals by Category').item.json.message.content.results[3].name }}</h2>
<ul>
    <li><p>{{ $('Generate List of Deals by Category').item.json.message.content.results[3].description }}</p></li>
    <li>{{ $('Generate List of Deals by Category').item.json.message.content.results[3].price }}</li>
    <li>
        <a href={{ $('Generate List of Deals by Category').item.json.message.content.results[3].link }}>
            {{ $('Generate List of Deals by Category').item.json.message.content.results[3].link }}
        </a>
    </li>
</ul>

<h2>{{ $('Generate List of Deals by Category').item.json.message.content.results[4].name }}</h2>
<ul>
    <li><p>{{ $('Generate List of Deals by Category').item.json.message.content.results[4].description }}</p></li>
    <li>{{ $('Generate List of Deals by Category').item.json.message.content.results[4].price }}</li>
    <li>
        <a href={{ $('Generate List of Deals by Category').item.json.message.content.results[4].link }}>
            {{ $('Generate List of Deals by Category').item.json.message.content.results[4].link }}</a></li>
</ul>

<h2>{{ $('Generate List of Deals by Category').item.json.message.content.results[5].name }}</h2>
<ul>
    <li><p>{{ $('Generate List of Deals by Category').item.json.message.content.results[5].description }}</p></li>
    <li>{{ $('Generate List of Deals by Category').item.json.message.content.results[5].price }}</li>
    <li>
        <a href={{ $('Generate List of Deals by Category').item.json.message.content.results[5].link }}>
            {{ $('Generate List of Deals by Category').item.json.message.content.results[5].link }}
        </a>
    </li>
</ul>

電子メールによるユーザーへの通知

いよいよSMTPサーバーに接続します。まだAPIキーを追加していない場合は、「鉛筆」アイコンをクリックして接続の詳細を編集します。From Email “を送信元のメールに変更します。件名 “はお好きなものに変更してください。Email Format “は必ずHTMLのままにしてください。

電子メール設定

SMTPアカウントに認証情報を追加します。ユーザー、パスワード、ホスト、ポートが必要です。

SMTP認証情報

ユーザーに成功を知らせる

では、すべての完了をユーザーに伝えるページを作りましょう。完了メッセージ」と「完了タイトル」を好きなように変更してください。これらの他のフィールドはすべて同じままにしておいてください–単にプロセスが終了したことをユーザーに知らせるだけなのですから。

完了設定

結果のEメール

すべての設定が終わったので、試してみよう。”ワークフローのテスト “をクリックしてください。このようなポップアップが表示されるはずです。カテゴリーを選択し、お得な情報を受け取るためのメールアドレスを入力します。

エントリーフォーム

お得な情報を入手する」をクリックします。情報を送信すると、ポップアップがこのように表示されます。

記入済みフォーム

最後に、受信トレイをチェックしてください。お得なメールがすぐに表示されない場合は、迷惑メールフォルダを見てみよう。最近のメールサービスのほとんどは、このような大量メールをスパムとしてマークします。メールを見つけたら、開いてお得な情報を見てみましょう!

お得情報 Eメール

結論

n8n、Bright Data、OpenAIにより、スマートでデータドリブンなニュースレターを完全に自動化するツールが揃いました。データ抽出にWeb Unlocker、コンテンツ生成にChatGPT、Eメール配信にSMTPを活用することで、最小限の労力でパーソナライズされたおすすめ案件を作成できます。

しかし、なぜここで止まるのでしょうか?ブライト・データは、自動化をさらに強化するためのデータ・ソリューション・スイートを提供しています:

  • レジデンシャル・プロキシ
  • スクレイピング・ブラウザ
  • スクレイパーAPI
  • データセット

メールマーケティングオートメーションを次のレベルへ。今すぐ無料トライアルに登録して、よりスマートで効率的なワークフローの構築を始めましょう!

クレジットカードは必要ありません

あなたは下記にもご興味がおありかもしれません

web scraping with claude blog image
ウェブデータ

2025年のクロードによるウェブスクレイピング

Pythonを使ってWebスクレイピングを自動化し、構造化データを楽に抽出するClaude AIの使い方を学ぶ。
18 分読
Building AI-Ready Vector Datasets for LLMs blog image
AI

LLMのためのAI対応ベクトルデータセット構築:Bright Data、Google Gemini、Pineconeを使ったガイド

大規模言語モデル(LLM)は、私たちが情報にアクセスし、インテリジェントなアプリケーションを構築する方法を変革しています。LLMの可能性を最大限に引き出すには、特にドメイン固有の知識や独自のデータを使用する場合、高品質で構造化されたベクトルデータセットを作成することが重要です。LLMの性能と精度は、入力データの品質に直接結びついています。準備不足のデータセットは劣悪な結果をもたらす可能性があり、一方、十分にキュレーションされたデータセットはLLMを真のドメイン・エキスパートに変えることができます。 このガイドでは、AIに対応したベクターデータセットを生成するための自動パイプラインの構築方法を順を追って説明する。 課題:LLMのためのデータ収集と準備 LLMは膨大な汎用テキストコーパスで学習されますが、商品関連のクエリへの回答、業界ニュースの分析、顧客フィードバックの解釈など、特定のタスクやドメインに適用すると、不足することがよくあります。LLMを真に役立てるには、ユースケースに合わせた高品質のデータが必要です。 このデータは通常、ウェブ上に分散していたり、複雑なサイト構造の背後に隠されていたり、ボット対策によって保護されていたりする。 当社の自動ワークフローは、データセット作成の最も困難な部分を処理する合理化されたパイプラインでこれを解決します: コア技術の概要 パイプラインを構築する前に、関連するコアテクノロジーと、それぞれがワークフローをどのようにサポートしているかを簡単に見ておこう。 ブライトデータスケーラブルなウェブデータ収集 AIに対応したベクターデータセットを作成するための最初のステップは、関連性のある高品質なソースデータを収集することです。ナレッジベースやドキュメンテーションのような内部システムから得られるものもあるが、大部分は公共のウェブから得られることが多い。 しかし、最近のウェブサイトは、CAPTCHA、IPレート制限、ブラウザフィンガープリントなどの高度なボット対策メカニズムを使用しているため、大規模なスクレイピングは困難である。 Bright Dataは、データ収集の複雑さを抽象化するWeb Unlocker APIでこの課題を解決します。プロキシのローテーション、CAPTCHAの解決、ブラウザのエミュレーションを自動的に処理するため、データへのアクセス方法ではなく、データに集中することができます。 Google Gemini: インテリジェント・コンテンツ・トランスフォーメーション Geminiは、Googleによって開発された強力なマルチモーダルAIモデルのファミリーであり、様々なタイプのコンテンツを理解し処理することに優れている。私たちのデータ抽出パイプラインにおいて、Geminiは3つの重要な機能を果たします: このAIを活用したアプローチは、特に以下のような使用例において、脆弱なCSSセレクタや壊れやすい正規表現に依存する従来の方法よりも大きな利点をもたらす: AIがデータ抽出プロセスにどのような変化をもたらしているかについては、Using AI for Web Scrapingをご覧ください。スクレイピングのワークフローにGeminiを実装するための実践的なチュートリアルをお探しの場合は、包括的なガイドをご覧ください:GeminiによるWebスクレイピングをご覧ください。 文の変形意味埋め込み文の生成 エンベッディングは、高次元空間におけるテキスト(または他のデータタイプ)の密なベクトル表現である。これらのベクトルは意味的な意味を捉え、コサイン類似度やユークリッド距離のようなメトリクスを用いて測定される、類似したテキスト片を近接したベクトルで表現することを可能にする。この特性は、セマンティック検索、クラスタリング、検索拡張生成(RAG)のようなアプリケーションで重要である。 Sentence Transformersライブラリは、高品質の文や段落の埋め込みを生成するための使いやすいインターフェースを提供する。Hugging Face Transformersの上に構築され、意味タスクのために微調整された幅広い事前学習済みモデルをサポートしています。 このエコシステムで最も人気があり、効果的なモデルの1つがオールMiniLM-L6-v2である: より大きなモデルはより微妙なエンベディングを提供するかもしれないが、all-MiniLM-L6-v2は性能、効率、コストの間で非常に優れたバランスを提供する。その384次元ベクトルは ほとんどの実用的なユースケース、特に初期段階の開発やリソースに制約のある環境では、このモデルで十分すぎる。エッジケースにおける精度のわずかな低下は、通常、スピードとスケーラビリティの大幅な向上によって相殺されます。そのため、AIアプリケーションの最初のイテレーションを構築する場合や、控えめなインフラストラクチャでパフォーマンスを最適化する場合は、all-MiniLM-L6-v2を使用することをお勧めします。 Pineconeベクトル埋め込み画像の保存と検索 テキストがベクトル埋め込みデータに変換されると、それを効率的に保存、管理、照会するための専用のデータベースが必要になります。従来のデータベースはこのために設計されていません。ベクトル・データベースは、埋め込みデータの高次元の性質を扱うために特別に設計されており、RAGパイプライン、セマンティック検索、パーソナライゼーション、その他のAI駆動型アプリケーションに不可欠なリアルタイムの類似性検索を可能にします。 Pineconeは、開発者フレンドリーなインターフェイス、低レイテンシの検索パフォーマンス、完全に管理されたインフラストラクチャで知られる人気のベクトルデータベースです。ベクトル検索インフラストラクチャの複雑さを抽象化することで、複雑なベクトルインデックスと検索を効率的に管理します。主なコンポーネントは以下の通りです: Pineconeは2つのデプロイメントアーキテクチャを提供する:ServerlessとPod-Based です。ほとんどのユースケース、特に開始時や動的な負荷に対処する場合は、シンプルさとコスト効率からサーバーレスが推奨されます。 セットアップと前提条件 パイプラインを構築する前に、以下のコンポーネントが適切に設定されていることを確認する。 前提条件 各APIキーの生成方法については、以下のツール固有の設定セクションを参照してください。 必要なライブラリのインストール このプロジェクトのコアとなるPythonライブラリをインストールする: これらのライブラリーは提供している: 環境変数の設定 プロジェクトのルート・ディレクトリに.envファイルを作成し、APIキーを追加する: ブライトデータ設定 Bright DataのWeb Unlockerを使用するには: 実装例と統合コードについては、Web Unlocker GitHub […]
6 分読
AI

LLMにおけるスーパーバイズド・ファインチューニングとは?

このPythonガイドでは、概念、ツール、ワークフロー、そしてAIプロジェクトを向上させる実践的な例を取り上げています。
7 分読