Tony Wang5 分で読めますESPN スポーツデータのスクレイピング方法 2026年版(API & Python)
2026年に ESPN のスポーツデータを取得する3つの方法——DIY Python、ノーコードツール、構造化 API。スコア・順位表・ロースター・スタッツを解説。
2026年に ESPN のスポーツデータを取得する最も速い方法は、スコア、順位表、ロースター、選手スタッツを正規化された JSON として返す構造化 API です。ESPN 自体は内部 JSON API の上で動いており、多くのオープンソースプロジェクトがそれを直接リバースエンジニアリングしています——動作はしますが、非公開で非公式であり、予告なく変わる可能性があります。このガイドでは、DIY のやり方、ノーコードツール、構造化 API、そして ESPN をスクレイピングすることの法的な実情を取り上げます。
ESPN をスクレイピングする理由
ESPN のデータ——スコア、順位表、ロースター、スタッツ、ニュース——は、次のような定番のプロダクト群を支えています。
- ファンタジースポーツツール — ラインナップやウェーバーワイヤーの判断材料となるロースター、選手スタッツ、負傷者情報。
- ベッティングとオッズ比較 — オッズデータと組み合わせる試合スケジュール、スコア、マッチアップのコンテキスト。
- スポーツニュースの集約 — 見出しとスコアを1つのフィードにまとめる。
- ファン向け・分析アプリ — スコアトラッカー、順位表ウィジェット、過去スタッツの検索。
ESPN をスクレイピングするのは合法か?
ESPN は Disney の傘下ブランドであり、その利用規約はDisney の利用規約を参照しています。これは「ロボット、スパイダー、スクリプト、その他の自動化された手段」を使って製品に「アクセスし、監視し、複製し、または抽出する」ことを明確に禁止しており、名指しでウェブスクレイピングとデータマイニングを含んでいます。唯一の例外は、robots.txt を尊重する公開検索エンジンのインデックス作成です。ESPN 自身の robots.txt は既知の AI クローラーの User-Agent を一律にブロックしており、それ以外の全員に対して管理画面、ログイン、いくつかのパラメータ付き/アーカイブパスへのアクセスを禁止しています。
これが espn.com のページを直接スクレイピングする際の法的背景です。実際に「ESPN API」として使われているものの多くは、ESPN 自身のアプリを支えている内部 JSON エンドポイント(site.api.espn.com)を対象にしており、サードパーティによって広くドキュメント化されています——ただし信頼できるどの情報源も、これがリバースエンジニアリングされた非公式の統合であり、公認された API ではなく、独自に公開された規約も存在しないと明言しています。それに応じて扱ってください。個人プロジェクトやプロトタイピングには問題ありませんが、自分自身で法的レビューをせずに商用プロダクトを構築する対象にはすべきではありません。一般的な枠組みについては2026年、ウェブスクレイピングは合法かを参照してください。
選択肢1: Python での DIY(そしてなぜ壊れるのか)
ほとんどの DIY ESPN スクレイパーは HTML を完全にスキップし、ESPN 自身のサイトが使っている非公開の JSON エンドポイントを直接呼び出します。
import requests
def get_scoreboard(sport="football", league="nfl"):
url = f"https://site.api.espn.com/apis/site/v2/sports/{sport}/{league}/scoreboard"
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
resp.raise_for_status()
return resp.json()
これは機能します——機能しなくなるまでは。繰り返し起こる失敗のパターンは次の通りです。
- ドキュメントも安定性の保証もない。 これらのエンドポイントは ESPN 自身の Web/モバイルトラフィックからリバースエンジニアリングされたものです。フィールドはデプロイの合間に、変更履歴が一切ないまま名前が変わったり、構造が変わったり、削除されたりします。
- スキーマはスポーツやリーグによって異なる。 サッカーのスコアボードのレスポンスは NFL のものと同じ形にはなりません——
nflで動くコードがeng.1では気づかないうちに壊れることがあります。 - User-Agent とレート制限によるブロック。 デフォルトの
requests系クライアントは予告なくブロックされたり制限されたりします。設計の拠り所となる公開されたレート制限もありません。 - ライブデータにはポーリングの規律が必要。 スコアはプッシュ機構なしにリアルタイムで更新されるため、ポーリングの間隔と重複排除は自分自身で管理する必要があります。
- HTML スクレイピングはさらに厄介。
espn.comのページを直接スクレイピングする方法に頼ると、上述の利用規約違反に直結するうえ、ヘッドレスブラウザが必要な JS レンダリングのライブスコアボードにも対処しなければなりません。
選択肢2: ノーコードツール
汎用のウェブスクレイパーは、単発のレポート用に1つのスコアボードや順位表を取得する程度なら可能です。継続的な運用には耐えられません——スポーツ/リーグをまたいだスケジューリングもなく、内部では DIY のアプローチと同じ非公開スキーマの脆さを引き継いでいます。
選択肢3: 構造化された ESPN API
マネージド API はスポーツ/リーグ間の違いを正規化し、スキーマの変動を吸収するため、同じコードが NFL、NBA、プレミアリーグなどで動作します。
curl -G "https://api.crawlora.net/api/v1/espn/scoreboard" \
-H "x-api-key: $CRAWLORA_API_KEY" \
--data-urlencode "sport=football" \
--data-urlencode "league=nfl"
import requests
resp = requests.get(
"https://api.crawlora.net/api/v1/espn/scoreboard",
headers={"x-api-key": "YOUR_API_KEY"},
params={"sport": "football", "league": "nfl"},
)
for game in resp.json()["data"]["games"]:
home, away = game["competitors"]
print(game["short_name"], game["status"]["detail"])
レスポンス例(フィールドはあくまで例示です——完全なスキーマはドキュメントを確認してください)。
{
"data": {
"sport": "football",
"league": "nfl",
"season": { "year": 2026, "type": 2, "name": "Regular Season" },
"count": 14,
"games": [
{
"id": "401547439",
"date": "2026-09-08T17:00Z",
"short_name": "KC @ BAL",
"status": { "state": "pre", "detail": "Sun 1:00 PM", "completed": false },
"venue": "M&T Bank Stadium",
"competitors": [
{ "team": { "id": "33", "abbreviation": "BAL", "display_name": "Baltimore Ravens" }, "home_away": "home", "score": null },
{ "team": { "id": "12", "abbreviation": "KC", "display_name": "Kansas City Chiefs" }, "home_away": "away", "score": null }
]
}
]
}
}
ロースター、個々の選手、順位表も同じ sport/league のパターンに従います。
curl -G "https://api.crawlora.net/api/v1/espn/team-roster" \
-H "x-api-key: $CRAWLORA_API_KEY" \
--data-urlencode "sport=basketball" \
--data-urlencode "league=nba" \
--data-urlencode "team=lal"
resp = requests.get(
"https://api.crawlora.net/api/v1/espn/standings",
headers={"x-api-key": "YOUR_API_KEY"},
params={"sport": "baseball", "league": "mlb", "season": 2026},
)
for group in resp.json()["data"]["groups"]:
print(group["name"], [e["team"]["abbreviation"] for e in group["entries"]])
どの方法を使うべきか?
| DIY Python | ノーコードツール | 構造化 API | |
|---|---|---|---|
| セットアップ時間 | 呼び出し自体は数分、動作を維持するには継続的な労力が必要 | 数分 | 数分 |
| メンテナンス | 高い——予告なく非公開スキーマが変わる | なし(内部では同じ脆さがある) | なし——プロバイダーが保守する |
| スポーツ横断の正規化 | スポーツ/リーグごとに自分で構築 | 提供されることはまれ | 標準搭載 |
| 最適な用途 | プロトタイピング、個人プロジェクト | 単発のクイックなエクスポート | 継続的なプロダクトやパイプライン |
収集できるもの
- スコアとスケジュール — フットボール、バスケットボール、野球、アイスホッケー、サッカーにまたがるライブおよび今後の試合
- 順位表 — シーズン別のディビジョン/カンファレンステーブル
- ロースターと選手 — 選手の詳細、ポジション、背番号、経験年数
- 試合詳細 — ボックススコア、および利用可能な場合はオッズ
- ニュース — スポーツ/リーグ別の見出しと記事へのリンク
制約とよくある課題
- 非公開は非公開のまま。 ESPN の内部 API を扱うどの情報源も同じことを言っています。SLA も変更履歴もなく、来月も同じ形である保証もありません。
- カバレッジはリーグによって異なる。 ランキングや一部の詳細エンドポイントは特定のスポーツ/リーグ(例:カレッジフットボール/バスケットボールのポール)のみを対象としています。
- 公式な商用条件が存在しない。 リバースエンジニアリングされたエンドポイントには公開されたレート制限もライセンスもありません——それを前提に設計してください。
- ライブスコアの鮮度はポーリング方式であり、プッシュ方式ではありません——自分のユースケースがどれだけ時間に敏感かに合わせて更新間隔を計画してください。
どこで使われるか
ESPN の構造化スタッツをSofaScoreと組み合わせれば、より広い国際サッカーのカバレッジが得られます。またGoogle トレンドと組み合わせれば、試合当日の検索関心と実際の結果を突き合わせられます。利用可能なすべてのエンドポイントについては、ESPN APIの完全なリファレンスを参照してください。
出典
収集を始める
プレイグラウンドで ESPN のエンドポイントを試し、API ドキュメントで完全なスキーマを確認し、料金ページでクレジットのコストを確認してください。関連ガイドとしては、より深いグローバルサッカーのカバレッジで同じライブスコアと順位表を扱うSofaScore のスクレイピング方法、1つのリーグのスケジュールとボックススコアを余すところなく扱うMLB のスクレイピング方法、Google トレンドのスクレイピング方法、そして2026年、ウェブスクレイピングは合法かを参照してください。
本記事はhow-to-scrapeガイドシリーズの一部です — 私たちが扱うすべてのプラットフォームを、1つのインデックスにまとめています。
よくある質問
Does ESPN have an official public API?
No. ESPN does not publish a public developer API. Its site and apps run on an internal JSON API (site.api.espn.com) that developers have reverse-engineered and widely documented, but it's unofficial, undocumented, and can change shape without notice — there's no changelog or SLA for outside developers.
Is it legal to scrape ESPN?
ESPN's Terms of Use route to Disney's Terms of Use, which explicitly ban automated access, monitoring, and scraping — including via ESPN's own undocumented JSON endpoints, which have no published terms of their own. Treat this as a Terms violation on paper; review your own legal exposure before commercial use. Not legal advice.
Can I scrape ESPN without getting blocked?
Default User-Agents and sustained request volume against ESPN's undocumented endpoints get throttled or blocked without documentation to design around. A structured API handles headers, rate limiting, and schema normalization across sports and leagues behind one key.
What sports and leagues are covered?
Football (NFL, college football), basketball (NBA, WNBA, men's and women's college), baseball (MLB), hockey (NHL), and major soccer leagues (Premier League, La Liga, Serie A, Bundesliga, Ligue 1, MLS, Champions League) — each addressed by a sport and league parameter on the same set of endpoints.
What ESPN data can I collect?
Scoreboards and schedules, standings by division/conference, team detail and rosters, individual athlete profiles, game summaries with box scores and odds where available, college football/basketball rankings, and news headlines — all per sport and league.
How current are the scores?
As current as the moment you call the scoreboard or game-summary endpoint — there's no push/websocket feed, so live coverage means polling on an interval that matches how fast you need updates.
Can I use ESPN odds data for a betting product?
Game-summary odds are informational market context sourced from ESPN's own data, not a licensed odds feed — treat it as research color, and get your own legal and licensing review before building a wagering product on it.