AI

Bright Data Python SDKの紹介:ウェブデータのスクレイピング、検索、取得

Bright Data Python SDKを使って、ウェブサイトのスクレイピング、GoogleやBingの検索、データのエクスポート、Pythonでのジョブの同時実行を行う方法を学びます。
8 分読
Bright Data Python SDK

このガイドでは、以下の内容を学びます:

  • Bright Data Python SDKとは何か。
  • 認証の仕組みを含め、内部でどのように動作するか。
  • 同期・非同期モード、主な機能、メソッドなど、何が提供されているか。
  • SDKをインストールし、最初のリクエストをステップバイステップで実行する方法。
  • ポーリング、同時スクレイピングなどの高度なトピック。
  • 検索エンジン結果の比較から、手動データ抽出のためのBeautifulSoupによるウェブページのパースまで、実際のユースケース。

さっそく始めましょう!

Bright Data Python SDKとは?

Bright Data Python SDKは、Bright Dataの製品とのやり取りを簡素化するために設計されたPythonライブラリです。

このSDKはPyPIのbrightdata-sdkパッケージから利用できます。ウェブサイトのスクレイピング、検索エンジン結果の取得、既成のデータセットへのアクセス、Bright Dataソリューションとの連携を行うための統一インターフェースを提供します。

詳しく言うと、このPython SDKには100以上のBright Data Scraper APIとの統合がすぐに利用できる形で含まれており、Amazon、LinkedIn、Instagram、TikTokなど、さまざまなプラットフォームから最新の構造化された公開データにアクセスできます。

注:ターミナルでの作業を好む場合、Bright Data CLIを使えばコマンドラインから同様の機能の多くを利用できます。AIエージェントとともにBright Data CLIを使う方法も学べます。

参考資料:

Python SDKの仕組み

内部では、このSDKはBright Data APIをPythonクラスでラップしています。そのため、HTTPリクエストを手動で構築したり、APIエンドポイントを呼び出したり、レスポンスをパースしたりすることなく、Bright Dataのサービスとやり取りできます。代わりに、開発者に優しいPythonメソッドを呼び出すだけで済みます。

このライブラリは完全に型付けされ、入念にドキュメント化されているため、IDE上で機能を探索しやすくなっています。

IDEの自動補完、使用例の提案、メソッドドキュメントに注目

自動補完、型ヒント、使用例が提供されるため、利用可能なパラメータや各メソッドの使い方を理解しやすくなります。返されるオブジェクトも型付けされているため、レスポンスのフィールドに簡単にアクセスできます。

認証はBright Data APIトークン、または既にBright Data CLIで認証済みの場合はbrightdata loginによって保存された認証情報を通じて行われます。なお、Bright Dataアカウントに、SDKが内部で呼び出す必要なAPIが存在しない場合、ライブラリが自動的にそれらを設定します。

SDKが提供するもの

基本的な仕組みが明確になったところで、次はPython SDKが提供する機能を探っていきましょう。

主な機能

Bright Data Python SDKは、以下を含む幅広い機能を網羅しています:

  • ウェブスクレイピング:単一または複数のURLを同時にスクレイピングし、最小限のコードでウェブサイトのコンテンツを取得できます。
  • 検索エンジンの結果:Google、Bing、Yandexから結果を取得でき、地域指定クエリやバッチ検索にも対応しています。
  • プラットフォーム固有のスクレイパー:Amazon、LinkedIn、Instagram、Facebook、TikTok、YouTube、Reddit、Pinterest、ChatGPT、Perplexity、その他のプラットフォームから構造化データを抽出します。
  • プラットフォーム固有の検索:URLだけでなく検索パラメータを使って、プロフィール、求人、投稿、その他のコンテンツを見つけます。
  • Scraper Studioとの統合:カスタムスクレイパーを実行し、収集ジョブをトリガーし、ステータスを監視して結果を取得します。
  • 型付きメソッドとレスポンス:型ヒント、IDEの自動補完、パラメータの提案、構造化されたレスポンスオブジェクトにより、開発が容易になります。
  • アカウントとAPIの管理:接続性を確認し、アカウント情報と使用状況を調べ、APIを一覧表示し、API設定を管理します。
  • データのエクスポート:収集したウェブデータセットの結果をJSON、CSV、またはJSONL形式で保存します。

