このチュートリアルでは、以下の内容を解説します:
- 顧客識別のための完全なステップバイステップのワークフロー。
- Bright DataのFilter APIを使用して、ニーズに特化したCrunchbaseデータセットを生成する方法。
- Bright Data APIとAIを活用したデータエンリッチメントと分析により、顧客開拓のためにデータセットを処理する方法。
さっそく始めましょう!
新規顧客識別ワークフローの紹介

大まかに言えば、AI活用の顧客開拓ワークフローは3つの主要ステップで構築できます:
- ソースデータのフィルタリング:Crunchbaseデータセットから始め、独自のニーズに合わせてフィルタリングします。
- 企業ウェブサイトのスクレイピング:データセット内の各企業のホームページコンテンツを取得します。
- AIスコアリング:AIを活用して、ウェブサイトコンテンツ(および企業レコードの他のフィールド)に基づいて各企業を評価し、製品やサービスに合わせた顧客開拓スコアを生成します。
出力結果は、各Crunchbase企業レコードに顧客開拓スコアやその他の追加情報を含む列が加わったエンリッチされたデータセットになります。その後、結果のデータセットをフィルタリングするか、スコアで並べ替えて、最初に連絡すべき企業を特定できます。
各ステップの詳細と実装方法をご覧ください!
1. ソースデータのフィルタリング
このワークフローの理想的なソースは、企業情報を含むデータセットです。Bright Dataは最高の企業データプロバイダーであり、LinkedIn、Crunchbase、Indeedなど多くのプラットフォームをカバーする豊富なデータセットを提供しています。
顧客開拓において、Crunchbaseは特に有用です。CB Rank、Heat Scoreなどの専門的なフィールドがあり、業界における企業の影響力を素早く評価できるためです。
Bright Dataは430万件以上のレコードを持つCrunchbaseデータセットを提供しています。このような大規模なデータセットを直接扱うのは困難なため、Filter APIを使用して特定の条件に合う企業に絞り込むことができます。たとえば、特定の従業員数範囲内で現在活動中の企業など、関連する条件を指定できます。
2. 企業ウェブサイトのスクレイピング
フィルタリングされたCrunchbaseデータセットのデータフィールドは確かに興味深いものです。しかし、それだけでは正確な顧客識別には十分ではないことが多いです。企業を適切に評価するには、そのウェブサイトを分析することが最善のアプローチの一つです。これにより、企業が何をしているか、あなたのサービスから恩恵を受けられるかどうかが分かります。
各企業のウェブサイトからコンテンツをプログラム的に取得するのは困難です。なぜなら、各サイトは構造が異なり、IPバン、ジオロケーション制限、CAPTCHAなどのボット対策で保護されている場合があるからです。また、JavaScriptのレンダリングが必要なサイトもあります。
これらの課題を一貫して対処し、LLM分析に最適化された形式でウェブサイトコンテンツを取得するには、Bright DataのWeb Unlocker APIを活用するのが最善策です。このエンドポイントを使えば、どれほど保護されていても任意のウェブサイトをスクレイピングできます。
3. AIスコアリング
最後に、フィルタリングされたCrunchbaseデータセットに各企業のウェブサイトコンテンツが付加されたら、各レコードをAIに渡します。サービスや製品の説明を提供し、各企業があなたのオファリングに適しているかどうかをAIにスコアリングさせます。
Bright DataのFilter APIを使ってニーズに合ったCrunchbaseデータセットを取得する
AI活用の顧客開拓ワークフローをソースデータの取得から始めましょう。これは、見込み客の仮説に関連する条件に合う企業を含む、フィルタリングされたCrunchbaseデータセットになります。
この最初のステップにより、重要なデータのみを扱うことができ、はるかに大きなデータセットを処理するよりも時間とコストを節約できます。これからご覧いただくように、Bright Dataはその高度なフィルタリング機能、特にFilter APIを通じて真価を発揮します。
以下の手順に従って、カスタマイズされたCrunchbaseデータセットを取得しましょう!
前提条件
このセクションを進めるには、以下が必要です:
- APIキーが設定されたBright Dataアカウント。
requestsがインストールされたローカルのPython環境。- Bright Dataのデータセットとスナップショット生成の仕組みに関する基本的な理解。
Bright Data APIキーを設定するには、公式ガイドを参照してください。
ステップ #1: Crunchbaseデータセットをフィルタリングする
Bright Dataアカウントにログインします。コントロールパネルで「Web Datasets」ページに移動し、「Dataset Marketplace」タブを選択します。「Dataset Marketplace」ページで「crunchbase」を検索し、「Crunchbase companies information」データセットを選択します:
「Crunchbase companies information」データセットページにリダイレクトされます。そこで、左側の「Filters」ボタンをクリックすることで、コントロールパネルで直接データフィルタリングを適用できます:
具体的には、125以上のデータフィールドそれぞれに対して1つ以上のフィルターを追加できます。フィルターを適用して、430万件の企業エントリーの中から潜在的に良い顧客を特定しやすくしましょう。
たとえば、以下の条件に合う企業を探したいとします:
- 北米またはヨーロッパに所在する。
- 事業を営んでいる。
- AI業界で活動している。
- CB Rankが10,000以下である。
- 従業員数が250人未満である。
websiteフィールドが入力されている。- heat scoreが60以下である。

