Bright Data: Dataset Marketplaceでデータをダウンロード・分析する

このチュートリアルでは、Bright DataのIMDB Media Datasetの使用方法を紹介します。このガイドでは、充実したデータセットにアクセスし、pandas DataFrameに読み込み、探索的データ分析を行う手順を追っていきます。人気のジャンルや高評価映画など、映画データから洞察を導き出します。

このノートブックは、Bright Dataから大規模なメディアデータセットを分析し始めるための実践的な実例です。それでは始めましょう! 🎬

1. セットアップとインストール

まず、環境をセットアップしましょう。必要なPythonライブラリをインストールし、Bright Data APIキーを設定します。

1.0. Bright Dataアカウントの作成とIMDB Snapshot IDの取得

以下の手順に従って登録し、無料のIMDB MediaデータセットのSnapshot IDを取得してください。

1.サインアップ:

  • Bright Dataにアクセスし、Sign Upをクリックします。
  • メール+パスワードでアカウントを作成します(またはGoogle/GitHub SSOを使用)。
  • 求められたらメールを確認します。

2.APIトークンの生成:

  • Bright Dataダッシュボードで、右上のメニュー(アバター)> Account settings(またはAPI & Integrations)を開きます。
  • API / Access tokensセクションを見つけます。
  • Create / New tokenをクリックし、名前を付けます(例: imdb-tutorial)、トークンをコピーします。
  • .envファイルに以下のように保存します:
    BRIGHT_DATA_API_KEY="your_token_here"
    

3.IMDB Media Datasetの場所を確認:

  • サイドバーでDatasets > Dataset Marketplaceに移動します。
  • "IMDB"を検索します("IMDB Media"などの名前を探します)。
  • データセットページを開きます。多くのマーケットプレイスページにはサンプルスキーマと価格が表示されます。Bright Dataはプランに応じて無料枠やサンプルスナップショットを提供することがあります。

4.スナップショットの作成とアクセス:

  • データセットページで "Create snapshot" / "Download sample" などのボタンをクリックします。
  • 作成後、UIまたはAPI例のスニペットにSnapshot ID(snap_...で始まる)が表示されます。
  • そのSnapshot IDをコピーします。このチュートリアルでは以下を使用します:
    snap_mewa1lct2l63mtpvge
    
    (このスナップショットが後で利用できなくなった場合は、作成手順を繰り返して新しいIDを取得してください。)

トークンが.envファイルに(BRIGHT_DATA_API_KEYとして)、snapshot IDが手元にあれば、以下のインストール手順に進みます。

1.1. ライブラリのインストール

データセットのダウンロードにはrequests、データ操作にはpandas、APIキーの管理にはpython-dotenvが必要です。pipを使って以下のようにインストールできます。

!pip install requests pandas python-dotenv matplotlib -q

1.2. .envでのAPIキー管理

APIキーは.envファイルに保存するのがベストプラクティスです。このノートブックと同じディレクトリに.envという名前のファイルを作成し、Bright Data APIキーを追加してください。

BRIGHTDATA_API_KEY="your_brightdata_api_key"

次に、この環境変数をノートブックに読み込みます(以下のコードは変数名BRIGHTDATA_API_KEYを想定しています)。

import os
from dotenv import load_dotenv
import requests
import pandas as pd
import csv
import json

# Load environment variables from .env file
load_dotenv()

# Get the API key (expects BRIGHTDATA_API_KEY in your .env file)
api_key = os.getenv("BRIGHT_DATA_API_KEY")

if not api_key:
    raise ValueError("Missing BRIGHTDATA_API_KEY environment variable. Make sure it is set in your .env file.")

2. IMDB Media Datasetへのアクセス

Bright DataはIMDB Media Datasetのような包括的なデータセットへのアクセスを提供します。ここでは、提供されたPythonスクリプトを使用して、このデータセットのスナップショットをダウンロードし、pandas DataFrameに読み込みます。このスクリプトは、効率的にデータをストリーミングし、大きなファイルを処理できるように設計されています。

import csv
import requests
import pandas as pd

SNAPSHOT_ID = "snap_mewa1lct2l63mtpvge"
URL = f"https://api.brightdata.com/datasets/snapshots/{SNAPSHOT_ID}/download?format=csv"