主なSDKメソッド

まずBright Data Python SDKをインストールします:

pip install brightdata-sdk

インストール後、SDKをインポートすれば、以下のような多くのメソッドにアクセスできるようになります:

メソッド 機能 Bright Dataの製品
client.scrape_url(url) 1つのURLまたはURLのリストのコンテンツを取得し、あらゆる対ボットシステムを回避します Unlocker API
client.search.google(query=...) Google検索を実行し、パース済みのオーガニック検索結果を返します SERP API
client.search.bing(query=...) Bing検索を実行し、パース済みのオーガニック検索結果を返します SERP API(Bing Web Search APIからの移行ガイドを参照)
client.scrape.<platform>.<method>(url=...) 対象のプラットフォームから構造化データを抽出します(例:client.scrape.amazon.products) Scraper API
client.search.linkedin.jobs(...) URLではなくパラメータでプラットフォームを検索します 特定のScraper API
client.datasets.<name>(filter=...) 事前収集済みデータセットからフィルタされたスナップショットをリクエストします Dataset API
client.scraper_studio.run(collector=..., input=...) カスタムウェブスクレイピングコレクターをトリガーし、そのレコードを返します Scraper Studio
client.browser.get_connect_url() PlaywrightまたはPuppeteerをクラウドブラウザに接続するためのCDPエンドポイントを構築します Browser API
client.list_zones() アカウントで利用可能なゾーンを一覧表示します なし

同期クライアントと非同期クライアント

このSDKは、同じメソッド名ながら実行モデルが異なる2種類のクライアントを提供します:

  • BrightDataClient:非同期クライアント。asyncioを使用し、高い同時実行性のワークロードを処理する必要があるアプリケーション向けに設計されています。
  • SyncBrightDataClient:同期クライアント。シンプルなスクリプトや、直感的な逐次リクエストに最適です。

SyncBrightDataClientを使ってscrape_url()を呼び出す方法は以下の通りです:

from brightdata import SyncBrightDataClient

with SyncBrightDataClient() as client:
    result = client.scrape_url("https://example.com")
    print(result.data)

これと同等のことをBrightDataClientで行う場合、クライアントの管理にasync with、非同期メソッドの呼び出しにawaitを使用する必要があります:

import asyncio
from brightdata import BrightDataClient

async def main():
    async with BrightDataClient() as client:
        result = await client.scrape_url("https://example.com")
        print(result.data)

asyncio.run(main())

どちらの例も、対象ページのHTMLをresult.dataに返します:

対象のexample.comページのHTML

なお、BrightDataClientは非同期ですが、scrape_url()はデフォルトでmode="sync"を使用します。これは、スクレイピング結果が利用可能になるまで呼び出しが待機してから返されることを意味します。scrape_url()を完全な非同期モードで使うには、mode="async"を渡します:

import asyncio
from brightdata import BrightDataClient

async def main():
    async with BrightDataClient() as client:
        result = await client.scrape_url(
            url="https://example.com",
            mode="async",
            poll_interval=5,   # 5秒ごとにチェック
            poll_timeout=180,  # 最大3分まで許容
        )
        print(result.data)

asyncio.run(main())

非同期スクレイピングモードでは、SDKは以下を行います:

  1. Web Unlocker APIエンドポイントにリクエストを送信します。
  2. 保留中のリクエストを識別するresponse_idを受け取ります。
  3. データが準備できるかタイムアウトに達するまで、そのIDを使って結果エンドポイントをポーリングします。
  4. 結果データが利用可能になったら返します。

同期と非同期のどちらのリクエストモードを選ぶべきかについて詳しくは、Sync vs. Asyncのドキュメントをご覧ください。

注:

  • poll_intervalとpoll_timeoutパラメータは、SDKが結果を確認する頻度と待機する時間を制御します。scrape_url()の場合、デフォルトはそれぞれ2秒と30秒です。
  • Web Unlockerの非同期リクエストは完了までに約2分かかることがあるため、poll_timeoutを適切に設定してください。

Bright Data APIの自動セットアップ

