プログラマー向けモードで表示中ビジネスユーザー向けへ
Bright Data 学習ポータル
UC-WEB-005Web AccessLv3Lv4

AI システムへの Web データ統合

アプリ/ETL/AI ワークフローに Web データ取得を直接組み込み、運用を一本化する。

Web Access APIsSDK

KPI 例

  • 接続系統数
  • データ鮮度
  • 稼働率

AI システムで重要なのは、単発で取得できることよりも、どの API をどの条件で呼ぶかを一貫した形にすることです。検索結果は SERP API、保護ページは Web Unlocker、広域収集は Crawl API と役割を分け、そのうえで認証、zone、保存形式を共通化しておくと、後段の評価や再実行がかなり楽になります。

このページでは、公式の Python SDK / JavaScript SDK を使う前提も含めつつ、まずは API 呼び出しの共通面を固める考え方を扱います。SDK の詳細シグネチャは公式ドキュメントを参照し、このサイトでは 共通設計の最小形 に絞ります。

誰の課題か

  • RAG、調査エージェント、回答生成に Web データを継続投入したい AI エンジニア
  • 取得方法が用途ごとにばらばらで、再現性や監査性を持たせにくいチーム
  • Python と Node.js の両方で Bright Data を使うが、認証や zone 設計を統一したい開発組織

AI システムでは、取得できたかどうか以上に、後から「どの API のどの実行結果を使ったか」を追えることが重要です。

推奨製品セット

製品役割このページでの位置づけ
Web Unlocker保護ページの単発取得HTML / raw body の入口
SERP API検索結果の構造化取得検索起点の調査フローを担当
Crawl APIドメイン単位の広域収集Markdown / HTML / JSON のジョブ収集
Python SDKPython 側の統合入口共通の認証・設定をコードに閉じ込める
JavaScript SDKNode.js 側の統合入口同じ設計を JS ワークフローに展開する
  • まず API ごとの責務を分け、その後に SDK で共通化します。
  • どの言語でも、少なくとも api_keyzone、対象 API 種別、保存先を一貫して扱えるようにします。

最小実装イメージ

Python で API 選択を 1 か所にまとめる

import os
import requests
 
API_KEY = os.getenv("BRIGHTDATA_API_KEY")
ENDPOINT = "https://api.brightdata.com/request"
 
def call_brightdata(mode: str, payload: dict) -> dict:
    if mode not in {"unlocker", "serp"}:
        raise ValueError(f"unsupported mode: {mode}")
 
    response = requests.post(
        ENDPOINT,
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
        },
        json=payload,
        timeout=60,
    )
    response.raise_for_status()
    return response.json()
 
serp_result = call_brightdata(
    "serp",
    {
        "zone": "serp_api1",
        "payload": {
            "engine": "google",
            "q": "bright data api",
            "language": "ja",
            "location": "Tokyo",
            "num": 10,
        },
    },
)
 
unlocker_result = call_brightdata(
    "unlocker",
    {
        "zone": "web_unlocker1",
        "url": "https://example.com/protected-page",
        "format": "raw",
    },
)
 
print(serp_result.keys())
print(type(unlocker_result))

この共通関数を先に決めておくと、後から公式 SDK に置き換える場合も、呼び出し側の責務を崩さずに済みます。

Node.js 側でも認証と zone を共通化する

const apiKey = process.env.BRIGHTDATA_API_KEY;
 
async function requestBrightData(payload) {
  const res = await fetch("https://api.brightdata.com/request", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${apiKey}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(payload),
  });
 
  if (!res.ok) {
    throw new Error(`Bright Data request failed: ${res.status}`);
  }
 
  return res.json();
}
 
const data = await requestBrightData({
  zone: "serp_api1",
  payload: {
    engine: "google",
    q: "bright data api",
    language: "ja",
    location: "Tokyo",
    num: 10,
  },
});
 
console.log(Object.keys(data));

SDK を導入するとしても、まずはこのレベルで「どの payload を投げるか」を固定しておくほうが運用しやすくなります。

運用ポイント

  • API ごとに zone を分けます。serp_api1web_unlocker1crawl_docs のように責務で区切ると、AI パイプライン側の追跡がしやすくなります。
  • Python と Node.js で別々の書き方をしても、環境変数名はそろえます。少なくとも BRIGHTDATA_API_KEY と zone 名の扱いは共通にします。
  • 取得結果をそのまま LLM に渡さず、取得日時、対象 URL、API 種別、zone を必ず付けて保存します。
  • 検索結果、HTML、Markdown を同じ保存先に雑に混ぜると再利用しづらくなります。用途別にテーブルやファイルを分けます。
  • SDK を採用するときも、一次情報で確認できない自動再試行や課金挙動を前提にせず、まずは明示的なログを残す設計を優先します。

関連リンク