注意:フィルターを手動で追加したくない場合は、「Filter with AI」ボタンをクリックし、必要なデータを平易な英語のプロンプトで説明してください。
「Apply Filter」ボタンを押して、フィルタリングに時間がかかる場合があるのでしばらくお待ちください。Bright Dataは最初の30件のレコードのプレビューを表示し、フィルターが期待通りであることを確認できます。
フィルタリングされたデータセットのレコード総数も表示されます:
この例では、430万件のレコードから1,300件の見込み顧客が得られました。これが大規模な初期データセットから必要なデータを正確に抽出するBright Dataのフィルタリング機能の力です。素晴らしい!
ステップ #2: Filter APIを呼び出す
次に、2つの選択肢があります:「Proceed to purchase」をクリックしてデータセットを直接ダウンロードするか、Filter APIを使用してプログラム的に生成するかです。Filter API(Bright DataのDataset APIの一部)を呼び出すと再現性と制御性が高まるため、このアプローチを採用します。
フィルターモーダルで「Dataset API」ボタンをクリックします。これにより、選択したフィルターが適用された状態でFilter APIを呼び出すために必要なコードが表示されます。「Python」オプションを選択してPythonスニペットを取得します:
次のようなPythonスニペットが表示されます:
print('If you get "ImportError: No module named 'requests'", install requests: sudo pip install requests');
import requests
def filter_dataset():
url = "https://api.brightdata.com/datasets/filter"
headers = {
"Authorization": "Bearer API_TOKEN",
"Content-Type": "application/json"
}
payload = {
"dataset_id": "gd_l1vijqt9jfj7olije",
"filter": {"operator":"and","filters":[{"name":"region","value":["NA","EU"],"operator":"in"},{"name":"operating_status","value":"active","operator":"="},{"name":"industries:value","value":"Artificial Intelligence (AI)","operator":"includes"},{"name":"cb_rank","value":10000,"operator":"<="},{"name":"num_employees","value":["1-10","11-50","101-250"],"operator":"in"},{"name":"website","operator":"is_not_null"},{"name":"heat_score","value":60,"operator":">="}]}
}
response = requests.post(url, headers=headers, json=payload)
if response.ok:
print("Request succeeded:", response.json())
else:
print("Request failed:", response.text)
filter_dataset()
API_TOKENプレースホルダーをBright Data APIキーに置き換え、スクリプトをローカルに保存してPython環境で実行します。
すべてが正常に動作すれば、次のような出力が表示されます:
Request succeeded: {'snapshot_id': 'snap_XXXXXXXXXXXXXXXXXXX'}
これは、新しいデータセットスナップショットを生成するタスクが開始されたことを意味します。
この時点で、以下のどちらかを選択できます:
- Dataset APIを使ってステータスを確認してダウンロードする、または
- コントロールパネルから手動でダウンロードする(次のステップで行います!)
ステップ #3: フィルタリングされたデータを取得する
スナップショット生成タスクが完了すると、スナップショットの準備ができたことを通知するメールが届きます:
メール内のURLをクリックすると、Bright Dataコントロールパネルのスナップショットページに移動します:
ここでは、フィルタリングされたデータセットを探索したり、ダウンロードしたり、追加の詳細にアクセスしたりするオプションがあります。たとえば、レコード数や合計コストなどのインサイトを含むレポートをダウンロードできます。この例では、$3.29を費やして1,313件のレコードを取得したことがレポートに表示されます(注意:価格は1,000レコードあたり$2.50です):