SDK経由で行われるリクエストは、アカウント内で構成されたBright Data APIに依存します:

アカウントで設定されているBright Data API

デフォルトでは、SyncBrightDataClientとBrightDataClientの両方がauto_create_zones=Trueを設定しています。このオプションは、必要なAPIゾーンがまだ存在しない場合にSDKが作成するかどうかを制御します。

自動作成が有効な場合、SDKは最初のAPIリクエストを行う前に、以下のゾーンが利用可能であることを確認します:

  • Web Unlocker API用のsdk_unlocker
  • SERP API用のsdk_serp
SDKによって作成された2つのAPIに注目

APIゾーンを自分で管理したい場合は、auto_create_zones=Falseを設定してください。SDKはAPIを作成しないため、web_unlocker_zoneとserp_zoneを通じて既存ゾーンの名前を指定する必要があります。

カスタムのUnlocker APIゾーンを使うには、次のように記述します:

import asyncio
from brightdata import BrightDataClient

async def main():
    async with BrightDataClient(
        auto_create_zones=False,
        web_unlocker_zone="web_unlocker", # カスタムのUnlocker APIゾーンに置き換えてください
    ) as client:
        result = await client.scrape_url("https://example.com")
        print(result.data)

asyncio.run(main())

Bright Data Python SDKを始める:ステップバイステップガイド

概念が明確になったところで、いよいよSDKのインストール、認証、メソッドのテストを行います。

前提条件

始める前に、以下を用意してください:

ステップ1:SDKをインストールする

以下のコマンドでpip経由でBright Data Python SDKをインストールします:

pip install brightdata-sdk

すでに古いバージョンをインストールしている場合は、以下でアップグレードします:

pip install -U brightdata-sdk

重要:本ガイドは2.5.0より新しいSDKバージョンを対象としています。

よくできました!続けて認証に進みましょう。

ステップ2:Bright Data APIトークンで認証する

Bright Data Python SDKは、Bright Data APIへのリクエストを認証するためにBRIGHTDATA_API_KEY環境変数を読み取ります。

LinuxまたはmacOSでは、以下のように必要な環境変数をBright Data APIキーに設定します:

export BRIGHTDATA_API_KEY="<YOUR_BRIGHT_DATA_API_KEY>"

Windows PowerShellでは、以下を実行します:

$Env:BRIGHTDATA_API_KEY = "<YOUR_BRIGHT_DATA_API_KEY>"

環境変数が設定されると、デフォルトの非同期クライアントが自動的にAPIキーを読み込みます:

from brightdata import BrightDataClient

async with BrightDataClient() as client:
    # ...

クライアントを作成する際に、token引数を使ってAPIキーを直接渡すこともできます:

from brightdata import BrightDataClient

async with BrightDataClient(token="<YOUR_BRIGHT_DATA_API_KEY>") as client:
    # ここでAPIリクエストを行う
    ...

トークンを直接渡す方法は、簡単なテストには便利です。ただし、ソースファイルにAPIキーをハードコーディングするのは避けましょう。

SDKは以下の順序で認証情報を確認します:

  1. BrightDataClientまたはSyncBrightDataClientに渡されたtoken引数。
  2. BRIGHTDATA_API_TOKEN環境変数。
  3. BRIGHTDATA_API_KEY環境変数。
  4. brightdata loginを使ってBright Data CLIが保存した認証情報(利用可能な場合)。

これで準備完了です!これでPython SDKを使って、ウェブページのスクレイピング、検索結果の取得、その他のBright Data APIへのアクセスができるようになりました。

ステップ3:最初のウェブデータ収集タスクを実行する

SDKのインストールと認証が済んだら、最初のスクレイピングを実行してみましょう。特定のLinkedInプロフィールから構造化データを収集したいとします。

このタスクには、client.scrape.linkedin.profiles()メソッドで利用できるBright Data LinkedIn Profiles Scraper APIを使用できます。これはプロフィールのデータを構造化オブジェクトとして返します:

import asyncio
from brightdata import BrightDataClient
from pprint import pprint

