はじめに
本記事では、Pythonを活用してサッカーの試合データおよび関連する統計データ(オッズデータを含む)を合規かつ安全に取得・解析する方法を解説します。
スクレイピング(Web Scraping)によるデータ取得は、対象サイトの利用規約(ToS)違反やサーバーへの過度な負荷による法的リスクが伴う場合があります。そのため、今回は公式に公開されている信頼性の高い「The Odds API」を利用し、クリーンな手法でJSONデータを取得・パースする手順を紹介します。
- 準備:利用するAPIとライブラリ
データソースについて
今回は、開発者向けに無料枠が提供されている The Odds API を使用します。このAPIは、主要なスポーツリーグのデータ(プレミアリーグ、ラ・リーガなど)を構造化されたJSON形式で提供しています。
必要ライブラリのインストール
HTTPリクエストを送信するための requests ライブラリと、データを表形式に整形するための pandas を使用します。
Bash
pip install requests pandas
2. 実装コード
以下は、現在取得可能なサッカーの試合データとオッズ情報を取得し、データフレームに整形するコンプリートコードです。
import requests
import pandas as pd
1. APIの設定(The Odds APIから取得したAPIキーを入力してください)
API_KEY = 'YOUR_API_KEY_HERE'
SPORT = 'soccer_epl' # イングランド・プレミアリーグを指定
REGIONS = 'uk' # 地域(uk, us, eu, au)
MARKETS = 'h2h' # 勝ち・負け・引き分け(Head-to-Head)のオッズ
2. エンドポイントの構築
def fetch_soccer_odds():
try:
# 3. リクエストの送信
response = requests.get(url)
# ステータスコードの確認
if response.status_code == 200:
odds_data = response.json()
return odds_data
else:
print(f"APIエラー: ステータスコード {response.status_code}")
return None
except Exception as e:
print(f"接続エラーが発生しました: {e}")
return None
def parse_to_dataframe(data):
if not data:
return None
parsed_list = []
# 4. JSONデータのパース
for match in data:
home_team = match.get('home_team')
away_team = match.get('away_team')
commence_time = match.get('commence_time')
# ブックメーカーごとのデータを抽出
bookmakers = match.get('bookmakers', [])
for bookmaker in bookmakers:
b_name = bookmaker.get('title')
markets = bookmaker.get('markets', [])
for market in markets:
outcomes = market.get('outcomes', [])
# オッズ情報の取得
odds_dict = {outcome['name']: outcome['price'] for outcome in outcomes}
parsed_list.append({
'試合時間': commence_time,
'ホーム': home_team,
'アウェイ': away_team,
'データ元': b_name,
'ホーム勝オッズ': odds_dict.get(home_team, None),
'アウェイ勝オッズ': odds_dict.get(away_team, None),
'引き分けオッズ': odds_dict.get('Draw', None)
})
return pd.DataFrame(parsed_list)
実行部分
if name == "main":
raw_data = fetch_soccer_odds()
if raw_data:
df = parse_to_dataframe(raw_data)
# 結果の表示(最初の5行)
print(df.head())
- コードの解説と技術的ポイント
① HTTPステータスコードのハンドリング
response.status_code == 200 を確認することで、APIキーの失効やリクエスト回数制限(Rate Limit)を超えた際のエラーを適切にキャッチします。
② ネストされたJSONの展開
APIから返却されるデータは多層構造(ネスト)になっています。Pythonの辞書内包表記 odds_dict = {outcome['name']: outcome['price'] for outcome in outcomes} を使うことで、チーム名に対応するオッズ値を効率的にマッピングしています。
- コンプライアンスとスクレイピングにおける注意点(重要)
技術者がスポーツデータを取り扱う際、以下のコンプライアンス(法令順守)を必ず意識する必要があります。
API利用規約の遵守
WebサイトのHTMLを直接解析する(BeautifulSoup等を使った)スクレイピングは、多くのスポーツサイトやベッティングサイトの規約で明示的に禁止されています。アカウント停止や法的措置を避けるため、必ず公式APIを経由してください。
クォータ(利用制限)の管理
無料枠のAPIには1か月あたりのリクエスト上限があります。過剰なループ処理などでサーバーに負荷をかけないよう、必要に応じてキャッシュ(データのローカル保存)を実装してください。
データの利用目的
本コードで取得したデータは、個人利用、統計アルゴリズムの学習、データビジュアライズの練習など、非営利目的の範囲で利用してください。
まとめ
Pythonの requests と pandas を組み合わせることで、複雑なスポーツデータもわずか数十行のコードで綺麗なデータフレームに変換できます。適切なデータソースを選び、規約を守りながらデータサイエンスを楽しみましょう。もっと詳しく知る:https://wow88.my/game-rewards/