見出し画像

FanGraphsのtableデータをRで取得する

fangraphsのテーブルデータのDLが有料会員限定になったため、Rstudioを使って取得しようという内容です。

有料機能を見つけたので早速使ってますが、無料で全部読めます。

使うソフトは
・Rstudio
 ・tidyverseパッケージ
 ・rvestパッケージ

今回は、Teamスタッツの打撃部門・Dashboardデータをスクレイピングします。

Major League Team Stats » 2023 » Batters » Dashboard | FanGraphs Baseball


まえがき
htmlファイルの構造に関しては全くの無知です。下のwebサイトを参考に実行したら上手くいったというだけです。今から記す手順で他のwebサイトもスクレイピングできるかはわかりません。あくまでfangraphs限定ということでご理解ください。


まず、read_html関数を実行して、URLからwebページの情報を取得します。

url <- "https://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=8&season=2023&month=0&season1=2023&ind=0&team=0,ts&rost=&age=&filter=&players=0"
html <- read_html(url)


続いて、html_element関数でtableデータが収録されているノード(node)を抽出します。

tbl <- html_element(html, css = 抽出したいノード)

抽出したいノードをcssセレクターで指定するのですが、これを探すのが少し面倒。Microsoft edgeの「開発者ツールで調査する」を用いて抽出したい部分を探します。

①右クリック
→「開発者ツールで調査する」をクリック
→ 画面右に英語の羅列が登場

②tableデータが収録されてるノードを探す
→ 該当のタグを右クリック
→ コピー
→ Xpathをコピー

以上の手順を踏むとcssセレクタを取得できます。

#取得したcssセレクタ
//*[@id="LeaderBoard1_dg1_ctl00"]

そしてhtml_element関数に貼り付けますが、そのまま貼り付けると上手くいきません。

" / "と"@"は予期しない文字と判断されます。

なので少し手直し。

#実際に貼るコード
*[id=LeaderBoard1_dg1_ctl00]

tbl <- html_element(html, css = "*[id=LeaderBoard1_dg1_ctl00]")


最後に、html_table関数でhtmlの表をデータフレーム形式で抽出します。

df <- html_table(tbl)

これで抽出完了。ただ、列名が2行目に入ってたりして見栄えが悪いので整えます。

colnames(df) <- df[2, ]
df1 <- df %>% slice(-c(1:3))

おしまい。
あとはwrite_csv()で保存すればOK。

library(tidyverse)
library(rvest)

url <- "https://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=8&season=2023&month=0&season1=2023&ind=0&team=0,ts&rost=&age=&filter=&players=0"
html <- read_html(url)

tbl <- html_element(html, css = "*[id=LeaderBoard1_dg1_ctl00]")

df <- html_table(tbl)

colnames(df) <- df[2, ]
df1 <- df %>% slice(-c(1:3))

write_csv(df1, "team23_dashboard.csv")


今回はTeamスタッツのBatting_Dashboardをスクレイピングしてきました。上述の手順を踏めばStandardやAdvancedのtableデータ、Pitching/Fieldingも取得できます(検証済)。個人成績(Leaders)も同様です。ただ、選手ページのtableデータを取得できるかは不明です。


余談
URLが意外とシンプルなので、map関数を活用して、複数の年やスタッツタイプ(Standard/Batted Ballなど)をひとつのdata.frameにまとめることもできます。

前半戦振り返りpart1に載せたこの表は、map関数で各ポジションのFieldingデータを一括取得→rank関数で順位づけという手順で作成してます。excelとfangraphsの行き来は手間ですからね。


ここから先は

0字

¥ 770

この記事が気に入ったらチップで応援してみませんか?