async def main():
    async with BrightDataClient() as client:
        result = await client.scrape.linkedin.profiles(
            url="https://linkedin.com/in/antonello-zanini" # スクレイピング対象のLinkedInプロフィール
        )

        print(f"Success: {result.success}")
        print("\nScraped profile data:")
        pprint(result.data, indent=2, sort_dicts=False)

asyncio.run(main())

結果は次のようになります:

スクリプトによって返された構造化LinkedInプロフィールデータ

このメソッドが、予想どおりに、指定したLinkedInプロフィールから最新の構造化された公開データを返している様子に注目してください:

対象のLinkedInプロフィール

ミッション達成です!

高度な使用方法

基本に慣れたところで、より高度なトピックを探る準備ができました。

ポーリングの仕組み

スクレイピングジョブの中には数秒以上かかるものもあり、実行中の状況を制御したい場合もあるでしょう。このような状況のために、Bright DataではScraper APIを非同期ジョブとして実行することができます。

考え方としては、スクレイピングをトリガーして、すぐにジョブを取得します。その後、ステータスを確認し、完了を待ち、生成された結果を取得します。通常これにはカスタムのポーリングロジックが必要ですが、SDKはすでにこのプロセスを簡素化するメソッドを提供しています。

以下のスクリプトは、LinkedInプロフィールの非同期スクレイピングを実行します:

import asyncio
from brightdata import BrightDataClient

async def main():
    async with BrightDataClient() as client:
        # スクレイピングタスクを開始し、すぐにジョブを返す
        job = await client.scrape.linkedin.profiles_trigger(
            url="https://es.linkedin.com/in/antonello-zanini"
        )
        print(f"Job triggered: {job.snapshot_id}")  # このジョブを識別するID

        # 「running」や「ready」など、ジョブの現在の状態を確認
        status = await job.status()
        print(f"Status: {status}")

        # ジョブが「ready」になるまでポーリング
        await job.wait(timeout=180, verbose=True)

        # ジョブが準備完了したらレコードをダウンロード
        data = await job.fetch()
        print(f"Got {len(data) if isinstance(data, list) else 1} records")

asyncio.run(main())

各SDKメソッドが行うことは以下の通りです:

  1. profiles_trigger()がスクレイピングジョブを開始し、スクレイピングの完了を待たずにジョブオブジェクトを返します。
  2. job.status()が現在のジョブステータスを確認します。
  3. job.wait()が、ジョブが準備完了になるかタイムアウトに達するまで、一定間隔でジョブステータスをポーリングします。デフォルトでは10秒ごとにステータスを確認します。タイムアウトが先に達した場合はTimeoutErrorを発生させます。
  4. job.fetch()が、ジョブの準備が完了したらスクレイピングされたレコードを取得します。

verbose=Trueを設定すると、各ステータスチェックが出力されるため、ジョブの進行状況を追跡できます:

前のスクリプトによって生成されたログ

各ステップを自分で管理する必要がない場合、to_result()は待機、取得、結果オブジェクトへのラップを1つにまとめます:

import asyncio
from brightdata import BrightDataClient
from pprint import pprint

async def main():
    async with BrightDataClient() as client:
        # スクレイピングタスクを開始し、すぐにジョブを返す
        job = await client.scrape.linkedin.profiles_trigger(
            url="https://es.linkedin.com/in/antonello-zanini"
        )
        print(f"Job triggered: {job.snapshot_id}")  # このジョブを識別するID

        result = await job.to_result(timeout=180) # ポーリング、取得、データ取得を一度に行う

        print(f"Success: {result.success}")
        print("\nScraped profile data:")
        pprint(result.data, indent=2, sort_dicts=False)

asyncio.run(main())

これは、このチュートリアルの前半で示したscrape.linkedin.profiles()メソッドと同じ結果オブジェクトを返します。

ポーリングをより細かく制御したい場合は、job.status()を繰り返し呼び出し、返されるステータス(すなわち"running"、"ready"、または"error")に基づいてロジックを調整する独自のループを実装することを検討してください。

複数のページを同時にスクレイピングする

複数のページを取得する必要がある場合は、URLのリストをBright Data Python SDKのスクレイピングメソッドに渡します。SDKはそれらを同時に取得し、URLごとに1つの結果オブジェクトを返します。以下のサンプルをご覧ください:

