LoginSignup
8
17

More than 3 years have passed since last update.

【R言語】RでWebスクレイピングしてプロット表示するまでをやってみる

Posted at

R言語のデータ加工にハマってまして、Webスクレイピングにも手を出してみました。

これからWebスクレイピングを行われる方の参考になれば幸いです。

流れとしましては、
①Webページから情報を取得
②Webページから必要な情報を抽出
③データ加工
④可視化
の順です。

今回、スクレイピング先のサイトとして、東京電力パワーグリッド様が公開されている過去の電力使用実績データを使用させていただきました。

実装

まずはWebページから情報を取得します。
諸々のパッケージ宣言や変数宣言なども行っておきます。

web_scraping.r
# ライブラリ -------------------------------------------------------------------


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-」を含む情報のみを抽出します。
これが今回必要な詳細情報です。

web_scraping.r
#データ抽出
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ファイル形式で格納されています。
それぞれ毎に集計していくのは骨が折れるので、一旦ひとまとめにします。
先頭行が不要なので一工夫していますが、要は公開されているデータをひとつの変数として集約・保持するソースコードを書いています。

web_scraping.r
#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)
}

集約さえできればあとは加工するだけです。
データが日単位で集計されているとグルーピングができないので、
グルーピングしやすくするために年/月の列の情報を追加してサマります。

web_scraping.r

#データ加工
data <- 
  csv_all %>>%
  mutate(year=year(DATE),month=month(DATE)) %>>%  #年/月に分ける
  group_by(year,month) %>>%                       #年/月でグルーピング
  summarise("pf" = sum(実績.万kW.))

最後に可視化を行います。
お好みで様々な可視化を行ってみるのも良いでしょう。

web_scraping.r
ggplot(data,aes(x=year) ) + geom_histogram()

ggplot.png

以上です。
ちょっと難しい技術でしたが、ハマると楽しいので機会があれば積極的に使っていきたいですね。
やっていきましょう。

8
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
17