
大好きなカーズのキャラクター125体以上の画像をAPIで一括収集してみた
子どもの頃からずっと大好きなピクサー映画「カーズ」シリーズ。ライトニング・マックィーン、メーター、サリー……キャラクターの名前を挙げ始めたらキリがありません。
ある日、「全キャラクターの名前と画像を一覧にしたい」と思い立ちました。手作業で1体ずつ調べるのは大変すぎる。そこでプログラマーらしくAPIで自動収集することにしました。
最終的には子どもと一緒に見られる カーズ キャラクター図鑑 サイトとして公開するところまでいきました。
カーズシリーズのキャラクター数
まず、カーズシリーズの規模を振り返ってみましょう。
| 作品 | 公開年 | キャラクター数 |
|---|---|---|
| カーズ | 2006年 | 46体 |
| カーズ2 | 2011年 | 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) |
| 画像URL | Fandom上の画像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. 外部ライブラリ不要
requestsやBeautifulSoupを使わず、Python標準のurllibとjsonだけで完結しています。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 --downloadMediaWiki 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) |
| API | MediaWiki API |
| 実行時間 | 約2〜3分(レート制限込み) |
| 公開サイト | cars.printemps.tokyo |
「好きなもの」と「プログラミング」が交わると、こういう楽しい遊びができます。APIでデータを集めて、子どもが楽しめるサイトにまで仕上げられたのは、親としても開発者としても嬉しい体験でした。
MediaWiki APIは非常に使いやすく、Fandomに限らずWikipediaやその他のMediaWikiベースのサイトでも同じ手法が使えます。何かコレクションしたいデータがあれば、ぜひ試してみてください。
参考リンク
- カーズ キャラクター図鑑 - 今回のデータを活用して作った子ども向けサイト
- MediaWiki API公式ドキュメント
- Pixar Cars Wiki(Fandom)
- MediaWiki API:Query - Images
- MediaWiki API:Query - Pageimages