1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ピノのポケモンクイズを自作したい ~データ集め編~

Posted at

ある日のこと

こんな投稿を見つけた

妻「何かわかる?」
私「オニゴーリ」
妻「!?」
妻「なぜわかる?」
私「No.362といえばオニゴーリじゃな(オーキド博士)」

362.png

斜めになってるオニゴーリのシルエットは反則だと思うが。。。

そんなことから始まったポケモンクイズ

ans-625822515.png

私「タイプと体重、身長からポケモンがわかればポケモン博士になれるのでは?」

国立大の修士までしか取得していない自分からすれば博士(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} は見つかりませんでした")

みんな大好きピカチュウ
025.png

ちなみに740番と662番は上記のコードではとってくることができず、手動で取得した。
https://github.com/fanzeyi/pokemon.json/tree/master/images

次回は、このデータを使ってポケモンクイズappを作っていくぞ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?