大好きなカーズのキャラクター125体以上の画像をAPIで一括収集してみた

大好きなカーズのキャラクター125体以上の画像をAPIで一括収集してみた

作成日:
更新日:

子どもの頃からずっと大好きなピクサー映画「カーズ」シリーズ。ライトニング・マックィーン、メーター、サリー……キャラクターの名前を挙げ始めたらキリがありません。

ある日、「全キャラクターの名前と画像を一覧にしたい」と思い立ちました。手作業で1体ずつ調べるのは大変すぎる。そこでプログラマーらしくAPIで自動収集することにしました。

最終的には子どもと一緒に見られる カーズ キャラクター図鑑 サイトとして公開するところまでいきました。

カーズシリーズのキャラクター数

まず、カーズシリーズの規模を振り返ってみましょう。

作品公開年キャラクター数
カーズ2006年46体
カーズ22011年26体
カーズ/クロスロード2017年53体
合計125体以上

短編シリーズやゲーム版のオリジナルキャラクターを含めると200体以上が存在すると言われています。最初は主要キャラクター105体からスタートしましたが、その後追加調査を行い、最終的に125体以上まで拡充しました。


どこからデータを取得するか

キャラクター情報の取得先として目をつけたのが、ファンコミュニティが運営する Pixar Cars Wiki(Fandom) です。

Fandom WikiのMediaWiki API

FandomのWikiサイトは MediaWiki をベースにしており、標準の MediaWiki API が利用できます。つまり、Web画面をスクレイピングする必要はなく、構造化されたJSONデータとして情報を取得できるのです。

APIエンドポイントは以下の通りです。

https://pixarcars.fandom.com/api.php

なぜMediaWiki APIを選んだか

  • 構造化データ: JSONで返ってくるため、パースが容易
  • 安定性: MediaWikiの標準APIなので仕様が安定している
  • 著作権への配慮: 画像URLを取得するだけで、Wikiのコンテンツをそのまま複製するわけではない
  • レート制限が緩め: 適切な間隔を空ければブロックされにくい

著作権について: 取得した画像はDisney/Pixarの著作物です。今回のプロジェクトでは、引用元(ディズニー公式 / Pixar Cars Wiki)を明記し、ファン活動の範囲で使用しています。商用利用や無断再配布は行っていません。


実装: Pythonスクリプト

外部ライブラリを使わず、Python標準ライブラリのみで実装しました。依存関係ゼロで動くのがポイントです。

全体構成

#!/usr/bin/env python3
"""
カーズ シリーズ キャラクター画像URL収集・ダウンロードスクリプト
 
使い方:
  python collect_images.py              # 画像URLの収集のみ(CSV出力)
  python collect_images.py --download   # 画像URLの収集 + ダウンロード
"""
 
import csv
import json
import os
import time
import urllib.error
import urllib.parse
import urllib.request
from pathlib import Path
 
# 設定
WIKI_API_URL = "https://pixarcars.fandom.com/api.php"
OUTPUT_CSV = "characters_images.csv"
REQUEST_DELAY = 1.0  # リクエスト間のスリープ(秒)
USER_AGENT = "CarsCharacterImageCollector/1.0 (Personal Research)"

キャラクターリストの定義

日本語名・英語Wiki名・登場作品の3つの情報をタプルで管理します。

CHARACTERS = [
    # --- カーズ(2006年)---
    ("ライトニング・マックィーン", "Lightning McQueen", "カーズ"),
    ("マック", "Mack", "カーズ"),
    ("メーター", "Mater", "カーズ"),
    ("サリー・カレラ", "Sally Carrera", "カーズ"),
    ("ドック・ハドソン", "Doc Hudson", "カーズ"),
    # ... 以下省略(全125体以上)
 
    # --- カーズ2(2011年)---
    ("フィン・マックミサイル", "Finn McMissile", "カーズ2"),
    ("ホリー・シフトウェル", "Holley Shiftwell", "カーズ2"),
    # ...
 
    # --- カーズ/クロスロード(2017年)---
    ("クルーズ・ラミレス", "Cruz Ramirez", "カーズ3"),
    ("ジャクソン・ストーム", "Jackson Storm", "カーズ3"),
    # ...
]

英語のWiki名がAPIリクエストのキーになるため、正確なページタイトルを事前に調べておく必要があります。

MediaWiki APIへのリクエスト

APIリクエストの基本関数です。User-Agentヘッダを設定して、botとして適切に振る舞うようにしています。

def make_api_request(params: dict) -> dict:
    """Fandom MediaWiki APIにリクエストを送信する"""
    params["format"] = "json"
    url = f"{WIKI_API_URL}?{urllib.parse.urlencode(params)}"
    req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
    try:
        with urllib.request.urlopen(req, timeout=15) as response:
            return json.loads(response.read().decode("utf-8"))
    except (urllib.error.URLError, urllib.error.HTTPError) as e:
        print(f"  [エラー] APIリクエスト失敗: {e}")
        return {}

