ある日のこと
こんな投稿を見つけた
ピノにポケモンクイズが載ってたんだけど、難易度★5までありそうな感じ?気になる木 pic.twitter.com/TyxzUE2qGO
— いちな (@ichina0107) May 9, 2025
妻「何かわかる?」
私「オニゴーリ」
妻「!?」
妻「なぜわかる?」
私「No.362といえばオニゴーリじゃな(オーキド博士)」
斜めになってるオニゴーリのシルエットは反則だと思うが。。。
そんなことから始まったポケモンクイズ
私「タイプと体重、身長からポケモンがわかればポケモン博士になれるのでは?」
国立大の修士までしか取得していない自分からすれば博士(Phd)は憧れ
さっそく自分用のポケモンクイズアプリを作ろうと思った。
どうやってデータを集める?
調べてみると以下のようなものが見つかった
選択肢1
fanzeyi/pokemon.json
ポケモンの名前(他国語対応)、種族値がjsonでまとめられている
{
"id": 1,
"name": {
"english": "Bulbasaur",
"japanese": "フシギダネ",
"chinese": "妙蛙种子",
"french": "Bulbizarre"
},
"type": ["Grass", "Poison"],
"base": {
"HP": 45,
"Attack": 49,
"Defense": 49,
"Sp. Attack": 65,
"Sp. Defense": 65,
"Speed": 45
}
}
選択肢2
veekun/pokedex
以下のようなcsvなど多数収録されている
id identifier species_id height weight base_experience order is_default
1 bulbasaur 1 7 69 64 1 1
2 ivysaur 2 10 130 142 2 1
3 venusaur 3 20 1000 263 3 1
4 charmander 4 6 85 62 5 1
5 charmeleon 5 11 190 142 6 1
6 charizard 6 17 905 267 7 1
選択肢3
PokeAPI
ポケモンのデータを直接取得できるapi
まとめると
項目 | PokéAPI (https://pokeapi.co) | fanzeyi/pokemon.json | veekun/pokedex |
---|---|---|---|
ID(全国図鑑番号) | ✅ あり | ✅ あり | ✅ あり |
英語名 | ✅ あり | ✅ あり | ✅ あり |
日本語名 | ✅(一部、Lang指定必要) | ✅ 完全収録 | ✅(Lang対応あり) |
タイプ(Type) | ✅(複数対応) | ✅(2つまで) | ✅(複数対応) |
高さ(Height) | ✅(デシメートル単位) | ❌(未収録) | ✅(メートル) |
重さ(Weight) | ✅(ヘクトグラム単位) | ❌(未収録) | ✅(kg単位) |
種族値(種族ステータス) | ✅(HP, 攻撃, 防御等) | ❌ | ✅(詳細あり) |
説明文(図鑑テキスト) | ✅(世代・言語ごとにあり) | ❌ | ✅(複数言語対応) |
画像 | ✅(公式絵 or スプライト) | ✅(256×256 PNG) | ❌(画像なし) |
進化情報 | ✅(進化チェーンあり) | ❌ | ✅(進化先・方法含む) |
出現場所・捕獲率など | ✅(エリア情報あり) | ❌ | ✅(細かい場所まで) |
ゲームごとのデータ差異 | ✅(バージョン別あり) | ❌ | ✅(世代対応) |
わたしが欲しい情報は「日本語名」「タイプ」「高さ」「重さ」「イメージ」である。
種族値だけでポケモンを当てる廃人用のクイズも作りたいな
なので以下の戦略をとった。
手順概要
1.fanzeyi/pokemon.json から日本語名とタイプを取得
2.PokéAPI から身長・体重・タイプ(英語名ベース)を取得
3.名前 or ID をキーにしてマージ
4.CSVとして保存
5.タイプを日本語へ直す
import json
import csv
import requests
import time
# === Step 1: fanzeyi/pokemon.json を読み込み ===
with open("pokemon.json", encoding="utf-8") as f:
pokemon_data = json.load(f)
name_and_types = {
p["id"]: {
"name_jp": p["name"]["japanese"],
"types_json": p["type"]
}
for p in pokemon_data
}
# === Step 2: PokéAPI から height, weight, type を取得 ===
poke_stats = {}
for poke_id in name_and_types:
url = f"https://pokeapi.co/api/v2/pokemon/{poke_id}"
try:
res = requests.get(url)
res.raise_for_status()
data = res.json()
poke_stats[poke_id] = {
"height": data["height"] / 10, # decimeters → meters
"weight": data["weight"] / 10, # hectograms → kilograms
"types_api": [t["type"]["name"] for t in data["types"]]
}
except Exception as e:
print(f"Error fetching data for ID {poke_id}: {e}")
poke_stats[poke_id] = {
"height": None,
"weight": None,
"types_api": []
}
time.sleep(0.5) # APIに負荷をかけすぎないように
# === Step 3: CSVファイルとして保存 ===
with open("pokemon_full.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["id", "name_jp", "types_json", "types_api", "height(m)", "weight(kg)"])
for poke_id in name_and_types:
row = [
poke_id,
name_and_types[poke_id]["name_jp"],
", ".join(name_and_types[poke_id]["types_json"]),
", ".join(poke_stats[poke_id]["types_api"]),
poke_stats[poke_id]["height"],
poke_stats[poke_id]["weight"]
]
writer.writerow(row)
print("✅ pokemon_full.csv を出力しました。")
とりあえずこれで、以下のような出力は得られる
id name_jp types_json types_api height(m) weight(kg)
1 フシギダネ Grass, Poison grass, poison 0.7 6.9
属性を日本語にしたい!
import csv
# 英語→日本語のタイプ辞書
type_translation = {
"normal": "ノーマル", "fire": "ほのお", "water": "みず", "electric": "でんき",
"grass": "くさ", "ice": "こおり", "fighting": "かくとう", "poison": "どく",
"ground": "じめん", "flying": "ひこう", "psychic": "エスパー", "bug": "むし",
"rock": "いわ", "ghost": "ゴースト", "dragon": "ドラゴン", "dark": "あく",
"steel": "はがね", "fairy": "フェアリー"
}
# 元CSVファイル
input_file = "pokemon_data.csv"
# 出力ファイル(日本語タイプ付き)
output_file = "pokemon_data_jp.csv"
with open(input_file, encoding="utf-8-sig") as f_in, open(output_file, "w", newline="", encoding="utf-8-sig") as f_out:
reader = csv.DictReader(f_in)
fieldnames = reader.fieldnames + ["types_jp"]
writer = csv.DictWriter(f_out, fieldnames=fieldnames)
writer.writeheader()
for row in reader:
types_en = [t.strip() for t in row["types_api"].split(",")]
types_jp = [type_translation.get(t, t) for t in types_en]
row["types_jp"] = ", ".join(types_jp)
writer.writerow(row)
これを使えば以下のように日本語属性カラムを追加できる
name_jp types_api types_jp
フシギダネ grass, poison くさ, どく
ヒトカゲ fire ほのお
イメージを取得したい
ポケモンの画像を取得するため
import os
import requests
# 保存先ディレクトリ
save_dir = "pokemon_images"
os.makedirs(save_dir, exist_ok=True)
# fanzeyi/pokemon.json の画像URLベース
base_url = "https://raw.githubusercontent.com/fanzeyi/pokemon.json/master/images"
# 001.png ~ 898.png など(先頭0埋め3桁)
for i in range(1, 899): # 必要に応じて範囲を変えてください
filename = f"{i:03}.png"
url = f"{base_url}/{filename}"
save_path = os.path.join(save_dir, filename)
response = requests.get(url)
if response.status_code == 200:
with open(save_path, "wb") as f:
f.write(response.content)
print(f"✅ {filename} ダウンロード完了")
else:
print(f"⚠️ {filename} は見つかりませんでした")
ちなみに740番と662番は上記のコードではとってくることができず、手動で取得した。
https://github.com/fanzeyi/pokemon.json/tree/master/images
次回は、このデータを使ってポケモンクイズappを作っていくぞ。