スナップショットを取得するには、「Download」アイコンをクリックして「CSV」オプションを選択します:
ブラウザがフィルタリングされたCrunchbaseデータを含むsnap_XXXXXXXXXXXXXXXXXXX.csvというファイルをダウンロードします。完璧です!
ステップ #4: フィルタリングされたデータセットを探索する
snap_XXXXXXXXXXXXXXXXXXX.csvファイルを開くと、次のような内容が表示されます:
ダウンロードされたデータセットには、指定したフィルターに一致する1,313件のCrunchbase企業エントリー(それぞれ133列)が含まれていることに注目してください。
ミッション完了!AIによるデータ変換とエンリッチメントを通じて顧客開拓を行うためのソースデータが揃いました。
注意:先に進む前に、データセットを確認し、「Crunchbase Data Analysis for Client Prospecting」Kaggleノートブックで示されているように、コンテンツをさらに絞り込むための追加フィルタリングステップの適用を検討してください。
カスタマイズされたCrunchbaseデータセットからAIで新規顧客を開拓する方法
フィルタリングされたCrunchbaseデータセットは、データ処理とエンリッチメントワークフローのソースとして機能します。各行に対して、このプロセスは以下を実行します:
- 企業のウェブサイトにアクセスし、Web Unlocker APIを使用してMarkdown形式でコンテンツを取得する。
- 企業のコンテンツをAIモデルに渡し、企業が何をしているかを理解させ、あなたのビジネスにとってどれほど良い潜在顧客であるかを示すスコアを提供させる。
実装方法を見てみましょう!
前提条件
このセクションを進めるには、前述の前提条件に加えて、以下が必要です:
- Bright Dataアカウントに設定されたWeb Unlocker APIゾーン(例:
web_unlocker)。 - Web Unlocker APIの動作とサポートする機能に関する知識。
- OpenAI APIキー。
Web Unlockerゾーンを作成するには、Bright Dataドキュメントの「Create Your First Unlocker API」ガイドをお読みください。以下では、Web UnlockerゾーンはWebUnlockerという名前であると仮定します。
シンプルさとチュートリアルを簡潔に保つために、ローカルのJupyter Notebook環境がすでに準備されていることを前提とします。
ステップ #1: ソースのフィルタリングされたデータセットをノートブックにアップロードする
Jupyter Notebookを起動し、新しいノートブックを作成します(例:client_prospecting.ipynbという名前にします)。次に、snap_XXXXXXXXXXXXXXXXXXX.csvファイルをアップロードします:
このファイルは、AI活用の顧客開拓ワークフローのソースデータとして使用されます。よくできました!
ステップ #2: 必要なライブラリをインストールする
データエンリッチメントのロジックに入る前に、このワークフローに必要な依存関係をインストールします。以下を含むセルを追加します:
!pip install pandas requests pydantic openai
これにより、以下のライブラリがインストールされます:
pandas:CrunchbaseデータのソースCSVを読み込み、DataFrameとして操作するため。requests:企業のホームページをダウンロードするためにBright DataのWeb Unlocker APIに接続するため。pydantic:OpenAIタスクの構造化された出力を定義するため。openai:顧客開拓のためにホームページをランク付けするOpenAIモデルと対話するため。
「▶」ボタンを押してセルを実行し、これらのライブラリをインストールします。これで、フィルタリングされたCrunchbaseデータセットから始まるAI活用の顧客開拓に必要なすべての依存関係がノートブックに揃いました。
ステップ #3: 初期セルを設定する
インポート、シークレット、定数がコード全体に散らばらないように、次のようにノートブックの最初のセルにまとめます:
import os
import pandas as pd
import requests
import datetime
import concurrent.futures
from typing import Optional
from pydantic import BaseModel, Field
from openai import OpenAI
# Secrets to connect to third-party services (replace them with the actual values)
BRIGHT_DATA_API_KEY="<YOUR_BRIGHT_DATA_API_KEY>"
OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"
# Define the required constants
SOURCE_CSV_PATH = "snap_XXXXXXXXXXXXXXXXXXX.csv"
ENRICHED_CSV_PATH = "crunchbase_analyzed_companies.csv"
# Initialize the OpenAI client
openai_client = OpenAI(api_key=OPENAI_API_KEY)
以下を確認してください:
<YOUR_BRIGHT_DATA_API_KEY>をBright Data APIキーに置き換える。<YOUR_OPENAI_API_KEY>をOpenAI APIキーに置き換える。- ソースファイル名(
SOURCE_CSV_PATH)とエンリッチされたファイルパス(ENRICHED_CSV_PATH)を必要に応じて更新する。
ENRICHED_CSV_PATHは、エンリッチされたデータが保存される出力ファイルパスを定義することに注意してください。
これで、始めるためのすべての基盤が整いました。
ステップ #4: データセットを読み込む
新しいセルに、ソースデータセットをDataFrameに読み込み、主な情報を表示するロジックを追加します:
# Load the CSV file containing the filtered Crunchbase dataset
df = pd.read_csv(SOURCE_CSV_PATH, keep_default_na=False)
# Print the basic info about the dataset
df.info()
# Print the first rows
df.head()
注意:keep_default_na=Falseオプションは必須です。そうしないと、"NA"を含むregion列がpandasによってデフォルトでNaNとして解釈されてしまいます。
セルを実行すると、次のような出力が表示されます:
DataFrameがフィルタリングされたCrunchbaseデータセットから1,313件のエントリーをそれぞれ133列で格納していることに注目してください。素晴らしい!
ステップ #5: ウェブサイトスクレイピングのための関数を定義する
次に、Web Unlocker APIを呼び出して企業のウェブサイトをスクレイピングする関数を定義します:
def fetch_website(url, zone = "web_unlocker"):
headers = {
"Authorization": f"Bearer {BRIGHT_DATA_API_KEY}",
"Content-Type": "application/json"
}
data = {
"zone": zone,
"url": url,
"format": "raw", # Get the response directly in the body
"data_format": "markdown" # Get the webpage in Markdown format (ideal for LLM ingestion)
}
api_url = "https://api.brightdata.com/request"
try:
response = requests.post(api_url, json=data, headers=headers)
# Raise an error if the response is 4xx/5xx
response.raise_for_status()
return response.text
except requests.RequestException as e:
print(f"Error fetching '{url}' via Web Unlocker API: {e}")
return None
Web Unlocker APIの動作について詳しくない場合は、公式ドキュメントを参照してください。
fetch_website()関数は、指定されたURLでBright DataのWeb Unlocker APIゾーン("web_unlocker"を自分のゾーン名に置き換えてください)を呼び出します。data_format: "markdown"パラメータにより、レスポンスはウェブサイトのAI対応のMarkdown版になります。そのデータ形式はLLMの取り込みに最適であり、まさに次のステップで行うことです。
この関数は各企業エントリーに適用され、ホームページのMarkdown版でエンリッチされます。次のステップでその方法を見てみましょう!
ステップ #6: すべての企業ホームページを並列で取得する
Web Unlocker APIは、Bright Dataの他のAPIベース製品と同様に、4億以上のレジデンシャルIPを持つエンタープライズグレードのインフラに支えられています。これにより、レート制限やスケーリングの問題を気にせず、無制限の並列処理でAPIを呼び出せます。
データセットには数千の企業が含まれているため、複数のウェブサイトを同時にスクレイピングすることが合理的です。以下のセルがまさにそれを実現します:
batch_size = 5
total = len(df)
defprocess_row_for_scraping(idx):
url = df.at[idx, "website"]
# Skip the row if the "website" field is missing
if pd.isna(url):
return None
# Retrieve the website homepage in Markdown
markdown = fetch_website(url)
timestamp = datetime.datetime.now(datetime.UTC)
return idx, markdown, timestamp
for start in range(0, total, batch_size):
# Get the current batch
end = min(start + batch_size, total)
batch_indices = df.index[start:end]
print(f"Processing Crunchbase records {start} to {end-1}")
# Fetching website homepages in parallel for the batch
with concurrent.futures.ThreadPoolExecutor(max_workers=batch_size) as executor:
results = list(executor.map(process_row_for_scraping, batch_indices))
# Update the DataFrame with the results
for r in results:
# Skip
if r is None:
continue
idx, markdown, timestamp = r
df.at[idx, "website_markdown"] = markdown
df.at[idx, "website_markdown_fetching_timestamp"] = timestamp
# Save the updated CSV after each batch
df.to_csv(ENRICHED_CSV_PATH, index=False)
print(f"Batch {start}-{end-1} saved to disk.")
このスニペットは、Crunchbaseデータセットを処理して各企業エントリーをウェブサイトのMarkdown版でエンリッチし、AI分析に備えます。5行のバッチで処理し、ウェブサイトを並列で取得してI/Oバウンド操作を高速化します。
process_row()関数は各企業を処理し、Web Unlocker APIを使用してホームページを取得してタイムスタンプを記録します。欠落したURLをスキップすることで効率を高め、不要なAPI呼び出しを避けます。また、企業のウェブサイトは頻繁に変更される可能性があるため、タイムスタンプを追跡することが重要です。最後にスクレイピングされた時期を知ることが重要です。
バッチはスレッドプールで処理され、複数のリクエストを同時に実行できます。各バッチの後、DataFrameが更新されてディスクに保存されます。インクリメンタルに保存することは非常に重要で、プロセスが中断された場合のデータ損失を防ぎ、最初からやり直すことなく再開できます。
プロのヒント:最初の実行では、完全なデータセットを処理する前にワークフローが期待通りに動作することを確認するために、行数を5または10に制限してください。
実行後、以下の画像のような出力メッセージが表示されます:
ノートブックのディレクトリにcrunchbase_analyzed_companies.csvファイルが表示されます。これには、元のCrunchbaseデータすべてに加えて、2つの新しい列が含まれます:
website_markdown:各企業のホームページのAI対応Markdown版。website_markdown_fetching_timestamp:各ページが取得された正確な時刻。