画像URLの取得ロジック

画像URLの取得には3段階のフォールバック戦略を用いています。

def get_page_image_url(page_title: str) -> tuple[str, str]:
    """Wikiページのメイン画像URLを取得する"""
 
    # 1. pageimagesプロパティでサムネイル画像を取得
    data = make_api_request({
        "action": "query",
        "titles": page_title,
        "prop": "pageimages|info",
        "piprop": "original",
        "inprop": "url",
        "redirects": "1",
    })
 
    # ページが見つかった場合 → 画像URLを返す
    # ページが見つからない場合 → 検索APIにフォールバック
    # 画像がない場合 → ページ内画像一覧から探す

フォールバック 1: pageimages プロパティ

MediaWiki APIのpageimagesプロパティは、ページのメイン画像(サムネイル)を返します。多くのキャラクターページはこの方法で画像を取得できます。

GET /api.php?action=query&titles=Lightning+McQueen&prop=pageimages&piprop=original&format=json

フォールバック 2: 検索API

ページタイトルが完全一致しない場合、検索APIで近い名前のページを探します。

def search_and_get_image(search_term: str) -> tuple[str, str]:
    """検索APIでページを探してから画像を取得する"""
    data = make_api_request({
        "action": "query",
        "list": "search",
        "srsearch": search_term,
        "srlimit": "1",
    })
    # 見つかったページの画像を取得...

フォールバック 3: ページ内画像一覧

pageimagesでメイン画像が取れない場合、ページ内のすべての画像を列挙し、ロゴやアイコンを除外した最初の画像を使います。

def get_first_image_from_page(page_title: str, page_url: str):
    data = make_api_request({
        "action": "query",
        "titles": page_title,
        "prop": "images",
        "imlimit": "10",
    })
 
    for img in images:
        # ユーティリティ画像を除外
        skip_keywords = [
            "Wiki", "Logo", "Icon", "Favicon",
            "Banner", "Placeholder", "Template",
        ]
        if any(kw.lower() in img_title.lower() for kw in skip_keywords):
            continue
        # 画像のURLを取得して返す

レート制限への配慮

Wikiサーバーに負荷をかけないよう、リクエスト間に1秒のスリープを挟んでいます。

REQUEST_DELAY = 1.0
 
# メインループ内
for i, (ja_name, en_name, movie) in enumerate(CHARACTERS, 1):
    image_url, wiki_url = get_page_image_url(en_name)
    # ... 処理 ...
    if i < total:
        time.sleep(REQUEST_DELAY)  # サーバーへの負荷軽減

実行結果

スクリプトを実行すると、以下のような進捗が表示されます。

$ python collect_images.py --download
 
=== カーズ キャラクター画像URL収集 ===
対象キャラクター数: 125
APIエンドポイント: https://pixarcars.fandom.com/api.php
出力CSV: characters_images.csv
 
[1/125] ライトニング・マックィーン (Lightning McQueen) ... OK
  -> ダウンロード完了: images/Lightning McQueen.png
[2/125] マック (Mack) ... OK
  -> ダウンロード完了: images/Mack.png
[3/125] ストリップ・ウェザーズ(キング) (Strip Weathers) ... OK
  -> ダウンロード完了: images/Strip Weathers.png
...
 
=== 結果サマリー ===
  取得成功:         125/125
  画像なし:         0/125
  ページなし:       0/125
  ダウンロード完了: 125/125
 
完了しました。

なんと125体すべての画像を取得成功。成功率100%です。Fandom Wikiのカーズページが非常に充実していたおかげですね。

出力されるCSV

CSVファイルには以下の情報が記録されます。

カラム内容
日本語名キャラクターの日本語名
英語名Wiki上のページタイトル
作品登場作品(カーズ/カーズ2/カーズ3)
画像URLFandom上の画像URL
WikiページURLキャラクターのWikiページURL
ステータス取得成功/ページあり・画像なし/ページなし
ローカルパスダウンロードした画像のパス

取得したキャラクター一覧(抜粋)

カーズ(2006年)の主要キャラクター

#名前説明
1ライトニング・マックィーン主人公。No.95のレースカー
2メーター(トウ・メーター)錆だらけのレッカー車。マックィーンの親友
3サリー・カレラ弁護士。2002年ポルシェ911カレラがモデル
4ドック・ハドソン元伝説のレーサー。1951年ハドソン・ホーネットがモデル
5マックマックィーンの輸送トレーラー
6ルイジタイヤ店の店主。1959年フィアット500がモデル
7シェリフ町の保安官。1949年マーキュリー・エイトがモデル

カーズ2(2011年)の注目キャラクター

#名前説明
38フィン・マックミサイル凄腕スパイ。アストンマーティンDB5がモデル
39ホリー・シフトウェル新人女性スパイ。メーターの恋人に
46フランチェスコ・ベルヌーイF1レーサー。マックィーンのライバル
52シュウ・トドロキ日本代表レーサー

