【Python】AniList API で2026年アニメ・人気キャラ情報を取得してグラフ化する方法

  • URLをコピーしました!
目次

はじめに

AniList は、アニメやマンガの作品情報、放送スケジュール、声優、ユーザー評価などを網羅した大規模なデータベースサイトです。同サイトが提供する「AniList API」は、クエリ言語に GraphQL を採用しており、プログラムから必要なデータのみを効率的に抽出できる特徴があります。本記事では、Python を利用して「2026年放送予定のアニメ」や「人気キャラクター」の情報を取得し、グラフ化して分析する手順を解説します。

手軽に最新トレンドを確認したい方へ

2026年のアニメ情報や人気キャラクターのデータを今すぐ視覚的に確認したい方向けに、専用の Web ダッシュボード「anitap ダッシュボード」を公開しています。情報収集のみを目的とされる場合は、以下のリンクよりご活用ください。

この記事でわかること
  • AniList API の仕組み: 従来の REST API とは異なる GraphQL の基本的な使い方
  • 未来のトレンド予測: Python を使って「2026年放送予定」のアニメ情報を先取りする方法
  • キャラ情報の取得: 作品だけでなく、人気キャラクターや声優のデータを抽出するテクニック
  • データの可視化: 取得したデータを Matplotlib でグラフ化し、視覚的に分析する方法

AniList API の特徴と GraphQL の基礎

AniList API は、Facebook(現 Meta)が開発したクエリ言語 GraphQL を採用しています。 従来の REST API との違いを簡単に言うと、「定食(セットメニュー)」か「ビュッフェ(好きなものを好きなだけ)」かの違いです。

なぜ AniList は使いやすいのか

AniList API が個人開発者や学習用に推奨される理由は、その手軽さにあります。

登録不要(APIキーなし)

多くの API は利用開始前にアカウント登録や API キーの発行が必要ですが、AniList の公開データ(作品情報やキャラ情報など)を取得するだけであれば、認証なしですぐにリクエストを投げることができます。

商用利用と制限

個人利用の範囲であれば、1分間に90リクエストという十分なレートリミットが設けられています。商用利用も可能ですが、その場合はレートリミットが厳しくなる場合があるため、規約の確認が必要です。

ドキュメントが充実

公式のドキュメントが非常に整理されており、ブラウザ上でクエリを試せる「GraphiQL(インタラクティブエディタ)」も提供されています。

独特なクエリ構造(GraphQL)の基本

GraphQL では、「欲しいデータ」をリクエスト時に定義します。 例えば、「アニメのタイトル」と「人気度」だけが欲しい場合、以下のようなクエリを投げます。

query {
  Media (id: 1) {
    title {
      romaji  # ローマ字タイトルだけください
    }
    popularity # 人気度だけください
  }
}

REST API だと、「作品 ID:1」のエンドポイントを叩くと、放送日やあらすじ、スタッフ情報など全部入りのデータが返ってきてしまいます(オーバーフェッチ)しかし GraphQL なら、必要なフィールドだけを指定するため、通信量が減り、レスポンスも高速になります。

実践

2026年放送予定のアニメ情報を先取りする

Googleトレンドなどの検索データを見ると、「2026 アニメ」のような未来のキーワードは、情報解禁のタイミングで急上昇する傾向があります。 AniList API のすごいところは、まだ放送されていない数年先の作品情報(制作決定済みのアニメなど)もデータベースに登録されている点です。

これを活用すれば、ブログやSNSで「2026年の注目アニメまとめ」といった記事を早く、しかも正確なデータに基づいて作成することができます。

Python スクリプトの解説(requests によるデータ取得)

では、実際に Python を使って「2026年に放送予定のアニメ」の中で、すでに期待度(人気度)が高い作品トップ5を取得してみましょう。

以下のコードは、API のエンドポイント(URL)にリクエストを送り、結果を JSON 形式で受け取るシンプルな構成です。

import requests
import json

# AniList APIのエンドポイント
url = "https://graphql.anilist.co"

# 取得したい年を動的に指定(ここを変えるだけで2025年や2027年も取得可能)
target_year = 2026

# GraphQLクエリの定義
# $seasonYear(年)を引数として受け取り、人気順(POPULARITY_DESC)で並べ替えます
query = '''
query ($seasonYear: Int, $page: Int, $perPage: Int, $sort: [MediaSort]) {
  Page (page: $page, perPage: $perPage) {
    media (seasonYear: $seasonYear, sort: $sort, type: ANIME) {
      id
      title {
        romaji
        english
        native
      }
      popularity
      status
    }
  }
}
'''