素晴らしい!このデータセットはAI分析と顧客開拓の準備ができました。
ステップ #7: AI顧客開拓のための関数を定義する
次のステップは、AIに顧客開拓を実行するよう指示する関数を追加することです。アイデアは、自社が何をしているかを説明し、AIに各Crunchbase企業エントリーを評価させて以下を生成させることです:
- この企業がどれほど良い潜在顧客になれるかを示すスコア。
- スコアの根拠を説明する短いコメント(数字だけでは全体像が分からない場合に役立ちます)。
- ウェブサイトコンテンツに基づいた企業のコアビジネスの短い説明(適合性を判断するのに役立ちます)。
注意:以下のプロンプトは企業のウェブサイトのみを入力として使用していますが、より高度で詳細な分析のためにレコード全体を渡すこともできます。
このセルでプロセスを実装します:
# Define the structured output schema
class AIProspectingResult(BaseModel):
ai_client_prospecting_score: float
ai_client_prospecting_comment: str
ai_core_business: str
def analyze_website(markdown):
# Ask the AI to perform the client prospecting task
system_prompt = (
"You are a business intelligence analyst specialized in identifying potential clients "
"for a cybersecurity firm. We are a specialized cybersecurity firm providing adversarial testing "
"for AI-powered ecosystems. Our mission is to proactively identify vulnerabilities by attempting to 'break' "
"AI models through sophisticated attack simulations. Following our assessment, we deliver a comprehensive "
"Vulnerability & Patch Report, detailing specific weaknesses discovered and providing actionable technical "
"strategies to remediate these risks and fortify the system's integrity.nn"
"Analyze the provided website content and produce a structured JSON with:n"
"- `ai_client_prospecting_score`: 0-10 float indicating how good a potential client this company could be.n"
"- `ai_client_prospecting_comment`: short comment (<=30 words) explaining the score.n"
"- `ai_core_business`: short description (<= 50 words) of what the company does based on the website.n"
)
user_prompt = f"WEBSITE CONTENT:n{markdown}"
try:
response = openai_client.responses.parse(
model="gpt-5.4-mini",
input=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt},
],
text_format=AIProspectingResult,
)
# Return the parsed result
return response.output_parsed
except Exception as e:
print("Error analyzing website with AI:", e)
return None
選択したOpenAIモデル(この場合はGPT-5.4 Mini)が構造化された出力で応答するように、responses.parse()メソッドを呼び出します。これはPydanticデータモデルを受け取り、生成されたレスポンスがそのフォーマットに従うことを保証します。詳細については、ChatGPTを使ったウェブスクレイピングのガイドで実際の動作をご覧ください。
素晴らしい!次のステップは、各企業レコードに対してこの関数を並列で呼び出すことです。
ステップ #8: すべての企業を並列で見込み評価する
前回と同様に、AIが複数のエントリーを並列で処理できるようにセルを追加します:
batch_size = 5
total = len(df)
def process_row(idx):
markdown = df.at[idx, "website_markdown"]
# Skip rows with missing markdown
if pd.isna(markdown):
return None
# Call the AI prospecting function
result = analyze_website(markdown)
if result is None:
return None
return idx, result.ai_client_prospecting_score, result.ai_client_prospecting_comment, result.ai_core_business
for start in range(0, total, batch_size):
end = min(start + batch_size, total)
batch_indices = df.index[start:end]
print(f"Processing AI prospecting for records {start} to {end-1}")
# Run AI analysis in parallel
with concurrent.futures.ThreadPoolExecutor(max_workers=batch_size) as executor:
results = list(executor.map(process_row, batch_indices))
# Update the DataFrame with the results (if the array is not full of None values)
for r in results:
if r is None:
continue # Skip
idx, score, comment, core_business = r
df.at[idx, "ai_client_prospecting_score"] = score
df.at[idx, "ai_client_prospecting_comment"] = comment
df.at[idx, "ai_core_business"] = core_business
# Save CSV after each batch
df.to_csv(ENRICHED_CSV_PATH, index=False)
print(f"Batch {start}-{end-1} saved to disk.")
実行すると、次のようなメッセージが表示されます:
Crunchbaseデータセットは、Bright Dataの抽出とAIによる顧客開拓分析でエンリッチされました。
結果を探索してみましょう!
ステップ #9: エンリッチされたデータを分析する
最後のセルに、エンリッチされたデータを表示するロジックを追加します:
relevant_columns = [
"name",
"cb_rank",
"region",
"ai_client_prospecting_score",
"ai_client_prospecting_comment",
"ai_core_business"
]
pd.set_option("display.max_columns", None) # Show all columns
pd.set_option("display.max_colwidth", None) # Do not truncate text
# Print only the relevant fields
df[relevant_columns].head(10)
結果のデータセットには以下が含まれます:

