ページ

2012年5月31日木曜日

アメダス

解析でAMeDASのデータを使いたいので、こちらのページで紹介されている気象庁のAMeDASデータの取得を参考に、データを自動取得するシェルスクリプトを作成してみました。
おそらく気象庁さんのサーバーには負担をかけているのだと思いますが...

BioEosさんのページではRubyを使っているのですが、私がRubyに不心得なのでシェルスクリプトで同様の作業を行います。
必要なのはw3mとawkなどなどですが、わりと簡単にできました。


まずはprec_noの取得
こちらのページを参考に。
w3m -dump_source 'http://www.data.jma.go.jp/obd/stats/etrn/select/prefecture00.php?prec_no=&prec_ch=&block_no=&block_ch=&year=&month=&day=&elm=&view=' | grep prec_no | sed 's/=/ /g' | sed 's/&/ /'g | awk '{print $10}' | grep ^[1-9] | tr '\n' ' ' > prec_no.dat


が、しかし................
実は正規表現がとっても苦手なもので、ここでは小癪にもsedとawkを多用しています....(汗)


そしたら次はblock_noの取得。
取得したprec_noを使って
for i in `cat prec_no.dat`
do
w3m -dump_source 'http://www.data.jma.go.jp/obd/stats/etrn/select/prefecture.php?prec_no='${i} | grep onmouseover= | sed 's/,/ /g' | sed 's/(/ /g' | sed 's/)/ /g' | sed "s/'//g" | awk '{print "'${i}'", $2, $3, $4, $5, $6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19}' | uniq | sed 's/;"//g' >> prec.dat
done


お恥ずかしながら、ここでもsedとawkを多用しています....(汗)

prec_noとblock_noが取得できたので、いよいよデータをダウンロードします。
w3mでページを表示して、grepで表の部分だけを抽出するという単純なものです。

こちらはアメダス全ポイントの日々のデータをゲットするコード
for ((i=1; i< 1639; i++))
do
prec=`awk 'NR=='$i'{print $1}' prec.dat`
type=`awk 'NR=='$i'{print $2}' prec.dat`
block=`awk 'NR=='$i'{print $3}' prec.dat`
mkdir -p ./da/$prec/$block
for ((j=1980; j<2000; j++))
do
for k in 01 02 03 04 05 06 07 08 09 10 11 12
do
cd ./da/$prec/$block
w3m 'http://www.data.jma.go.jp/obd/stats/etrn/view/daily_'${type}'1.php?prec_no='${prec}'&block_no='${block}'&year='${j}'&month='${k}'&day=&elm=daily&view=p1' | grep ^[1-9] > ${prec}_${block}_${j}_${k}.dat
s=`du ${prec}_${block}_${j}_${k}.dat | awk '{print $1}'`
case $s in
0)
rm ${prec}_${block}_${j}_${k}.dat
;;
esac
echo $block $type $prec $i $j $k
cd ../../../
done
done
done


同様にURLを変更すると月々データもゲットできます。
当然、時間ごとも可能。
for ((i=1; i< 1639; i++))
do
prec=`awk 'NR=='$i'{print $1}' prec.dat`
type=`awk 'NR=='$i'{print $2}' prec.dat`
block=`awk 'NR=='$i'{print $3}' prec.dat`
mkdir -p ./mo/${prec}/${block}
for ((j=1980; j<2000; j++))
do
cd ./mo/${prec}/${block}
w3m 'http://www.data.jma.go.jp/obd/stats/etrn/view/monthly_'${type}'1.php?prec_no='${prec}'&block_no='${block}'&year='${j} | grep ^[1-9] > ${prec}_${block}_${j}.dat
s=`du ${prec}_${block}_${j}.dat | awk '{print $1}'`
case $s in
0)
rm ${prec}_${block}_${j}.dat
;;
esac
echo $block $type $prec $i $j
cd ../../../
done
done

2 件のコメント:

Unknown さんのコメント...

prec.datというのは自分で作成するものなのでしょうか?こちらを参考にして実行しましたが、prec.datを読み込んでいないと警告されたので。

A Big Fish in a Little Pond さんのコメント...

prec.datは、上から2番めのスクリプト(最初に取得したprec_noを使って、block_noを取得する)のforループで作成しています。


for i in `cat prec_no.dat`
do
w3m -dump_source 'http://www.data.jma.go.jp/obd/stats/etrn/select/prefecture.php?prec_no='${i} | grep onmouseover= | sed 's/,/ /g' | sed 's/(/ /g' | sed 's/)/ /g' | sed "s/'//g" | awk '{print "'${i}'", $2, $3, $4, $5, $6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19}' | uniq | sed 's/;"//g' >> prec.dat
done

いかがでしょうか?