if not api_key:
    raise ValueError("Missing BRIGHT_DATA_API_KEY (ensure it's set and loaded before running).")

response = requests.get(
    URL,
    headers={"Authorization": f"Bearer {api_key}"},
    stream=True,
    timeout=120,
)

if response.status_code != 200:
    print("HTTP", response.status_code, response.text[:300])
else:
    line_iter = response.iter_lines(decode_unicode=True)

    header_line = next(line_iter, None)
    if not header_line:
        raise ValueError("Empty snapshot (no header line received).")

    header = next(csv.reader([header_line]))

    try:
        title_idx = header.index("title")
    except ValueError:
        title_idx = None  # proceed without title filtering if column absent

    kept_rows = []
    for line in line_iter:
        if len(kept_rows) >= 100:
            break
        if not line.strip():
            continue
        row = next(csv.reader([line]))

        if title_idx is not None:
            title_val = row[title_idx].strip().lower()
            if title_val in ("", "null", "none", "nan"):
                continue

        kept_rows.append(row)

    df_marketplace = pd.DataFrame(kept_rows, columns=header)
    print(f"Rows kept: {len(df_marketplace)}")
    display(df_marketplace.head())
Rows kept: 100
title popularity genres presentation credit videos photos top_cast details_release_date details_countries_of_origin ... imdb_rating_count awards critics_review_count episode_count review_count review_rating featured_review storyline boxoffice_budget id
0 Monster Cruise ["Comédia"] [{"names":[{"link":"https://www.imdb.com/name/... [{"link":"https://www.imdb.com/title/tt1639403... [{"actor":"Paul Wallace","character":"Larry","... 9/24/2010 (Estados Unidos da América) Estados Unidos da América ... 32 0 0 $650,000.00 tt1639403
1 Marry Me 411 ["कॉमेडी","संगीत","रोमांस"] संगीत सुपरस्टार केट वाल्डेज़ और बैश्चियन वैश्व... [{"names":[{"link":"https://www.imdb.com/name/... [{"link":"https://www.imdb.com/video/vi1156104... [{"link":"https://www.imdb.com/title/tt1022346... [{"actor":"Jennifer Lopez","character":"Kat","... 2/11/2022 (भारत) चीन, जापान, यूनाइटेड स्टेट्स ... 46964 2 wins 182 538 7 7/10@marrymemovieI haven't been embarrasse... $23,000,000.00 tt10223460
2 Una película de Minecraft 90 ["Acción","Aventura","Comedia","Familiar","Fan... Cuatro inadaptados son arrastrados a través de... [{"names":[{"link":"https://www.imdb.com/name/... [{"link":"https://www.imdb.com/video/vi2465515... [{"link":"https://www.imdb.com/title/tt3566834... [{"actor":"Jason Momoa","character":"Garrett",... 4/3/2025 (Nueva Zelanda) Estados Unidos, Suecia, Nueva Zelanda, Canadá ... 132769 2 wins 167 1495 6 While I'm not completely familiar with the... $150,000,000.00 tt3566834
3 Vigilante Diaries ["Action","Crime","Thriller"] After killing a lot of bad guys including Arme... [{"names":[{"link":"https://www.imdb.com/name/... [{"link":"https://www.imdb.com/video/vi1215673... [{"link":"https://www.imdb.com/title/tt3903852... [{"actor":"Paul Sloan","character":"The Vigila... 6/24/2016 (United States) United States ... 4756 21 21 1 First of all, I can easily say that I have was... $1,000,000.00 tt3903852
4 Addams Family Values 413 ["कॉमेडी","फ़ैंटेसी"] परिवार का भविष्य अंधकारमय हो जाता है जब गंदी न... [{"names":[{"link":"https://www.imdb.com/name/... [{"link":"https://www.imdb.com/video/vi2579613... [{"link":"https://www.imdb.com/title/tt0106220... [{"actor":"Anjelica Huston","character":"Morti... 11/19/1993 (यूनाइटेड स्टेट्स) यूनाइटेड स्टेट्स ... 118665 Won Oscar 1 Oscar 3 wins total 63 197 It's a pleasant surprise to see sequel liv... $47,000,000.00 tt0106220

5 rows × 33 columns

3. 基本的なデータクリーニングと分析

データを読み込んだので、意味のある洞察を抽出するためにクリーニングと基本的な分析を行いましょう。

# Basic cleaning & exploratory analysis
import json
import matplotlib.pyplot as plt

if 'df_marketplace' in globals() and not df_marketplace.empty:
    # Convert rating/count columns to numeric
    df_marketplace['imdb_rating'] = pd.to_numeric(df_marketplace.get('imdb_rating'), errors='coerce')
    df_marketplace['imdb_rating_count'] = pd.to_numeric(df_marketplace.get('imdb_rating_count'), errors='coerce')

    # Drop rows missing essentials
    df_cleaned = df_marketplace.dropna(subset=['imdb_rating', 'title', 'genres'])
    df_cleaned = df_cleaned[df_cleaned['title'].str.strip() != '']

    print(f"Cleaned data rows: {len(df_cleaned)}")

    # --- Analysis 1: Most Common Genres ---
    def parse_genres(genres_str):
        try:
            return json.loads(genres_str.replace("'", '"'))
        except (json.JSONDecodeError, AttributeError):
            return []

    all_genres = df_cleaned['genres'].apply(parse_genres).explode()
    genre_counts = all_genres.value_counts()

    print("\n--- Top 10 Genres ---")
    print(genre_counts.head(10))

    # --- Analysis 2: Highest-Rated Movies (with >10k ratings) ---
    popular_movies = df_cleaned[df_cleaned['imdb_rating_count'] > 10000]
    top_movies = popular_movies.sort_values(by='imdb_rating', ascending=False)

    print("\n--- Top 10 Highest-Rated Popular Movies ---")
    print(top_movies[['title', 'imdb_rating', 'imdb_rating_count']].head(10))

    # --- Analysis 3: Rating Distribution ---
    plt.figure(figsize=(10, 6))
    plt.hist(df_cleaned['imdb_rating'], bins=20, color='skyblue', edgecolor='black')
    plt.title('Distribution of IMDB Ratings')
    plt.xlabel('IMDB Rating')
    plt.ylabel('Number of Movies')
    plt.grid(axis='y', alpha=0.75)
    plt.show()
else:
    print("DataFrame 'df_marketplace' is empty or not defined.")
Cleaned data rows: 69

--- Top 10 Genres ---
genres
Drama          29
Thriller       11
Comedy         10
Romance         9
Crime           9
Action          8
Documentary     6
Mystery         6
कॉमेडी          5
History         4
Name: count, dtype: int64

--- Top 10 Highest-Rated Popular Movies ---
                                  title  imdb_rating  imdb_rating_count
54  Apocalypse: La 2ème guerre mondiale          9.0            17284.0
80                 Histoire de jouets 3          8.3           942360.0
51                       The Terminator          8.1           975492.0
61                           La La Land          8.0           730613.0
5                          The Irishman          7.8           458407.0
37             Les Banshees d'Inisherin          7.7           283774.0
24           The Trial of the Chicago 7          7.7           201607.0
99                       A Star Is Born          7.6           439423.0
19                       The Blind Side          7.6           378177.0
17                    También la lluvia          7.4            15259.0

4. まとめ

おめでとうございます!Bright Data IMDB Media Datasetを正常にダウンロードし、重要なクリーニングステップを実行し、興味深い傾向を明らかにする初期分析を行いました。

このチュートリアルでは、以下をカバーしました。

  • Bright DataサービスにアクセスするためのAPIキーの安全な管理。
  • 大規模なデータセットをダウンロードし、pandas DataFrameに読み込む。
  • 欠損値の処理やデータ型の変換により、分析のためにデータをクリーニング・準備する。
  • 最も一般的なジャンルを見つけ、最高評価の映画を特定し、評価の分布を可視化してデータを分析する。

このチュートリアルは、より高度な分析のためのしっかりとした基礎です。Box Officeパフォーマンス、リリース日の傾向、キャストとクルーの分析など、データセットの他の側面を探索したり、Bright Data Dataset Marketplaceで他のデータセットを探索したりできます。

Happy analyzing! 🎉