
【競馬AI開発#24】レース直前オッズを「高速」かつ「無料で」取得する方法
今回は、馬券購入時の期待リターン計算に必要なレース直前オッズのデータを、netkeiba.comプレミアム会員に登録しなくてもJRAサイトから無料で取得する方法について解説します。
netkeiba.comでは出馬表ページのオッズ更新に回数制限が設けられており、通常この制限を解除するにはプレミアム会員に登録する必要があります。

この関係で、スクレイピングによって出馬表から単勝オッズを取得しようとしても、レース直前の正確なオッズを取得することができません。
他の手段として、JRAの公式サイトであれば、直前オッズを閲覧することはできるのですが…

JRA公式サイトは、同じURL(https://www.jra.go.jp/JRADB/accessO.html)のままページ遷移するタイプのサイトになっており、このような場合普通にスクレイピングしようとしても上手くいきません。
では、このような「URLが変わらないサイトのスクレイピング」はどのように行えば良いのでしょうか?
この【競馬AI開発】シリーズでは、競馬予想AIを作ることを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っています。
ソースコードは、下に進んでダウンロード・解凍すれば使うことができるので、適宜手元で参照・実行しながらお読みください。
■筆者のプロフィール
東京大学大学院卒業後、データサイエンティストとしてWEBマーケティング調査会社でWEB上の消費者行動ログ分析などを経験。
現在は、大手IT系事業会社で、転職サイトのレコメンドシステムの開発を行っています。
ソースコードのダウンロード
■ディレクトリ構成概略
.
├── common ・・・スクレイピングなど、データ取得部分
│ ├── data
│ └── src
├── v3_1_1 ・・・旧バージョン
│ ├── data
│ └── src
└── v3_2_0 ・・・今回作成する新バージョン
├── data
└── src
├── create_features.ipynb ・・・データ前処理・特徴量作成を実行するnotebook
├── offline_evaluation.ipynb・・・オフライン検証を実行するnotebook
├── train.ipynb ・・・本番運用時のモデル学習を実行するnotebook
├── prediction.ipynb ・・・本番運用時の予測処理を実行するnotebook
├── create_population.py ・・・学習母集団を作成する関数を定義
├── preprocessing.py ・・・/common/rawdf/のデータを前処理する関数を定義
├── feature_engineering.py ・・・機械学習モデルにインプットする特徴量を作成するクラスを定義(学習時)
├── feature_engineering_prediction.py ・・・機械学習モデルにインプットする特徴量を作成するクラスを定義(予測時)
├── config.yaml ・・・学習に用いる特徴量一覧
├── config_odds_removed.yaml・・・学習に用いる特徴量一覧(オッズと人気を抜いたモデル)
├── train.py ・・・学習処理を行うクラスを定義
├── evaluation.py ・・・モデルの精度評価を行うクラスを定義
└── prediction.py ・・・予測処理を行う関数を定義