各企業に明確な見込みスコア、スコアの説明コメント、企業の事業内容の簡潔な説明が付加されていることに注目してください。これは以下なしには実現できませんでした:
- Bright DataのFilter API:ターゲットを絞ったフィルタリング済みCrunchbaseデータセットを取得するため。
- Web Unlocker API:ブロックされることなく企業ウェブサイトを確実にスクレイピングするため。
完成!さらなるデータ分析と処理を適用して、最初に連絡すべき最良の候補企業を選択できます。
まとめ
この記事では、Bright Dataのデータセット、Bright Data API、AIを活用して、完全で本番対応の自動化された顧客開拓ワークフローを構築する方法を学びました。このワークフローは:
- 430万件以上のレコードを含むCrunchbaseデータセットから始まります。
- Bright DataのFilter APIを使用してプログラム的にフィルタリングし、特定の条件に合う企業のみを含めます。
- Web Unlocker APIを使用して各企業のウェブサイトコンテンツを取得します。
- そのコンテンツをAIに渡してプログラム的にスコアリングし、各企業がどれほど良い潜在顧客であるかを評価します。
結果は、各企業にスコアと、製品やサービスのために連絡する価値があるかどうかを示す短いコメントが付いたエンリッチされたデータセットです。Bright Dataのマーケットプレイスからの高品質なデータ、高度なフィルタリング機能、AIエンリッチメントにより、新規顧客の発見がかつてないほど簡単になりました!
今日Bright Dataの無料アカウントを作成して、AI対応のウェブツールで実験を始めましょう!