# クエリに渡す変数
variables = {
  "seasonYear": target_year,  # ここに2026が入る
  "page": 1,
  "perPage": 5,              # 上位5件を取得
  "sort": "POPULARITY_DESC"  # 人気順(期待度順)
}

# APIリクエストを実行
response = requests.post(url, json={'query': query, 'variables': variables})

# 結果をJSONとして整形
data = response.json()

# 結果の表示
if 'errors' in data:
    print(data['errors'])
else:
    print(f"--- {target_year}年 放送予定・期待度ランキング ---")
    for i, anime in enumerate(data['data']['Page']['media'], 1):
        title = anime['title']['native'] or anime['title']['romaji']
        print(f"{i}位: {title} (期待度: {anime['popularity']})")

【コード解説】seasonYear を動的に指定する

このスクリプトの肝は、variables 辞書の中で定義している "seasonYear": target_year の部分です。

GraphQL クエリ側(query 変数の中身)では、$seasonYear: Int と記述して「あとで整数の年が入りますよ」と枠だけ作っておきます。そして、リクエストを投げる瞬間に Python の変数 target_year = 2026 を流し込んでいます。

これにより、クエリ自体を書き換えることなく、

  • target_year = 2025 にすれば今年の覇権アニメを確認でき、
  • target_year = 2010 にすれば過去の名作を振り返る

ことができます。

この「変数の分離」こそが、GraphQL をプログラムから扱う際の最大のメリットです。

実践

アニメキャラクターの人気データを抽出する

AniList API の真骨頂は、作品情報からさらに深く掘り下げて、「その作品に登場するキャラクター」や「演じている声優(Voice Actor)」のデータまで一括で取得できる点にあります。

これを使えば、「特定の作品内で一番愛されている(お気に入り登録が多い)キャラは誰か?」や「主役キャラと脇役キャラの人気差」などを数値で分析できるようになります。

作品だけでなく「キャラクター(Character)」情報を抜くクエリ

キャラクター情報を取得するには、Media(作品)クエリの中に characters というフィールドを入れ子(ネスト)にします。

ここで重要なのが、edges というキーワードです。 GraphQL では、作品とキャラクターの間にある「関係性(Edge)」を通じてデータにアクセスします。これにより、単にキャラ名を取得するだけでなく、「その作品における役割(主役/脇役)」や「その作品で演じている声優」という、文脈ごとの情報を紐づけて取得できます。

特定の作品に紐づく人気声優やキャラの取得方法

では、実際に Python コードで取得してみましょう。 今回は例として、世界的な人気作『SPY×FAMILY』(タイトル検索)のキャラクター人気ランキングを取得し、担当声優名と合わせて表示します。

以下のコードでは、sort: FAVOURITES_DESC を指定して、AniList ユーザーからのお気に入り登録数(ハートの数)が多い順にキャラクターを抽出しています。

import requests
import json
import matplotlib.pyplot as plt

# AniList APIのエンドポイント
url = "https://graphql.anilist.co"

# 検索したいアニメのタイトル(日本語でも英語でもOKですが、英語・ローマ字が確実です)
search_title = "SPY×FAMILY"

# GraphQLクエリの定義
# 作品(Media)を検索し、その中のキャラクター(characters)を人気順で取得します
query = '''
query ($search: String) {
  Media (search: $search, type: ANIME) {
    title {
      romaji
      native
    }
    # キャラクター情報を人気順(FAVOURITES_DESC)で取得
    characters (sort: FAVOURITES_DESC, perPage: 10) {
      edges {
        role  # 役割 (MAIN / SUPPORTING)
        node {
          name {
            full
            native
          }
          favourites # キャラクターの「お気に入り」登録数
        }
        # そのキャラを担当する声優(日本語)を取得
        voiceActors (language: JAPANESE, sort: FAVOURITES_DESC) {
          name {
            full
            native
          }
        }
      }
    }
  }
}
'''

# 変数の定義
variables = {
  "search": search_title
}

# APIリクエスト
response = requests.post(url, json={'query': query, 'variables': variables})
data = response.json()

# エラーハンドリング
if 'errors' in data:
    print(data['errors'])
