Rでスクレイピングをやってみた
以下の記事で分析を行う際に、ウェブページからNBA選手の年俸データを取得しました。
年毎にページが分かれているため、Rでウェブスクレイピングをして、データ取得を自動化しようと思います。
ウェブスクレイピングのやり方については以下のサイトを参考にしました。
Chapter 24 Web Scraping | Introduction to Data Science
ライブラリはrvestを使用します。まずは、データ取得元のURLをセットします。
library(rvest) library(tidyverse) # set url url_domain <- "https://hoopshype.com/salaries/players/" url_page <- "2017-2018" url <- paste0(url_domain,url_page)
次に、htmlファイルを取得し、tableタグの中身を抽出します。
# get html h <- read_html(url) # parse html tab <- h %>% html_nodes("table")
tableタグがついている要素を確認します。
tab > tab {xml_nodeset (1)} [1] <table class="hh-salaries-ranking-table hh-salaries-table- ...
tableタグがついている要素は1つだけのため、これを抽出してデータフレームにすればよさそうです。
データフレームへの変換後、データの中身を確認します。
# get salary table from tab table <- tab[[1]] %>% html_table() # check the table head(table) >head(table) X1 X2 X3 X4 1 NA Player 2017/18 2017/18(*) 2 1 Stephen Curry $34,682,550 $35,678,476 3 2 LeBron James $33,285,709 $34,241,524 4 3 Paul Millsap $30,769,231 $31,652,784 5 4 Gordon Hayward $29,727,900 $30,581,550 6 5 Blake Griffin $29,512,900 $30,360,377
データは取得できていますが、1行目がカラム名になっており、カラム名が未定義になっています。
また、X1列は不要です。
不要な列の削除、列名の設定、必要な列(年)の追加をしてデータフレームを整えます。
# create data frame table <- table %>% mutate(n = row_number(), year = "2017-2018", name = X2, salary = X3, salary_adj = X4) %>% filter(n != 1) %>% select(year, name, salary, salary_adj) head(table) >head(table) > head(table) year name salary salary_adj 1 2017-2018 Stephen Curry $34,682,550 $35,678,476 2 2017-2018 LeBron James $33,285,709 $34,241,524 3 2017-2018 Paul Millsap $30,769,231 $31,652,784 4 2017-2018 Gordon Hayward $29,727,900 $30,581,550 5 2017-2018 Blake Griffin $29,512,900 $30,360,377 6 2017-2018 Kyle Lowry $28,903,704 $29,733,687
これでデータスクレイピングができました。
追記:
取得元のサイトでは2000-2001シーズンから、2017-2018シーズンまでのデータが取得できます。
今後の分析で使用することを踏まえて、まとめて取得してpackage化しておこうと思います。
作業内容は別記事(以下)に記載しております。
hadadada00.hatenablog.com
以上