亡八の覚書

環境分野の化学分析屋(見習い)が、独学でたどる解析の冥府魔道

そらまめ君を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")

ここで結構時間を使った!!

風向のデータが日本語なのだけど、それが文字化けしてしまって

最終的には、エンコード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で保存すれば、とりあえずデータのスクレイピングは完成。

 

この後は、自動化とかグラフ化とかあるけど

それはまた次へ(なぜなら、いまから忘年会だから)