else:
    media = data['data']['Media']
    title = media['title']['native'] or media['title']['romaji']
    print(f"--- 『{title}』 キャラクター人気ランキング ---")
    
    # グラフ用データのリスト
    char_names = []
    char_favs = []

    for i, edge in enumerate(media['characters']['edges'], 1):
        char_node = edge['node']
        role = edge['role']
        favs = char_node['favourites']
        
        # 名前(英語表記があればそちらを優先、なければネイティブ)
        name = char_node['name']['full']
        
        # 声優情報(リストで返るため、最初の1人を取得)
        va_name = "情報なし"
        if edge['voiceActors']:
            va_name = edge['voiceActors'][0]['name']['native']

        print(f"{i}位: {name} (CV: {va_name}) - ❤️ {favs} [{role}]")
        
        # グラフ用にデータを格納
        char_names.append(name)
        char_favs.append(favs)

    # ---------------------------------------------------------
    # おまけ:取得したデータでグラフを作成
    # ---------------------------------------------------------
    plt.figure(figsize=(10, 6))
    # 棒グラフ(横向き)
    plt.barh(char_names, char_favs, color='skyblue')
    plt.xlabel("Favorites (Hearts)")
    plt.title(f"Top 10 Popular Characters in {title}")
    plt.gca().invert_yaxis() # 1位を上に
    plt.tight_layout()
    plt.show()

コードのポイント

edgesnode

edges の中にある role で「MAIN(主役)」か「SUPPORTING(脇役)」かを取得し、node の中でキャラクター自身の名前や人気度を取得しています。

voiceActors

キャラクターに紐づく声優情報を取得します。language: JAPANESE でフィルタリングすることで、日本語の声優のみをピンポイントで抽出しています。

favourites

これが「キャラクターの人気度」を示す数値です。作品自体の人気度(popularity)とは別に、キャラ単体への愛が数値化されたものです。

取得したデータを可視化する(Matplotlib)

データを取得できたら、最後はそれをグラフにして視覚的に分析しましょう。 数字の羅列だけでは見えてこない「人気度の差」や「圧倒的なシェア」も、グラフにすることで一目瞭然になります。

取得した JSON データを整形してグラフ描画

AniList API から返ってくるデータは JSON 形式(辞書とリストの入れ子構造)です。これを matplotlib でグラフ化するには、「X 軸のデータリスト」と「Y 軸のデータリスト」に分解する必要があります。

前のセクションで取得した data 変数から、リスト内包表記を使ってデータを抽出するのが最もスマートな方法です。

# JSONデータからリストを作成する(例:タイトルと人気度)
titles = [anime['title']['native'] for anime in data['data']['Page']['media']]
popularity = [anime['popularity'] for anime in data['data']['Page']['media']]

# グラフの作成
plt.barh(titles, popularity, color='cornflowerblue')
plt.xlabel("Popularity (Favorites)")
plt.title("2026 Anime Popularity Ranking")
plt.gca().invert_yaxis() # ランキング1位を上に表示
plt.tight_layout()
plt.show()

日本語フォント対応などの注意点

Python の matplotlib は、標準設定のままでは日本語が「□□□(通称:豆腐)」のように文字化けしてしまいます。 これを防ぐには、フォントを指定するか、便利なライブラリ japanize-matplotlib を導入するのが一番の近道です。

STEP
ライブラリのインストール
pip install japanize-matplotlib
STEP
コード内でのインポート

スクリプトの冒頭でインポートするだけで、自動的に日本語フォントが適用されます。

import matplotlib.pyplot as plt
import japanize_matplotlib  # これを入れるだけで文字化けが直ります

# ...グラフ描画コード...
plt.title("2026年アニメ 期待度ランキング") # 日本語が使えるようになる

まとめ

本記事では、AniList API と Python を使って、最新および未来のアニメ情報を分析する方法を解説しました。

AniList API とは

登録不要で利用でき、GraphQL によって「必要なデータだけ」を効率的に取得できます。

トレンドの先取り

seasonYear を指定することで、2026年などの「未来の放送予定アニメ」も先取りしてチェックできます。

深掘り分析

作品だけでなく、キャラクターや声優のデータも紐づけて取得できるため、「推し分析」や「キャスティング傾向」の調査も可能です。

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

インフラ(クラウド/NW/仮想化)から Web 開発まで、技術領域を横断して活動するエンジニア💻 コンシューマー向けエンタメ事業での新規開発・運営経験を活かし、実戦的な技術ノウハウを発信中

[ Certs ] CCIE Lifetime Emeritus / VCAP-DCA ✒️ [ Life ] 技術書・ビジネス書愛好家📖 / 小・中学校で卓球コーチ👟

目次