Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

ページ

2012年5月31日木曜日

アメダス

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

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


まずはprec_noの取得
こちらのページを参考に。
  1. 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を使って
  1. for i in `cat prec_no.dat`  
  2. do  
  3.  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  
  4. done  


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

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

こちらはアメダス全ポイントの日々のデータをゲットするコード
  1. for ((i=1; i< 1639; i++))  
  2. do  
  3.  prec=`awk 'NR=='$i'{print $1}' prec.dat`  
  4.  type=`awk 'NR=='$i'{print $2}' prec.dat`  
  5.  block=`awk 'NR=='$i'{print $3}' prec.dat`  
  6.  mkdir -p ./da/prec/block  
  7.  for ((j=1980; j<2000; j++))  
  8.  do  
  9.   for k in 01 02 03 04 05 06 07 08 09 10 11 12  
  10.   do  
  11.    cd ./da/prec/block  
  12.    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  
  13.    s=`du {prec}_{block}_{j}_{k}.dat | awk '{print $1}'`  
  14.    case $s in  
  15.     0)  
  16.      rm {prec}_{block}_{j}_{k}.dat  
  17.      ;;  
  18.    esac  
  19.    echo block type prec k  
  20.    cd ../../../  
  21.   done  
  22.  done  
  23. done  


同様にURLを変更すると月々データもゲットできます。
当然、時間ごとも可能。
  1. for ((i=1; i< 1639; i++))  
  2. do  
  3.  prec=`awk 'NR=='$i'{print $1}' prec.dat`  
  4.  type=`awk 'NR=='$i'{print $2}' prec.dat`  
  5.  block=`awk 'NR=='$i'{print $3}' prec.dat`  
  6.  mkdir -p ./mo/{prec}/{block}  
  7.  for ((j=1980; j<2000; j++))  
  8.  do  
  9.   cd ./mo/{prec}/{block}  
  10.   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  
  11.   s=`du {prec}_{block}_${j}.dat | awk '{print $1}'`  
  12.   case $s in  
  13.    0)  
  14.     rm {prec}_{block}_${j}.dat  
  15.     ;;  
  16.   esac  
  17.   echo block type prec i $j  
  18.   cd ../../../  
  19.  done  
  20. 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

いかがでしょうか?