Tony Wang7 分で読めますMLBデータのスクレイピング方法【2026年版】(API & Python)
2026年版MLBデータ取得ガイド。MLB非公式のStats API、ノーコードツール、構造化APIを実際のJSON例と法的注意点とともに解説。
MLB にはすでに野球データを取得する無料の方法があります。statsapi.mlb.com にある、広く使われているキー不要の JSON API です。これは MLB.com 自体を支え、コミュニティで人気の MLB-StatsAPI や pybaseball という Python ライブラリの裏側にもなっています。落とし穴は、MLB がこれを公式に公開したことは一度もないという点です——デベロッパーポータルも、変更履歴もなく、次のデプロイでフィールドが移動したり消えたりしないという保証もありません。このガイドでは、この非公開エンドポイント、ノーコードツール、そして構造化されたドキュメント付きの MLB API を取り上げ、さらに MLB 自体の利用規約がデータの複製・再配布について実際どう定めているかも解説します。
MLB のデータをスクレイピングする理由
MLB のスケジュール、順位表、ロースター、スタッツのデータは、次のような定番のプロダクト群を支えています。
- ファンタジーベースボールツール — ラインナップの判断材料となるロースター、選手スタッツ、対戦スケジュール。
- スポーツベッティングとオッズのコンテキスト — 他所のオッズデータと組み合わせる試合スケジュール、スコア、順位表。
- 過去データと分析リサーチ — パフォーマンス分析のための、シーズン別のリーグ・選手スタッツの内訳。
- ファン向け・メディア向けアプリ — ライブスコアボード、順位表ウィジェット、トランザクション(移籍・契約)トラッカー。
- 複数リーグにまたがるスポーツ報道 — MLB の野球特化の深さを、ESPN のマルチスポーツスコアボードや SofaScore のライブイベントカバレッジと組み合わせ、より広いスポーツデータパイプラインを構築できます。
MLB のデータをスクレイピングするのは合法か?
選択肢1: MLB 自身の非公開 Stats API(そしてなぜそれに頼るのはリスキーか)
statsapi.mlb.com は認証を一切必要としません——API キーもベアラートークンも不要で、ただの GET リクエストです。
curl "https://statsapi.mlb.com/api/v1/schedule?sportId=1&date=2026-04-15"
# team lookups work the same way:
curl "https://statsapi.mlb.com/api/v1/teams?sportId=1"
これは本物であり、無料であり、コミュニティが保守する MLB-StatsAPI や pybaseball という Python パッケージが内部で呼び出しているのとまさに同じものです——どちらも趣味や分析プロジェクトで広く使われており、この同じエンドポイントをラップした非公式・非提携のラッパーであることを明記しています。したがって正直なところ、「MLB には API がない」という捉え方は正確ではありません——API は存在し、何年も前からキー不要でオープンです。問題は「非公開」であることが本番運用で実際にどんなコストになるかです。
- 公式ドキュメントが一切存在しない。 出回っているエンドポイント、パラメータ、フィールド名(
sportId、hydrate、ネストされたteams.home/teams.awayの構造)はすべて、MLB が公開したものではなく、サードパーティによってリバースエンジニアリングされたものです。 - 変更履歴も安定性の保証もない。 正式に承認されたデベロッパー向けプロダクトではないため、MLB はデプロイの合間にフィールドの名前を変えたり構造を変えたり削除したりすることができ、依存している側には一切通知されません。
- 公開されているレート制限がない。 リトライ/バックオフ戦略を設計する拠り所は、コミュニティの試行錯誤以外にありません。
- 呼び出しによってスキーマの深さが変わる。 boxscore や play-by-play のようなネストされたリソースには
hydrateパラメータが必要ですが、これはコミュニティのドキュメントが仕様書ではなく実地調査によって突き止めたものです。 - MLB.com のリデザイン1回で、パイプラインが壊れる可能性があります。しかも何が変わったのか問い合わせるサポート窓口もありません。
選択肢2: ノーコードツール
汎用のノーコードスクレイパーやマーケットプレイスのアクターは、1日分のスコアボードや順位表を単発でエクスポートする程度なら取得できます。ただし内部ではほぼ同じ非公開の statsapi.mlb.com エンドポイントをラップしているだけなので、選択肢1と同じスキーマ変動のリスクを引き継ぎます。また、MLB を他のスポーツプラットフォームと1つのスキーマに正規化するという課題は解決してくれません。
選択肢3: 構造化された MLB API(Crawlora 経由)
構造化された MLB API を使えば、MLB が予告なく作り変えるかもしれないエンドポイントを信頼する代わりに、ドキュメント化され正規化されたスキーマが手に入ります——認証ヘッダーは1つ、JSON は一貫しており、ESPN や SofaScore など他のスポーツプラットフォームとも足並みが揃います。チームのスケジュールを取得してみましょう。
curl -G "https://api.crawlora.net/api/v1/mlb/schedule" \
-H "x-api-key: $CRAWLORA_API_KEY" \
--data-urlencode "team_id=147" \
--data-urlencode "start_date=2026-04-01" \
--data-urlencode "end_date=2026-04-07"
{
"code": 200,
"data": {
"start_date": "2026-04-01",
"end_date": "2026-04-07",
"team_id": 147,
"total_games": 6,
"games": [],
"fetched_at": "2026-08-09T12:00:00Z",
"source_url": "https://statsapi.mlb.com/api/v1/schedule"
}
}
続いて、Python で id を指定して選手やチームのスタッツを取得します(実際のフィールドです——splits[] の完全な形は ドキュメント で確認してください)。
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/mlb"
teams = requests.get(f"{base}/teams", headers=h, params={"season": 2026}).json()["data"]["teams"]
stats = requests.get(
f"{base}/player-stats", headers=h,
params={"id": 660271, "season": 2026, "group": "hitting"},
).json()["data"]
print(stats["player_id"], stats["season"], stats["group"], stats["total"])
チームレベルのスタッツも同じ形です(プレシーズン中は空になる、実際のライブエンドポイントのレスポンスです)。
{
"code": 200,
"data": { "team_id": 147, "season": 2026, "group": "hitting", "splits": [] }
}
roster、順位表、トランザクション、試合詳細の各エンドポイントも、id を渡せば JSON が返ってくる同じパターンです。/mlb/team-roster(team_id、season、roster_type)、/mlb/standings(season、type)、/mlb/transactions(start_date、end_date、team_id、player_id)、そして /mlb/game / /mlb/game-boxscore / /mlb/game-play-by-play(id — schedule や transactions のレスポンスから得られる game_id)です。試合ごと、あるいは選手のシーズンごとに1行を保存し、スケジュールを組んで再実行しましょう。
収集できるもの
公開されている MLB Stats API のデータを正規化したものです。schedule(日付、日付範囲、またはチーム別、total_games と games 配列付き)、standings(シーズンとタイプでグループ化)、teams(そのシーズンの全球団一覧)、team roster(チームとシーズン別、roster_type 付き)、選手詳細と選手スタッツ(id、シーズン、スタッツグループ別——打撃・投球・守備)、チームスタッツ(チームレベルでの同じグループ/シーズン別内訳)、リーグ全体のスタッツリーダー(league-stats、シーズンとグループ別)、試合詳細・ボックススコア・プレーバイプレー(game_id 別、plays[]・linescore・decisions 付き)、そしてトランザクション(日付範囲、チーム、または選手による、トレード・契約・ロースター異動)です。
制約とよくある課題
- 2つの異なる法的領域がある。
mlb.comの利用規約はウェブサイトとそのコンテンツを規律しますが、statsapi.mlb.comには独自の公開された規約がありません。キー不要でアクセスできることを無制限の利用と混同せず、商用・大規模利用の範囲は MLB の実際の利用規約に照らして慎重に検討してください。 - 非公開エンドポイントは予告なく変わりうる。
statsapi.mlb.comに直接依存する構成にする場合、フィールド名が黙って変わることや、確認できる変更履歴がないことを前提に予算を組んでください。 - id 単位のファンアウトが必要。 試合の完全な記録(boxscore、play-by-play、decisions)は
game_idごとに1回の呼び出しが必要で、シーズン分の選手スタッツを取得するには roster や検索結果から得た id を反復処理する必要があります。 - プレシーズンやオフシーズンはデータが薄い。 上で示した通り、シーズン外では stat-split や schedule のレスポンスが正当に空配列を返すことがあり、これは呼び出しが壊れているわけではありません。
- 公開データのみ。 これは MLB が自らのライブエンドポイントを通じてすでに提供しているものを収集するだけであり、コンテンツの商用再配布に関する MLB のライセンスを回避する手段では決してありません。
どこで使われるか
- ファンタジーベースボールツール — ロースターとスタッツの内訳に基づくラインナップやウェーバーの判断。
- 分析とリサーチ — シーズン別の選手・チームの過去のパフォーマンス。
- スポーツメディア向けダッシュボード — ライブスコアボード、順位表、トランザクションフィード。
- 複数リーグにまたがるスポーツプロダクト — MLB の野球の深さを、ESPN のマルチスポーツスコアボードや SofaScore のライブイベントカバレッジと組み合わせる。
出典
収集を始める
まずは無料でお試しください: 任意の公開 URL を無料ウェブスクレイパーに通すか、アンチボットチェッカーでサイトがボットをブロックするかどうかを確認できます。サインアップ不要です。
schedule、standings、player-stats の各エンドポイントをプレイグラウンドで試し、API ドキュメントでスキーマを確認し、料金をご覧ください。複数スポーツにまたがるスコアボードやニュースには ESPN の方が適しています。シーズンを通したスタッツの内訳、ロースター、プレーバイプレーが必要になったら、MLB がより深い野球専用のデータソースです。SofaScore は MLB の対象外のスポーツについて、ライブイベントカバレッジを補ってくれます。同じハブクラスター内のゲーム分野では、PlayStation Store のスクレイピング方法がコンソールカタログの価格やセール情報を扱っています。スケジュールが手に入ったら、Ticketmaster のスクレイピング方法で同じ試合のチケット市場側を扱っています。あわせてウェブスクレイピング API の選び方とウェブスクレイピングは合法かもご覧ください。
よくある質問
MLBには公式の公開APIがありますか?
セルフサーブで文書化されたものはありません。MLBはstatsapi.mlb.comで無料・キー不要のJSON APIを運用しており、これはMLB.com自体を動かし、MLB-StatsAPIやpybaseballといったコミュニティライブラリの裏側にもなっていますが、MLBはこれについて公式ドキュメント、変更履歴、開発者ポータルを一度も公開していません。コミュニティによってリバースエンジニアリングされたものであり、公認された製品ではありません。
statsapi.mlb.comを使うのは合法ですか?
これはmlb.comの利用規約とは別の問題です。同規約はMLB Digital Propertiesの書面許可のない複製・再配布を制限しています。statsapi.mlb.com自体には第三者が根拠にできる公開規約がありません。MLBがすでにキーなしで提供しているデータの非商用・個人利用は実務上リスクが低いですが、商用または大規模な用途には自ら法的見解を得てください。これは法的助言ではありません。
本番アプリでstatsapi.mlb.comに依存できますか?
可能ですが、リスクを見込んでおく必要があります。変更履歴もSLAもなく、MLBは第三者利用向けに安定したスキーマを約束したことがないため、フィールドが予告なくリネームや再構成される可能性があります。
MLB Stats APIから取得できるデータは何ですか?
スケジュール、順位表、チーム、チームロースター、シーズン・グループ別(打撃/投球/守備)の選手・チーム統計、リーグ全体の統計リーダー、ボックススコアとプレーバイプレーを含む試合詳細、そしてトランザクション(トレード、契約、ロースター変更)です。
特定選手の統計はどうやって調べますか?
チームロースターのレスポンスから選手のMLB idを解決し、そのid・シーズン・統計グループ(例:hittingやpitching)を指定してplayer-statsを呼び出します。
APIはライブ進行中の試合をカバーしますか?
gameおよびplay-by-playエンドポイントはgame_idに基づいて試合の現在の状態(ラインスコアや勝敗を含む)を返すため、呼び出すタイミングによってライブ試合または終了試合を反映します。
このシリーズにおけるMLBとESPNやSofaScoreの違いは何ですか?
ESPNとSofaScoreは多数のスポーツ・リーグにまたがるスコアボードと順位表を同時にカバーします。MLBの構造化APIは単一スポーツをより深く掘り下げ、シーズン全体の統計内訳、ロースター、プレーバイプレーを提供し、リーグ横断の広さではなく野球特有の深さを必要とする製品に向いています。