Tony Wang7 分で読めますアニメデータのスクレイピング方法【2026年版】(API & Python)
2026年のアニメデータ収集ガイド — 検索、タイトル、キャラクター、スタッフ、ランキング、放送スケジュールを DIY・ノーコード・構造化 API の3通りで、法的な論点とあわせて解説します。
2026年にアニメデータをスクレイピングする最も手早い方法は、正規化された JSON を返す構造化 API を呼び出すことです。タイトル検索、エピソード/フォーマットの詳細、キャラクターとスタッフのクレジット、おすすめ作品、ランキング、放送スケジュールまで、GraphQL クエリを自分で組み立てたり HTML をパースしたりせずに取得できます。アニメのメタデータは、映画データにおける TMDB のような単一の公式ブランド API の下には存在しません。実際に多くのサイトやアプリが基盤としているコミュニティカタログは、AniList(無料の公開 GraphQL API)と MyAnimeList(公式だが利用制限のあるベータ REST API、加えて広く使われている非公式の Jikan ラッパー)の2つです。このガイドでは、それぞれのソースが実際に何を提供しているか、DIY アプローチとその限界、そして同じ形のデータをプレーンな JSON として返す構造化 API を取り上げます。
なぜアニメデータをスクレイピングするのか?
- 発見・レコメンドアプリ — タイトル間のレコメンドグラフや共通のスタッフ/スタジオのクレジットを使って「これが好きならこちらも」といった提案を表示します。
- ファンコミュニティ向けツール — キャラクターのプロフィール、スタッフの役割、放送日をオンデマンドで必要とする Wiki ボット、Discord コンパニオン、トラッカー同期ツール。
- 配信カタログのリサーチ — プラットフォーム間でカタログをマッピングする際に、あるタイトルがどのスタジオ、どのシーズン、どのフォーマット(TV、ONA、映画)に属するかを突き合わせます。
- 市場・トレンドリサーチ — どのジャンルやフォーマットがシーズンごとの人気やスコアランキングで伸びているかを追跡します。
- AI/LLM パイプライン — チャットボットや RAG アプリのために、タイトル・キャラクター・スタッフの根拠あるナレッジベースを構築します。モデルの記憶に頼ると、マイナーなタイトルや最近の作品ではしばしば間違った情報になります。
アニメデータをスクレイピングするのは合法か?
選択肢1: Python で DIY する(そしてなぜ破綻するか)
AniList の公開データは GraphQL で配信されているため、DIY での取得は HTML を取得するのではなく、クエリを組み立てて POST することになります。
import requests
query = """
query ($search: String) {
Media(search: $search, type: ANIME) {
id
idMal
title { romaji english native }
format
status
averageScore
genres
}
}
"""
resp = requests.post(
"https://graphql.anilist.co",
json={"query": query, "variables": {"search": "Frieren"}},
headers={"Content-Type": "application/json"},
)
data = resp.json()["data"]["Media"]
単発の検索であれば動きますが、実際のボリュームでは早々に破綻します。
- GraphQL のスキーマが深い。 キャラクター、スタッフ、おすすめ作品はそれぞれ独立したネストされたクエリフラグメントで、それぞれに独自のページネーションがあります。タイトルの完全なレコードを取得するには、1つのエンドポイントではなく複数のクエリ形状を書いて(そして保守して)いく必要があります。
- 毎分90リクエストの制限は建前ではなく実際に強制されます。 バーストトラフィックには1分間のタイムアウトが課され、継続的な乱用は IP ブロックのリスクを伴います。タイトルごとにリクエストを分散させるスクレイパーはこの上限にすぐ達します。
- MAL とのクロスリファレンスは別ソースが必要です。 AniList の
idMalフィールドは MyAnimeList の ID を指しますが、MAL 側のフィールド(MAL 独自のスコアやランキングなど)を取得するには、MAL の利用制限付き公式 API か非公式の Jikan ラッパーへの2回目の呼び出しが必要で、それぞれ独自のレート制限とレスポンス形状を持ちます。 - 既製の放送スケジュールエンドポイントはありません。 「次に何が放送されるか」というフィードを組み立てるには、
Page.airingSchedulesクエリをページネーションしながら Unix タイムスタンプを自分で突き合わせる必要があります。
選択肢2: ノーコード/既製ツール
非公式の Jikan REST API は、ノーコードに近い選択肢としては最も一般的です。MyAnimeList の公開ページを、ドキュメント化されたエンドポイントとおおよそ毎分60リクエストで JSON としてラップしており、その上に構築された言語別ラッパーも複数存在します。プロトタイプや小規模な趣味のプロジェクトには十分に有用ですが、SLA のないコミュニティ運営のインフラであり、Jikan もマーケットプレイスのスクレイパーアクターも上記と同じレート制限・規約上のリスクを抱えています。第三者の稼働状況を見守る必要なくスケジュール実行できるパイプラインが必要な場合は、構造化 API の方が長期的に安定した選択肢です。
選択肢3: 構造化アニメ API
Crawlora のアニメデータ APIは、検索、タイトル詳細、キャラクター、スタッフ、おすすめ作品、ランキング、放送スケジュールを正規化された JSON として返します。API キー1つ、レスポンス形状1つで、GraphQL クエリの組み立ては不要です。タイトルを検索してみましょう。
curl "https://api.crawlora.net/api/v1/anime/search?query=Frieren" \
-H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"query": "Frieren",
"results": [
{
"id": 154587,
"id_mal": 52991,
"type": "ANIME",
"title": { "romaji": "Sousou no Frieren", "english": "Frieren: Beyond Journey's End" },
"format": "TV",
"status": "FINISHED",
"average_score": 91,
"popularity": 456965,
"episodes": 28,
"season": "FALL",
"season_year": 2023,
"genres": ["Adventure", "Drama", "Fantasy"],
"studios": ["MADHOUSE"]
}
]
}
}
Python では、ID を使ってタイトル詳細、キャラクター、スタッフ、おすすめ作品を取得できます。
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/anime"
title_id = 154587
title = requests.get(f"{base}/title/{title_id}", headers=h).json()["data"]
characters = requests.get(f"{base}/title/{title_id}/characters", headers=h).json()["data"]
staff = requests.get(f"{base}/title/{title_id}/staff", headers=h).json()["data"]
recs = requests.get(f"{base}/title/{title_id}/recommendations", headers=h).json()["data"]
タイトル詳細には、相互参照された MAL の ID を含む完全なレコードが含まれます(実際のフィールドはドキュメントで確認できます)。
{
"id": 154587,
"id_mal": 52991,
"title": { "romaji": "Sousou no Frieren", "english": "Frieren: Beyond Journey's End", "native": "葬送のフリーレン" },
"format": "TV",
"average_score": 91,
"popularity": 456965,
"favourites": 54038,
"season": "FALL",
"season_year": 2023,
"episodes": 28,
"genres": ["Adventure", "Drama", "Fantasy"],
"tags": [{ "name": "Elf", "rank": 91, "category": "Cast-Main Cast" }],
"studios": ["MADHOUSE"]
}
キャラクターとスタッフの検索も同じ形状に従います。/anime/character/search?query=Frieren は favourites 数を含む一致するキャラクターを返し、/anime/character/{id} は特定のキャラクターの出演作品を返します。ランキングと放送スケジュールはページネーションされたフィードです。
curl "https://api.crawlora.net/api/v1/anime/rankings?sort=POPULARITY_DESC&format=TV&genre=Fantasy" \
-H "x-api-key: $CRAWLORA_API_KEY"
curl "https://api.crawlora.net/api/v1/anime/airing-schedule?page=1&per_page=20" \
-H "x-api-key: $CRAWLORA_API_KEY"
タイトル(あるいはキャラクター単位、ランキングのスナップショット単位)で1行ずつ保存し、GraphQL のライブ接続を常時維持するのではなく、スケジュールに沿って再実行してください。
何を収集できるか
公開カタログのメタデータです。タイトル検索結果(ローマ字/英語/原語タイトル、フォーマット、ステータス、スコア、人気度、話数、シーズン、ジャンル、スタジオ)、相互参照された MyAnimeList の ID を含む完全なタイトル詳細、キャラクターレコード(名前、原語名、favourites 数、出演作品)、スタッフレコード(名前、役割、職種)、評価の重みを伴うタイトル間のおすすめ作品、ジャンル/フォーマット/シーズン/ステータスでフィルタリングされたランキング、そしてページネーションされた放送スケジュール(話数、放送時刻、放送までの時間)です。扱えるのは公開データのみで、非公開のユーザーリスト、視聴・閲覧履歴、あるいはユーザーレビューの一括転載は対象外です。
制限事項
- レート制限は実在し、単なる推奨ではありません。 AniList はバーストリミッター付きで毎分90リクエストを強制し、悪質なトラフィックには IP ブロックを行います。Jikan も独自の毎分上限を強制しているため、ページネーションとキャッシュの設計は両方を前提に行ってください。
- 2つの ID、2つの正典があります。 AniList の ID と MyAnimeList の ID は異なる番号体系であり、
id_mal/idMalを通じて相互参照されています。他のデータセットと結合する際に、両者を互換可能だと決めつけないでください。 - 商用利用の条件は明文化されています。 AniList の API は月間収益150ドル未満であれば無料ですが、それを超えると商用ライセンスが必要です。MAL の公式 API は登録済みクライアント ID を要求し、ユーザースコープのアクションには OAuth が必要です。
- 一括エクスポートやバックアップ用途は認められていません。 両方のソースを、自前のデータベースへ丸ごとミラーリングする対象ではなく、オンデマンドで問い合わせるカタログとして扱ってください。
- コミュニティが投稿するデータには欠落や修正があります。 スコア、タグ、タイトルさえもコミュニティのモデレーターによる更新で変わることがあるため、特定の時点のスナップショットを永続的に正しいものとして扱わないでください。
どこで使われているか
- レコメンド・発見機能 — 「似たタイトル」やスタッフ/スタジオを起点にした「これが好きならこちらも」という表示。
- シーズン・ジャンルのトレンド追跡 — 市場リサーチのためにシーズン、フォーマット、ジャンルでフィルタリングされたランキング。
- ファンツールとボット — コミュニティアプリ向けのキャラクター検索、スタッフクレジット、放送リマインダー。
- カタログ横断の突き合わせ — MAL のクロスリファレンス ID を使って、アニメタイトルを配信可否データやレビューデータセットと照合する。
出典
始めてみる
まずは無料で試す: 任意の公開 URL をFree Web Scraperにかけてみるか、Anti-Bot Checkerでサイトがボットをブロックしているか確認できます。サインアップは不要です。
検索・タイトル・キャラクターの各エンドポイントはPlaygroundで試し、スキーマはAPI ドキュメントで確認し、料金も参照してください。アニメのメタデータは、他のカタログシリーズと自然に組み合わせることができます。配信可否データはJustWatch APIで取得し、映画・TV のメタデータはhow to scrape TMDBで突き合わせ、コミュニティ評価は映画向けにhow to scrape Letterboxdが行っているのと同様の方法で追跡すれば、「何が配信されていて、どこで観られて、みんなはどう思っているか」というより完全なパイプラインを構築できます。ウェブスクレイピングは合法かも参照してください。
よくある質問
アニメデータベースには公式 API がありますか?
映画における TMDB のような単一の公式ブランド API はありません。AniList はコミュニティが投稿するメタデータを扱う無料の公開 GraphQL API を運営しており、MyAnimeList は独自の公式 REST API(v2、依然 Beta ラベル付き)を運営していて、公開データの読み取りには登録済みクライアント ID、ユーザースコープのアクションには OAuth が必要です。非公式の Jikan プロジェクトは MyAnimeList の公開ページを無料の REST API としてラップしています。
AniList や MyAnimeList を商用目的でスクレイピングできますか?
AniList の API 利用規約では、月間収益150ドル未満であれば無料で商用利用が認められていますが、それを超える場合は商用ライセンスが必要です。AniList はまた、データの大量収集、API をバックアップ/ストレージ層として使うこと、許可なく競合するアニメ/マンガのリストサービスやトラッカーを構築することを固く禁止しています。商用のものを構築する前には必ず実際の利用規約を確認してください。このガイドは法的助言ではなく一般的な情報として扱ってください。
アニメデータ API にはどのようなレート制限がありますか?
AniList はバーストリミッター付きでおおよそ毎分90リクエストを強制しており、悪質な IP アドレスを一時的にブロックすることもあります。MyAnimeList をラップする非公式の Jikan は同程度、おおよそ毎分60リクエストを目安としています。どちらも上限を超えると 429 レスポンスを返すため、ページネーションとキャッシュの設計はこれを前提に行う必要があります。
アニメ API のレスポンスにある id_mal フィールドとは何ですか?
そのタイトルの MyAnimeList 上の ID への相互参照です。MyAnimeList は独自の番号体系を持つ別のカタログであり、AniList は自身の内部 ID を割り当てたうえで idMal(または id_mal)を含めることで、両方のデータベース間でタイトルを照合できるようにしています。2つの ID 体系は互換ではありません。
構造化 API を通じてどのようなアニメデータを収集できますか?
代表的なフィールドとしては、タイトル検索結果(ローマ字・英語・原語タイトル、フォーマット、ステータス、スコア、人気度、話数、シーズン、ジャンル、スタジオ)、MyAnimeList のクロスリファレンス ID を含む完全なタイトル詳細、favourites 数と出演作品を含むキャラクターレコード、役割を含むスタッフレコード、タイトル間のおすすめ作品、ジャンル/フォーマット/シーズンでフィルタリングされたランキング、そしてページネーションされた放送スケジュールがあります。
MyAnimeList や AniList の非公開ユーザーリストデータをスクレイピングできますか?
できません。このガイドが扱うのは、すでに公開されているタイトルのメタデータ、キャラクター、スタッフのクレジット、ランキング、放送スケジュールといった公開カタログデータのみです。非公開のユーザーリスト、視聴履歴、ユーザースコープのアクションには本人自身の OAuth 認可が必要であり、公開スクレイピングの範囲外です。
AniList の GraphQL API を直接使うのではなく、構造化アニメ API を使うべきなのはなぜですか?
Crawlora のような構造化 API は、検索・タイトル詳細・キャラクター・スタッフ・おすすめ作品・ランキング・放送スケジューという同じ基盤のカタログデータを、フラットで正規化された JSON として返します。GraphQL クエリの組み立ても、リソースごとに個別のページネーションされたクエリフラグメントを保守する必要もなく、AniList と MAL 側の第2のソースを別々に扱う代わりに、1つのレート制限と1つの課金関係で済みます。