import asyncio
from brightdata import BrightDataClient

urls = [
    "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
    "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html",
    "https://books.toscrape.com/catalogue/soumission_998/index.html",
]

async def main():
    async with BrightDataClient() as client:
        # すべてのURLを同時に取得
        results = await client.scrape_url(urls)

        # resultsの各要素は1つのURLに対する結果オブジェクト
        for i, r in enumerate(results):
            if r.success:  # 失敗したURLはスキップ
                print(f"URL: {urls[i]}")
                print(f"{r.data[:500]}...")  # 生のHTMLの最初の500文字
                print("-" * 80 + "\n")

asyncio.run(main())

このスクリプトは、成功した各URLについて、その生のHTMLの最初の500文字を表示する行を出力します:

スクレイピングされた3つの異なるHTMLページに注目

同じ考え方がプラットフォームスクレイパーにも適用されます。以下のスクリプトは2つのLinkedInプロフィールを同時に収集します:

import asyncio
from brightdata import BrightDataClient

PROFILE_URLS = [
    "https://es.linkedin.com/in/antonello-zanini",
    "https://it.linkedin.com/in/federico-trotta",
]

async def main():
    async with BrightDataClient() as client:
        linkedin = client.scrape.linkedin

        # 先にすべてのプロフィールをトリガーし、どれかを待つ前にすべてのジョブを開始する
        job = await linkedin.profiles_trigger(url=PROFILE_URLS)

        # ジョブが「ready」になるまでポーリング
        await job.wait(timeout=180, verbose=True)

        # ジョブが準備完了したらレコードをダウンロード
        data = await job.fetch()
        print(f"Got {len(data) if isinstance(data, list) else 1} records")

asyncio.run(main())

出力は、同時にスクレイピングされた2つのプロフィールを含むデータセットになります:

スクリプトが2つのLinkedInプロフィールを同時にスクレイピングしたことに注目

取得したデータをエクスポートする

SDKは、データセットのレコードとscrapeメソッドの結果という2種類のデータを保存できます。データセットのレコードはexport()ヘルパーでエクスポートでき、scrapeの結果にはsave_to_file()ヘルパーがあります。

データセットは、新規にスクレイピングするのではなく事前収集済みのデータが必要な場合に便利です。データセットのレコードをエクスポートするには、スナップショットを作成してレコードをダウンロードし、それをexport()ヘルパーに渡してファイルに書き込みます:

import asyncio
from brightdata import BrightDataClient
from brightdata.datasets import export

async def main():
    async with BrightDataClient() as client:
        imdb = client.datasets.imdb_movies

        # フィルタされたレコード(IMDB評価9以上、評価数100以上の映画)に対する
        # スナップショットを作成し、リストとしてダウンロードする
        snapshot_id = await imdb(
            filter={
                "operator": "and",
                "filters": [
                    {"name": "imdb_rating", "operator": ">=", "value": 9},
                    {"name": "imdb_rating_count", "operator": ">", "value": 100},
                ],
            },
            records_limit=10,
        )
        data = await imdb.download(snapshot_id)

        export(data, "imdb_top_rated.csv")  # .csv拡張子でCSV形式を選択

asyncio.run(main())

注:出力形式は拡張子から選択され、.json、.jsonl、.csvがサポートされています。

上記のスクリプトは、プロジェクトのフォルダ内に以下のimdb_top_rated.csvファイルを作成します:

出力された「imdb_top_rated.csv」ファイル

scrapeメソッドの結果をファイルにエクスポートするには、save_to_file()を呼び出します:

import asyncio
from brightdata import BrightDataClient

async def main():
    async with BrightDataClient() as client:
        result = await client.scrape.linkedin.profiles(
            url="https://es.linkedin.com/in/antonello-zanini"
        )

        result.save_to_file("antonello_zanini.json", format="json")  # ディスクに書き込まれる

asyncio.run(main())

注:JSON形式のみがサポートされています。

これにより、以下のようなantonello_zanini.jsonファイルが生成されます:

出力された「antonello_zanini.json」ファイル

実践編:Bright Data Python SDKのユースケース

より高度なシナリオを探ったところで、実際のユースケースに取り組むための基礎が身につきました。