カーズ/クロスロード(2017年)の注目キャラクター

#名前説明
56クルーズ・ラミレストレーナーからレーサーに転身。No.51
57ジャクソン・ストーム次世代レーサーのトップ。最高速度214mph
66ミス・フリッターデモリション・ダービーのチャンピオン

クロスロードではネクストジェン(次世代)レーサーが大量に登場し、30体以上が追加されました。


実装で工夫したポイント

1. 外部ライブラリ不要

requestsBeautifulSoupを使わず、Python標準のurllibjsonだけで完結しています。pip installなしでどの環境でもすぐ動かせます。

2. 3段階フォールバック

画像取得のロジックはpageimages → 検索API → ページ内画像一覧の3段階。これにより、ページ名が多少違っていても画像を見つけられます。

3. ユーティリティ画像の除外

Wikiページにはロゴやアイコンなど、キャラクターとは関係ない画像も含まれています。キーワードフィルタで除外しています。

skip_keywords = [
    "Wiki", "Logo", "Icon", "Favicon",
    "Banner", "Placeholder", "Template",
]

4. 適切なUser-Agent

ボットとして適切に振る舞うため、独自のUser-Agentを設定しています。

USER_AGENT = "CarsCharacterImageCollector/1.0 (Personal Research)"

5. --download オプション

デフォルトではURL収集のみ。--downloadフラグを付けたときだけローカルにダウンロードする設計です。

# URLの収集のみ(CSV出力)
python collect_images.py
 
# URL収集 + 画像ダウンロード
python collect_images.py --download

MediaWiki APIの基礎知識

今回使ったAPIのパラメータを整理しておきます。

ページ情報 + 画像の取得

GET /api.php?action=query
    &titles=Lightning McQueen   # ページタイトル
    &prop=pageimages|info       # 取得するプロパティ
    &piprop=original            # オリジナルサイズの画像
    &inprop=url                 # ページのURL
    &redirects=1                # リダイレクトを自動解決
    &format=json                # JSON形式で返す

ページの検索

GET /api.php?action=query
    &list=search              # 検索モード
    &srsearch=Lightning       # 検索キーワード
    &srlimit=1                # 結果の上限
    &format=json

ページ内の画像一覧

GET /api.php?action=query
    &titles=Lightning McQueen
    &prop=images              # ページ内の画像を列挙
    &imlimit=10               # 上限10件
    &format=json

画像ファイルのURL取得

GET /api.php?action=query
    &titles=File:Example.png  # ファイルタイトル
    &prop=imageinfo           # 画像の詳細情報
    &iiprop=url               # URLを取得
    &format=json

子ども向け「カーズ キャラクター図鑑」サイトを公開

収集したデータを活用して、カーズ キャラクター図鑑 を公開しました。

全3作品・125体以上のキャラクターを作品別に一覧できるサイトです。子どもと一緒に「このキャラクターなんて名前だっけ?」と調べながら映画を楽しむために作りました。

著作権への配慮

キャラクター画像はDisney/Pixarの著作物であるため、以下の点に配慮しています。

  • 引用元を明記: サイト上に「引用元:ディズニー公式 / Pixar Cars Wiki」と記載
  • ファン活動の範囲: 営利目的ではなく、ファンコミュニティとしての情報整理が目的
  • 画像の直接ホスティングは最小限: Wiki上の画像URLを参照する形で、不必要な複製を避ける
  • 権利者からの要請には即時対応: 削除要請があった場合は速やかに対応する方針

「好きだから作る」と「権利を尊重する」は両立できます。ファン活動を楽しみつつ、著作権者へのリスペクトを忘れないようにしています。


今後やりたいこと

  • キャラクター相関図の可視化: 取得したデータを使って、D3.jsやCytoscapeで関係性を可視化
  • 実車モデルとの対応表: 各キャラクターのモデルとなった実車の情報を紐付け
  • 短編・ゲーム版の追加: 「カーズトゥーン メーターの世界つくり話」や「カーズ・オン・ザ・ロード」のキャラクターも収集

まとめ

項目結果
対象キャラクター数125体以上(3作品)
取得成功率100%
使用言語Python(標準ライブラリのみ)
データソースPixar Cars Wiki(Fandom)
APIMediaWiki API
実行時間約2〜3分(レート制限込み)
公開サイトcars.printemps.tokyo

「好きなもの」と「プログラミング」が交わると、こういう楽しい遊びができます。APIでデータを集めて、子どもが楽しめるサイトにまで仕上げられたのは、親としても開発者としても嬉しい体験でした。

MediaWiki APIは非常に使いやすく、Fandomに限らずWikipediaその他のMediaWikiベースのサイトでも同じ手法が使えます。何かコレクションしたいデータがあれば、ぜひ試してみてください。


参考リンク