そらまめ君をRでWebスクレイピング(1)
題名のまんまの話です。
環境省大気汚染物質広域監視システム
(通称:そらまめ君)では、日本全国の様々な地域の大気汚染物質について
情報の公開を行っていますが、過去のものが1週間くらいしか遡れない。
大抵こういうのって、しばらくしてから欲しくなったりするわけで
それならば、ってことでWebスクレイピングで情報をゲットして
保存しつつ、ついでに図示もできたらな、という話。
library(rvest)
library(dplyr)
library(ggplot2)
library(maptools)
使ったパッケージはこんなところ。
で、自動化して定期的に実行したかったので
実行時の時刻を、以下の手法で取得
nowtime <- Sys.time()
nowtime2 <- as.POSIXlt(nowtime)
year <- nowtime2$year +1900
month <- nowtime2$mon + 1 #月データはなぜか0が1月でのスタート
day <- nowtime2$mday
hour <- nowtime2$hour-1
そらまめ君データが、どうも毎時30分の段階で更新されるようなので
自動化の実施時間が30分より後なら、上の
hour <- nowtime2$hour-1
は、最後が "-1" でいいけど、実施が30分より前なら "-2" がよろしいかと。
地域としては中部(東海)を想定していたので、後でデータのURLを
決定するのに必要な地域のID(今回は 04)を以下のように指定
block <- "04"
ちゃんと "04" と認識させたいので、数字じゃなくて文字として指定。
次に、得たい情報の時刻にのっとった文字列を作成
titleday <- paste(formatC(year, width=2, format = "d", flag = "0"),
formatC(month, width=2, format = "d", flag = "0"),
formatC(day, width=2, format = "d", flag = "0"),
sep="")
titledaytime <- paste(formatC(year, width=2, format = "d", flag = "0"),
formatC(month, width=2, format = "d", flag = "0"),
formatC(day, width=2, format = "d", flag = "0"),
formatC(hour, width=2, format = "d", flag = "0"),
formatC(block, width=2, format = "d", flag = "0"),
sep="")
地域IDを含むのと含まないのを作成。
なんでこんなことしたかというと、データのURLを
soraurl <- paste("http://soramame.taiki.go.jp/Gazou/Hyou/AllMst/", titleday,"/hb", titledaytime,".html", sep="")
で指定したいから。
でもって、これを使ってスクレイピング。
dat <- read_html(soraurl, encoding = "euc-jp")
ここで結構時間を使った!!
風向のデータが日本語なのだけど、それが文字化けしてしまって
解ればこんなものだけど、しばらく検索したりしてました。
tbls <- dat %>% html_table() #任意の時間のデータ
colnames(tbls1) <- c("測定局コード","市区町村名","測定局名称","SO2(ppm)","NO(ppm)",
"NO2(ppm)","NOx(ppm)","CO(ppm)","OX(ppm)","NHMC(ppmC)","CH4(ppmC)",
"THC(ppmC)","SPM(mg/m3)","PM2.5(ug/m3)","SP(mg/m3)","WD","WS(m/s)",
"TEMP(℃)","HUM(%)","局種別")
データを変換です。
呼び出したURLは項目名が無いので、自分で付け加え。
このtblsを適当にcsvで保存すれば、とりあえずデータのスクレイピングは完成。
この後は、自動化とかグラフ化とかあるけど
それはまた次へ(なぜなら、いまから忘年会だから)