R言語のデータ加工にハマってまして、Webスクレイピングにも手を出してみました。
これからWebスクレイピングを行われる方の参考になれば幸いです。
流れとしましては、
①Webページから情報を取得
②Webページから必要な情報を抽出
③データ加工
④可視化
の順です。
今回、スクレイピング先のサイトとして、東京電力パワーグリッド様が公開されている過去の電力使用実績データを使用させていただきました。
###実装
まずはWebページから情報を取得します。
諸々のパッケージ宣言や変数宣言なども行っておきます。
# ライブラリ -------------------------------------------------------------------
pacman::p_load(dplyr, tidyr, rvest, ggplot2,RMeCab,pipeR,readr,lubridate)
# ソース本文 -------------------------------------------------------------------
source_url <- "http://www.tepco.co.jp"
tar_url <- "http://www.tepco.co.jp/forecast/html/download-j.html"
csv_all <- data_frame()
#WebページのURLを指定し、データを取得
performance_html <- read_html(tar_url,encoding = "UTF-8")
Webページのデータを取得できたら、必要な情報を抽出します。
aタグに含まれるhref属性のデータを取り出し、その中から「/forecast/html/images/juyo-」を含む情報のみを抽出します。
これが今回必要な詳細情報です。
#データ抽出
target_url_list <-
performance_html %>>%
html_nodes(xpath = "//a") %>>% #aタグに格納されているデータ
html_attr("href") %>>% #href属性のデータ
as.data.frame() %>>% #データフレーム化
filter(grepl("/forecast/html/images/juyo-", .)) #/forecast/html/images/juyo-〇〇〇〇に詳細情報が入る
詳細情報はCSVファイル形式で格納されています。
それぞれ毎に集計していくのは骨が折れるので、一旦ひとまとめにします。
先頭行が不要なので一工夫していますが、要は公開されているデータをひとつの変数として集約・保持するソースコードを書いています。
#CSVファイル情報集約
for (i in 1:nrow(target_url_list)) {
target_url <- paste0(source_url,target_url_list$.[i])
#csvをファイル保存
save_file <- paste0("download",i)
download.file(paste0(source_url,target_url_list$.[i]),
paste0(save_file,".txt"))
#先頭の情報が余計なので一旦除いてから再保存する
read_csv2(paste0(save_file,".txt")) %>>%
write_csv2(paste0(save_file,".csv"),col_names = F)
csv_tbl <- read.csv(paste0(save_file,".csv"))
#データを順次追加
csv_all <- bind_rows(csv_all, csv_tbl)
}
集約さえできればあとは加工するだけです。
データが日単位で集計されているとグルーピングができないので、
グルーピングしやすくするために年/月の列の情報を追加してサマります。
#データ加工
data <-
csv_all %>>%
mutate(year=year(DATE),month=month(DATE)) %>>% #年/月に分ける
group_by(year,month) %>>% #年/月でグルーピング
summarise("pf" = sum(実績.万kW.))
最後に可視化を行います。
お好みで様々な可視化を行ってみるのも良いでしょう。
ggplot(data,aes(x=year) ) + geom_histogram()
以上です。
ちょっと難しい技術でしたが、ハマると楽しいので機会があれば積極的に使っていきたいですね。
やっていきましょう。