検索エンジンの結果を比較する

SERP追跡においては、異なる検索エンジンが同じクエリをどのように扱うかを理解することが重要です。以下のスクリプトは、同じクエリをGoogleとBingの両方で実行します:

# pip install brightdata-sdk

import asyncio
from brightdata import BrightDataClient

# 複数の検索エンジンで実行するクエリ
query = "best HTML parsers"

async def main():
    async with BrightDataClient() as client:
        # GoogleとBingからパース済みの検索結果を取得
        google = await client.search.google(query=query, num_results=10)
        bing = await client.search.bing(query=query, num_results=10)

        # 各検索エンジンの上位3件の結果を出力
        for name, result in [("Google", google), ("Bing", bing)]:
            print(f"\n{name}:")
            for item in result.data[:3]:
                print(f"  - {item['title']} ({item['url']})")

asyncio.run(main())

GoogleとBingは、titleやurlといったフィールドを含む、パース済みのオーガニック検索結果を返します。このデータには直接アクセスでき、例えば上位3件の結果を出力することができます:

同じ検索クエリに対するGoogleとBingの上位3件の結果に注目

Amazonの製品情報を完全に取得する

Amazonのスクレイピングは、製品ページから構造化データを収集するだけにとどまりません。製品評価、感情分析、監視などに役立つ情報を提供する製品レビューの抽出も含まれることがあります。

異なるBright Data Scraper APIのおかげで、以下のようにSDKを通じて製品情報とレビューの両方を取得できます:

# pip install brightdata-sdk

import asyncio
from brightdata import BrightDataClient

product_url = "https://www.amazon.com/dp/B0DCH8VDXF/"

async def main():
    async with BrightDataClient() as client:
        # 製品とレビューの両方のデータを取得
        product = await client.scrape.amazon.products(url=product_url)
        reviews = await client.scrape.amazon.reviews(url=product_url, pastDays=30, keyWord="quality")

        # スクレイピングしたデータを出力
        print(f"Title: {product.data['title']}")
        print(f"Price: {product.data['final_price']}")
        print(f"Rating: {product.data['rating']}")
        print(f"Reviews fetched: {len(reviews.data)}")

asyncio.run(main())

このスクリプトは、client.scrape.amazon.reviews()のフィルタリングオプションを活用し、「quality」というキーワードを含む過去30日間のレビューのみを取得しています。

出力は次のようになります:

製品データとレビューデータに注目

注:返される値は、製品とリクエスト時刻によって異なります。

BeautifulSoupでブロック解除済みのページをパースする

一般的なウェブスクレイピングのロードマップには以下が含まれます:

  1. ウェブページを取得する。
  2. HTMLパーサーでパースする。
  3. 必要なデータを抽出する。

問題は、多くのウェブサイトがHTMLコンテンツへの自動リクエストをブロックできる対策を採用していることです。可能な解決策として、ブラウザフィンガープリンティング、プロキシのローテーション、CAPTCHAの解決、その他の課題を処理するBright Data Web Unlocker APIのようなサービスを通じてこれらのページにアクセスする方法があります。

例えば、NBAストアのステファン・カリーのゴールデンステート・ウォリアーズのジャージの製品ページを取得し、その名前、ブランド、価格、在庫状況、利用可能なサイズを収集したいとします。

以下のスクリプトは、SDKのscrape_url()メソッドを使ってページを取得し、返されたHTMLをBeautifulSoupに読み込ませ、製品フィールドを抽出します:

# pip install brightdata-sdk beautifulsoup4

import asyncio
from brightdata import BrightDataClient
from bs4 import BeautifulSoup
import json


NBA_PRODUCT_URL = (
    "https://store.nba.com/golden-state-warriors/mens-golden-state-warriors-stephen-curry-"
    "fanatics-royal-fast-break-replica-jersey-icon-edition/t-14140641+p-138834682113177+z-9-2551128663"
    "?_ref=p-SFLP:m-GRID:i-r0c0:po-0"
)

