競馬レース結果データベースを自作する方法:step1

R

netkeibaのサイトから競馬データを取得するためのステップは以下の通り。

  1. 入手したい日付(年、月)のカレンダーのページから開催日を調べる
  2. 開催日のページからrace_idを調べる
  3. race_idに対応したページからデータを抽出する

このページはステップ1に対応したコードです。全体像はこちら。

競馬 過去データcsvをnetkeibaから無料で入手する方法
JRA-VANを無料で使えるのはお試し期間のみ。競馬のデータ分析を継続して行うには、どうしても過去の競馬レース結果データを自前で収集する必要があります。netkeibaからのスクレイピング方法やデータをcsv 形式で保存する方法について記述しています。

 

スクレイピングを始める前に

Rでスクレイピングをするならrvestパッケージを使うのが簡単です。また、スクレイピングをするためにはHTML/CSSの理解も必要。とりあえず、これだけ知っていればスクレイピングは始められます。

Rでスクレイピングするならrvest 表もリンクもテキストも
Rでスクレイピングをするならrvestパッケージを使うのがベスト。表データ、リンク先URL、テキストなどのデータを簡単に入手できます。netkeibaのレース結果を題材にrvestパッケージの使い方をまとめています。
スクレイピングに必要な最低限のHTML/CSSの知識
スクレイピングでデータを収集するためには、HTMLで書かれたWebページの文書構造を理解し、どこに目的のデータが記載されているかをコンピュータに教えてやる必要があります。このページではスクレイピングに最低限必要なHTML/CSSの知識をまとめています。

step1: カレンダーのページから開催日を調べる

開催日を調べる関数

  get_race_dates(year, month)

  【引数】
    year : 開催日を調べたい年
    month : 開催日を調べたい月

  【戻り値】
    開催日(yyyymmdd形式の文字列)のベクトル

library(rvest)
library(stringr)
library(tidyverse)

#----------------------------
# 開催日を調べる関数
#----------------------------
get_race_dates <- function(year, month){

# 処理するyear,monthの出力
cat(paste0("year = ", year, " month =", month))

# 指定したyear, monthに対応するページのurl
url <- paste0("https://race.netkeiba.com/top/calendar.html?year=",
as.character(year),
"&month=",
as.character(month))

# スクレイピング
race_dates <- read_html(url, encoding="EUC-JP")%>%
html_element(css="#Netkeiba_RaceTop > div.Wrap.fc > div.Contents > div.Main_Column > div.Race_Calendar_Inner > div > div.Race_Calendar_Main > table ") %>%
html_nodes("a") %>%
html_attr("href") %>%
str_split("=") %>%
sapply("[[",2)

# スクレイピングは1秒待つ
cat(" Sleep")
Sys.sleep(1)
cat(" Done\n")

return(race_dates)
}

 

get_race_dates()の使用例

以下のコードでは、2012年1月から2021年12月までで競馬が開催された日付を取得しています。


#--------------------------------------
# スクレイピングを繰り返して、必要なデータを取得
#--------------------------------------

# 取得したい年、月のdata.frameを作成
year_month <- expand_grid(year = 2012:2021, month = 1:12)

# 取得したい年、月のページをスクレイピングして結果をres(list型)に保存
res <- list()
for(i in 1: nrow(year_month)) {
year<-year_month$year[i]
month<-year_month$month[i]
res[[i]] <- get_race_dates(year, month) # 競馬開催日を取得
}

# resはlist型なので、それをバラして、ひとつのcharacterベクトルにする
race_dates <- unlist(res)

# データの保存
rds_filename <- "race_dates.2012to2121.rds" # file名
saveRDS(race_dates, file = rds_filename) # 保存

step2に進む場合はこちら

競馬レース結果データベースを自作する方法:step2
指定した開催日に行われた競馬のrace_idをスクレイピングするためのコードです。