スポンサーリンク

競馬AIの作り方 4話 データ収集

こんにちは。Gary設計者です。
今回はAI作成に必要なデータ収集方法を紹介します。
まだ過去の投稿を見てない方はそちらからお読みください。

競馬AIの作り方 0話 はじめに
競馬AIの作り方 1話 AI Toolの紹介
競馬AIの作り方 2話 AIの勉強方法
競馬AIの作り方 3話 AIを作ってみよう

AIの作成には過去のレース結果データが必要です。
中央競馬のデータはJRA-VANなどでデータベースが纏まっているそうですが、地方競馬のデータベースはあまりないかと思います。
Garyではnetkeiba.comをスクレイピングして過去のレース結果と競走馬の情報を取得しています。
スクレイピングで過去データを収集するのは時間がかかりますが、地方競馬のデータを一括でダウンロードできるデータベースはない(知らない)ので、ひたすら放置してやっています。
地方競馬のデータを一括ダウンロードできるサイトや方法があったら教えてください。。。

また、今回紹介する方法ではPythonを使っています。
Pythonの環境構築やライブラリの紹介などは省いているので、ご承知おきください。

過去のレース情報の収集

今回紹介する方法では不要ですが、最初にnetkeiba.comのurlのルールについて説明します。
2020年12月29日の大井第10R 東京大賞典競争を例にすると、過去レースの情報は下記のリンクで纏まっています。
https://db.netkeiba.com/race/202044122910/
2019年5月6日の船橋第11R かしわ記念を例にすると、過去レースの情報は下記のリンクで纏まっています。
https://db.netkeiba.com/race/201943050611/

ここからわかることとして、urlの【https://db.netkeiba.com/race/】の部分は共通で、数字のとこでレースの識別をしています。
レース開催の年をyyyy、月をmm、日をdd、競馬場をRR、レース数をNNとするとurlは下記の法則になっています。
https://db.netkeiba.com/race/yyyyRRmmddNN/
これは地方競馬で開催されるレースに限定したルールで、中央競馬のレースだと異なるので注意してください。

過去レース情報の入手手順としては下記の順番になります。

  1. 過去レースのyyyyRRmmddNNの情報を収集
  2. 順次過去レース情報にアクセスしてデータを保存

具体的なやり方ですが、実は上記ができるPythonスクリプトがGitHubに公開されています。
https://github.com/unonao/race-predict
1.に対応するPythonスクリプトがget_race_url.pyで2.に対応するのがget_race_html.pyです。
get_race_url.pyを実行すると下記のようなリンク集のテキストファイルを生成できます。

get_race_url.pyの生成物

get_race_html.pyを実行するとテキストファイルに記載してあるurlのhtmlを順次保存できます。
これで過去レースの情報をPCに保存ができました。
次にレースに出走する競走馬の情報を収集する方法を紹介します。

競走馬の情報収集

例として、オメガパフュームの情報が纏まっているurlは下記になります。
https://db.netkeiba.com/horse/2015104273
これも過去レースのurlと一緒の仕組みで、最後の10桁の数字で競走馬の識別をしています。

次にオメガパフュームが出走した東京大賞典のレース結果のhtmlを見てみましょう。
349行目にオメガパフュームの情報が書いてある行があります。

東京大賞典ののhtml

ここでオレンジでマークしている数字をみると、オメガパフュームの情報が纏まっているurlと一致しています。
また、html内で”umalink_”で検索をかけると、検索で引っかかる行には必ず競走馬のurlの数字が書かれています。
これでわかると思いますが、Pythonで下記を行うことで過去レースのhtmlから競走馬のhtmlが取得できます。

  1. 過去レースのhtmlを1行ずつ読み込み。
  2. umalink_“を含む行だったら競走馬の数字を取得
  3. 競走馬のhtml取得

これを取得した過去レースのhtmlに対して行うPythonスクリプトが下記になります。
これは私が作成したスクリプトなので書き方が微妙等あるかもしれませんが、そこは許してくださいね。

from bs4 import BeautifulSoup
import glob
import requests
import time
from bs4 import BeautifulSoup
import os


def get_html(url):
    time.sleep(1)
    response = requests.get(url)
    soup = BeautifulSoup(response.content)                    
    title = soup.find('title').text
    print(title)
    html = str(soup)
    return title, html

if __name__ == '__main__':
  filelist = glob.glob("race_html/*/*/*.html")
  for filepath in filelist:
    f = open(filepath, 'r', encoding='UTF-8')
    html_lines = f.readlines()
    for line in html_lines:
      if "umalink_" in line:
        horse_url_num = line.split("horse/")[1].split("/")[0]
        horse_html_path = "horse_html/" + horse_url_num + ".html"
        if os.path.exists(horse_html_path):
          continue
        horse_html_url = "https://db.netkeiba.com/horse/" + horse_url_num
        title, html = get_html(horse_html_url)
        with open(horse_html_path, 'w', encoding='UTF-8') as file:
          file.write(html)

今回はnetkeiba.comからのデータ収集方法について紹介しました。
ここで学べるスクレイピング技術は他にも応用できると思うので、是非やってみてください。
次回は今回取得したhtmlからデータの作り方を紹介します。

コメント

  1. うさぎのくろちゃん より:

    Garyさん

    早速の公開ありがとうございました。
    有言実行、かつ動きが早いですね。
    データはnetkeiba.comをつかってらっしゃるんですね。
    とても参考になりました。
    楽天競馬で取得しているのかなと思っていました。

    参考にさせていただきます。
    また、楽しみにしています。

    私も皆さんのお役に立つことができるようになったら公開させていただきます。

    • keiba-gary より:

      コメントありがとうございます。
      コロナで時間があるので、今のうちにたくさん書きたいと思います。

      楽天競馬でも可能だとは思いますが、情報が充実しているnetkeiba.comを使っています。

      うさぎのくろちゃんさんが作成する競馬AIも楽しみにしています!

タイトルとURLをコピーしました