async def main():
    # 対ボット対策を避けるため、scrape_url()でページを取得
    async with BrightDataClient() as client:
        result = await client.scrape_url(NBA_PRODUCT_URL)

    # パースするためにHTMLをBeautifulSoupに読み込む
    soup = BeautifulSoup(result.data, "html.parser")

    # ページのメイン見出しから製品名を抽出
    title = soup.find("h1", attrs={"data-talos": "labelPdpProductTitle"}).get_text(strip=True)

    # 製品を記述するJSON-LDブロックを見つける
    product_ld_data = None
    for script in soup.find_all("script", type="application/ld+json"):
        data = json.loads(script.string)
        if data.get("@type") == "Product":
            product_ld_data = data
            break

    # そこから一部のデータにアクセス
    brand = product_ld_data["brand"]
    images = product_ld_data["image"]

    # 最初のオファーから価格と在庫状況を読み取る
    offer = product_ld_data["offers"][0]
    price = offer["priceSpecification"]["price"]
    currency = offer["priceSpecification"]["priceCurrency"]
    availability = offer["availability"].rsplit("/", 1)[-1]

    # ボタンであるサイズを抽出し、その表示テキストがサイズラベル(S、M、L、...)となる
    sizes = [b.get_text(strip=True) for b in soup.find_all("button", attrs={"data-talos": "buttonSize"})]

    # スクレイピングしたデータを収集
    product = {
        "title": title,
        "brand": brand,
        "images": images,
        "price": price,
        "currency": currency,
        "availability": availability,
        "sizes": sizes,
    }

    # スクレイピングしたデータを出力
    print(json.dumps(product, indent=2))

asyncio.run(main())

出力は次のようになります:

ブロック解除済みのNBA製品ページからパースされたデータ

これらのフィールドは、対象ページに表示されている情報に対応しています。

対象のNBA製品ページ

結論

本ブログ記事では、Bright Data Python SDKが、Bright Dataのスクレイピング、検索、データセット製品へのアクセスを1つのPythonパッケージで提供する方法について学びました。また、SDKをインストールし、実際のシナリオで使用する方法もご覧いただきました。

さらに詳しく知りたい場合は、公式ドキュメント、GitHubリポジトリ、各機能の動作するスクリプトを収めたexamplesディレクトリをご覧ください。SDKが役立つと感じた場合は、ぜひリポジトリにスターを付けてください!

今すぐBright Dataアカウントを作成し、Python SDKを試して、Bright Data APIへのアクセスを簡素化しましょう。

FAQ

Bright Data Python SDKはなぜ便利なのですか?

これは、Python開発者にウェブサイトのスクレイピング、検索エンジンクエリの実行、ボット検出やCAPTCHAの回避、構造化されたプラットフォームデータの抽出、そして100以上の既成データセットへのアクセスを行うための、一貫した単一のパッケージを提供します。そのおかげで、そのようなインフラを自分で構築する必要がありません。

SDKを使うのにBright Data CLIは必要ですか?

いいえ。SDKはBRIGHTDATA_API_KEYまたはBRIGHTDATA_API_TOKENに設定されたAPIトークンで動作します。すでにbrightdata loginを実行している場合、SDKはCLIが保存した認証情報にフォールバックするため、他に何も設定する必要はありません。

Bright Data CLI、Python SDK、MCP、Agent Skillsの違いは何ですか?

CLIはターミナルからBright Dataのコマンドを実行します。Python SDKは、Pythonのコードから APIを呼び出せるようにします。Bright Data MCPサーバーは、AIエージェントにスクレイピングと検索のツールを提供し、Agent SkillsはコーディングエージェントにBright Dataの使い方を教えます。

Bright Data Python SDKとBright Data JavaScript SDKの違いは何ですか?

Python SDK(pipでインストールするbrightdata-sdk)は、scrape_url()のようなスネークケースのメソッドを持つ、同期・非同期クライアントを提供します。JavaScript SDK(npmでインストールする@brightdata/sdk)は、Node.js上で動作し、scrapeUrl()のようなキャメルケースのメソッドを使用します。

同期モードと非同期モードはいつ使うべきですか?

各呼び出しが結果が準備できるまでブロックされるため、シンプルなスクリプトや簡単な確認作業には同期クライアントを使用してください。高い同時実行性のワークロード、バッチジョブ、バックグラウンド処理には非同期クライアントを使用してください。