Tony Wang6 分で読めます2026年版 SofaScoreのスクレイピング方法(APIとPython)
2026年にSofaScoreのライブスコア・オッズ・ラインナップ・順位表をスクレイピングする3つの方法 — DIYのPython、ノーコードツール、構造化API — と法的な基礎知識。
2026年にSofaScoreを最も手早くスクレイピングする方法は、SofaScoreの文書化されていない内部APIとそのCloudflare保護を自力でリバースエンジニアリングする代わりに、正規化されたJSON(ライブスコア、試合詳細、ラインナップ、オッズ、インシデント、順位表)を返す構造化APIを呼び出すことです。DIYは可能で、実際に非公式クライアントのコミュニティも存在しますが、SofaScoreは公式の公開APIを提供しておらず、自身の利用規約も自動アクセスを制限しています。このガイドでは3つのアプローチすべてについて、それぞれ何が返ってくるのか、どこで行き詰まるのか、そして法的な基本事項を解説します。
なぜSofaScoreをスクレイピングするのか
公開されているSofaScoreのデータは、スポーツデータを扱うワークフローの一分野を支えています。
- ライブスコアとオッズのモニタリング — サッカー、バスケットボール、テニスにまたがって進行中の試合、スコア、賭けの市場を追跡します。
- チームと選手のリサーチ — ロースター、チームプロフィール、チームの試合履歴を一箇所で取得します。
- リーグと順位表のトラッキング — 順位、調子、シーズンごとの変化を追います。
- スポーツアナリティクス — 試合統計、ラインナップ、インシデント、対戦成績を分析や予測のパイプラインに取り込みます。
SofaScoreをスクレイピングするのは合法か
選択肢1:Pythonでの自作(そして見た目より難しい理由)
公式のSDKは存在しないため、DIYとはSofaScore自身のアプリが使っているのと同じ内部APIを呼び出すことを意味します。
import requests
resp = requests.get(
"https://api.sofascore.com/api/v1/search/all",
params={"q": "real madrid"},
)
data = resp.json() # frequently a Cloudflare 403 "challenge" page, not JSON
うまくいくときはうまくいきますが、いつまでも続くわけではありません。そして繰り返し起きる問題は、このAPIをリバースエンジニアリングしているコミュニティのクライアントによって、よく文書化されています。
- 公式APIがなく、安定性の保証もない。 SofaScoreは公開の開発者APIを提供していません。
api.sofascore.comは、そのウェブアプリやモバイルアプリが呼び出しているのと同じ、文書化されていない内部APIであり、SofaScoreが新しいアプリのバージョンを出荷するたびに、形やアクセスルールが変わる可能性があります。外部開発者向けの変更履歴はありません。 - Cloudflareのチャレンジ。 Sofascore-API-Bundleのクライアントドキュメントによれば、SofaScoreのエッジは
X-Requested-Withヘッダーがないリクエストすべてに対してCloudflareの403「チャレンジ」を返します。これを安定して突破するには、最新のTLSハンドシェイクも必要です。古いスタックはクリーンなIPからでもフィンガープリントされてしまいます。同じドキュメントによれば、一部のIP(特定のデータセンターの範囲、地域ブロックされた地域)はヘッダーの有無にかかわらず403を受け取ります。 - 技術的なハードルに加えて規約上のリスクもある。 クライアントがCloudflareを突破できるかどうかにかかわらず、自動アクセスやスクレイピングはSofaScore自身の利用規約(上記参照)に違反します。
- 中に入っても構造がない。 生のレスポンスは、文書化された公開の契約ではなく、SofaScoreの内部アプリのスキーマをそのまま反映しています。フィールド名やネストの構造が変わるたびに、自分でリバースエンジニアリングして再パースする必要があります。
選択肢2:ノーコードツール
ブラウザ抽出ツールやマーケットプレイスの「SofaScoreスクレイパー」アクターは、1試合や1つの表をCSVとしてエクスポートでき、単発の取得には十分です。しかしライブスコアやオッズは毎分変化し、試合日をまたいで複数の試合を追跡するのは監視パイプラインであり、単発のエクスポートではありません。まさにそこで、スケジュール実行するAPI呼び出しが優位に立ちます。
選択肢3:構造化されたSofaScore API
CrawloraのSofaScore APIは、検索、ライブイベント、試合詳細、オッズ、ラインナップ、順位表などのために文書化されたエンドポイントを提供し、1つのAPIキーから正規化されたJSONを返します。
curl -G "https://api.crawlora.net/api/v1/sofascore/search" \
-H "x-api-key: $CRAWLORA_API_KEY" \
--data-urlencode "q=real madrid"
続いてPythonで検索 → 詳細 → オッズ/ラインナップを連鎖させます。
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/sofascore"
# search resolves a team, player, or competition name to a numeric id
hits = requests.get(f"{base}/search", headers=h, params={"q": "real madrid"}).json()["data"]["results"]
event_id = 14025013 # from a search result's matches or the live-events endpoint
event = requests.get(f"{base}/event", headers=h, params={"id": event_id}).json()["data"]
odds = requests.get(f"{base}/event-odds", headers=h, params={"id": event_id}).json()["data"]
lineups = requests.get(f"{base}/event-lineups", headers=h, params={"id": event_id}).json()["data"]
イベントのレスポンスは正規化されたJSONです(フィールドは説明用です。スキーマはドキュメントで確認してください)。
{
"code": 200,
"msg": "OK",
"data": {
"event": {
"id": 14025013,
"slug": "bournemouth-liverpool",
"start_time": "2025-08-15T19:00:00Z",
"status": { "code": 100, "description": "Ended", "type": "finished" },
"tournament": { "id": 52, "name": "Premier League", "unique_tournament_id": 17 },
"home_team": { "id": 60, "name": "Bournemouth", "country": "England" },
"away_team": { "id": 44, "name": "Liverpool", "country": "England" },
"home_score": { "current": 2, "period1": 1, "period2": 1 },
"away_score": { "current": 4, "period1": 1, "period2": 3 },
"venue": { "name": "Vitality Stadium", "city": "Bournemouth", "capacity": 11307 }
}
}
}
順位表とライブイベントには、それぞれ専用の必須パラメータがあります。順位表にはシーズンid(tournament-seasonsで解決)、ライブイベントにはスポーツキーです。
standings = requests.get(f"{base}/standings", headers=h,
params={"id": 17, "season": 76986, "type": "total"}).json()["data"]
live = requests.get(f"{base}/live-events", headers=h, params={"sport": "football"}).json()["data"]
イベント(または順位表のスナップショット)ごとにfetched_atタイムスタンプ付きで1行を保存し、スケジュールを組んで再実行してください。live-eventsを一定間隔でポーリングすることが、進行中の試合を追跡する方法です。
収集できるもの
- チーム、選手、大会にまたがる包括的な検索。それぞれに数値id、スポーツ、国が付きます
- 試合(イベント)の詳細:ピリオドごとのスコア、ステータス、会場、審判、観客動員数、加えて所属する大会とシーズン
- 試合統計、ラインナップ(フォーメーション、スターティングメンバー、控え選手)、試合のインシデント(得点、カード、選手交代)、2チーム間の対戦成績
- 試合ごとの賭けの市場とオッズ — あくまで情報提供のみ(合法性のセクションを参照)
- チームプロフィールとチームの試合履歴・ロースター、選手プロフィール
- リーグの順位表(総合、ホーム、アウェイ)、大会のシーズンとラウンドごとの試合日程
- スポーツ別(サッカー、バスケットボール、テニス)の進行中のライブイベント
制約とよくある課題
- 頼れる公式APIがない。 これはすべてSofaScoreの内部アプリAPIに基づいています。SofaScoreがそれを変更すると、DIYコードもスクレイパーも事前にではなく事後に対応することになります。
- CloudflareとIPレピュテーション。 正しいヘッダーだけでは、あらゆるネットワークからのアクセスは保証されません。上記で引用した非公式クライアントのドキュメントによれば、特定のデータセンターの範囲や一部の地域は完全にブロックされます。
- オッズは情報提供用であり、賭けのフィードではない。 SofaScore自身の利用規約は、表示されるオッズはあくまで情報提供のみを目的としており、賭博サービスでも、法的・税務上の助言でもないとしています。ライセンスされた賭け用のオッズフィードとしてではなく、参考情報として扱ってください。
- プッシュ型・リアルタイムではない。 ここでの「ライブ」とは、
live-eventsエンドポイントをスケジュールに沿ってポーリングすることを意味します。WebSocketやストリーミングのフィードは存在しないため、実際にスコアがどれくらいの頻度で更新される必要があるかに合わせて、ポーリング間隔を選んでください。 - シーズンidは変わる。 大会のシーズンidは毎年変わります(たとえばプレミアリーグのシーズンidは年ごとに異なります)。id を固定でハードコードするのではなく、その都度
tournament-seasonsで解決してください。
出典
この機能が役立つ場面
まずは無料でお試しください: 任意の公開URLを無料ウェブスクレイパーに通すか、アンチボットチェッカーでサイトがボットをブロックしているかどうかを確認できます。サインアップは不要です。
SofaScoreのデータは、ライブスポーツダッシュボード、チームや選手のリサーチ、順位表のトラッキングを支えます。他のリーグにまたがる米国向けのスコア、順位表、ロースターについてはESPN APIを、1つのリーグを余すところなく深掘りする——日程、ボックススコア、選手成績——にはMLBのスクレイピング方法を参照してください。試合日程が手に入ったら、Ticketmasterのスクレイピング方法がまさにそれらの試合のチケット市場をカバーしています。スコアそのものではなく同じ試合をめぐる検索やソーシャルの関心については、2026年ワールドカップ決勝後にアメリカが検索したものを参照してください。より広いツールキットについてはウェブスクレイピングAPIの選び方を、法的な基本事項については2026年、ウェブスクレイピングは合法かを参照してください。
Playgroundでエンドポイントを試し、APIドキュメントでリクエストとレスポンスのスキーマを確認し、料金ページでクレジットのコストを確認して始めましょう。
よくある質問
SofaScoreに公式の公開APIはありますか?
いいえ。SofaScoreは公開の開発者APIを提供していません。データは、SofaScore自身のウェブアプリやモバイルアプリが呼び出している、文書化されていない内部API(api.sofascore.com)から来ており、コミュニティのプロジェクトがそれをリバースエンジニアリングしています。SofaScoreが新しいアプリバージョンを出荷するたびに、形やアクセスルールが変わる可能性があり、外部開発者向けの変更履歴はありません。
ブロックされずにSofaScoreをスクレイピングできますか?
api.sofascore.comへのDIYリクエストでX-Requested-Withヘッダーがないものは、Cloudflareの403「チャレンジ」を受け取ります。サードパーティのクライアントドキュメントによれば、正しいヘッダーを付けてもあらゆるネットワークからのアクセスが保証されるわけではなく、一部のIP(特定のデータセンターの範囲、地域ブロックされた地域)はそれでも403を受け取ります。構造化APIは、ヘッダー、TLS、IPルーティングを1つのキーの裏側で処理します。
SofaScoreをスクレイピングするのは合法ですか?
SofaScoreのライブスコアや統計は公開されているウェブコンテンツですが、SofaScore自身の利用規約は自動アクセスやスクレイピングを禁止し、データを保護されたデータベースとして扱い、プラットフォームの利用を個人的な非商用利用に限定しています。商用利用の前に利用規約と現地の法律を確認してください。法的助言ではありません。
SofaScoreのオッズを賭け関連の商品に使えますか?
いいえ — SofaScore自身の利用規約は、プラットフォームに表示される賭けのオッズはあくまで情報提供のみを目的としており、賭博サービスではなく、法的・税務上の助言でもないと定めています。オッズデータは、賭け用商品向けのライセンスされたフィードとしてではなく、リサーチや分析のための参考情報として扱ってください。
SofaScoreのどんなデータを収集できますか?
チーム、選手、大会にまたがる包括的な検索。試合の詳細、統計、ラインナップ、インシデント、対戦成績。試合ごとの賭けのオッズ。チームと選手のプロフィール。リーグの順位表(総合、ホーム、アウェイ)。大会のシーズンとラウンドごとの試合日程。そしてスポーツ別(サッカー、バスケットボール、テニス)の進行中のライブイベント。
チーム、選手、試合のidはどうやって見つけますか?
/sofascore/searchをフリーテキストの名前付きで呼び出してください。レスポンスは、チーム・選手・大会の種別が付いた数値idを、スポーツと国とともに返します。特定の試合については、idを推測するのではなく、チームの試合履歴やlive-eventsフィードから取得してください。
ライブスコアはどのくらいの頻度で更新できますか?
live-eventsエンドポイントは、呼び出した時点でのスポーツ別(サッカー、バスケットボール、テニス)の進行中の試合を返します。WebSocketやストリーミングのフィードは存在しないため、プランと責任ある利用の範囲内で、実際にスコアがどれくらいの頻度で更新される必要があるかに合わせたポーリング間隔を選んでください。