ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

気象庁の世界の気象データダウンロード

概要

気象庁サイトは、世界の気象データを提供している。

私は、日本の特定地域に類似する気象条件の海外の地域を検討する必要があり、世界のデータをダウンロードすることとした。

2019/5/27現在、2018/1/1以降の日データ、1982/6以降の月データがDL可能である。

日データは日毎(500日)に、月データは月毎(400月)の地域毎(6)にDL可能。

手作業では面倒なので、DLロボットを作成した。

 ソースコード

#!/usr/bin/ruby -Ks
# jwm 気象庁 world daily,monthly weather data download ダウンロード

$,="\t";$\="\n"
require 'win32ole'
require 'Win32API'
require "~/Lib/Ruby/calendar.rb" #my libraly
require "~/Lib/Ruby/ie.rb" #my libraly
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
def kikan2yms(kikan)
ks,ke=kikan
# kiikan2yms([[2008,2,10],[2009,3,5]])
# => [2008,2]..[2008,12]+[2009,1]..[2009,3]
yms=[*ks[0]..ke[0]].map{|yy|
ms=(yy==ks[0])?ks[1]:1
me=(yy==ke[0])?ke[1]:12
[*ms..me].map{|m|
[yy,m]} }.flatten(1)
end
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
def kikan2ymds(kikan)
ks,ke=kikan
# kiikan2yms([[2008,2,10],[2009,3,5]])
# => [2008,2,10]..[2008,12,31]+[2009,1,1]..[2009,3,5]
ymds=[*ks[0]..ke[0]].map{|yy|
ms=(yy==ks[0])?ks[1]:1

me=(yy==ke[0])?ke[1]:12
[*ms..me].map{|m|
ds=(yy==ks[0] and m==ks[1])?ks[2]:1
de=(yy==ke[0] and m==ke[1])?ke[2]:ymdays(yy,m)
[*ds..de].map{|d| [yy,m,d]}} }.flatten(2)
end
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
def sendkeys(wsh,pat,t_keys) #->util.rb
wsh.AppActivate(pat)
t_keys.map{|(t,key)|
sleep(t)
wsh.SendKeys(key)
}
end

od="world"
# Setting Target
#https://www.data.jma.go.jp/gmd/cpd/monitor/dailyview/index.php?
#&s=1&r=0&y=2018&m=1&d=1&e=0&t=0&l=0&k=0
s="1";r="0";es=%w[0 1 2 3 4];t="0";l="0";k="0"
date="20190527";kikan_d=[[2018,1,1],[2019,5,26]];kikan_m=[[1982,6,1],[2019,4,30]]
#0世界 1アジア/シベリア 2ヨーロッパ/中東 3アフリカ/インド洋
#4北アメリカ 5南アメリカポリネシア 6東南アジア/オセアニア

ie = WIN32OLE.new("InternetExplorer.Application")
wsh = WIN32OLE.new("Wscript.Shell")
ie.Visible = true
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

if true
print "dl_monthly data"
yms=kikan2yms(kikan_m)
print yms
rs=%w[1 2 3 4 5 6]
yms.map{|(y,m)|
print "\n",y,m
rs.each{|r|
printf "%s ",r
nfo="#{od}/#{y}.#{m}.#{r}.txt";fo=open(nfo,"w")
url="http://www.data.jma.go.jp/gmd/cpd/monitor/climatview/list.php?r=#{r}&y=#{y}&m=#{m}&s=1&e=0&k=0"
ie.Navigate(url)
nsleep ie,4
tbl=ie.Document.getElementsByClassName("list").item(0)
tb=tbl.all.tags("tbody").item(0)
array=tb2txta(tb)
fo.print array.map{|fs| fs.map{|f| f.gsub("\r\n","")}*"\t"}*"\n"
}
}
end

#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

if true
print "#dl_daily data"
ymds=kikan2ymds(kikan_d)
urls=es.map{|e|
ymds.map{|ymd|
y,m,d=ymd
url="https://www.data.jma.go.jp/gmd/cpd/monitor/dailyview/index.php?"+
"&s=#{s}&r=#{r}&y=#{y}&m=#{m}&d=#{d}&e=#{e}&t=#{t}&l=#{l}&k=#{k}"
} }.flatten(2)
urls[507,10].each{|url|
print "url",url
ie.Navigate(url)
nsleep ie,4
doc=ie.Document
btns=collection2array(doc.all.tags("button"));btn=btns[-1]
btn.click nil;nsleep ie,4

dls=collection2array(doc.getElementsByClassName("menu"));dl=dls[2]
dl.click nil;nsleep ie,4

as=collection2array(ie.Document.all.tags("a"))
btn=as.find{|a| a.href.match("all_download_d.php")}
print "btn",btn.href
btn.click nil;sleep 1
sendkeys(wsh,"alldata_dl.php",[[0.2,"%s"],[0.2,"%v"]]) #%=Alt+
}
end

#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
if false # when making chiten list

nfo_chiten="#{od}/chitens_#{date}.txt"
fo_chiten=open(nfo_chiten,"w")
rs=%w[1 2 3 4 5 6]
rs.each{|r|
ie.Navigate("https://www.data.jma.go.jp/gmd/cpd/monitor/dailyview/list.php?r=#{r}&y=2019&m=5&d=1&s=1&e=0&k=0")
nsleep ie,8
as=collection2array(ie.Document.all.tags("a"))
print as.size
as.select!{|a| a.href.match("graph_mkhtml_d.php")}
print as.size
hrefs=as.map{|a| a.href}
print hrefs.size

hrefs.each.with_index{|href,i|
print href
ie.Navigate(href)
nsleep ie,8
comment=ie.Document.getElementById("info").innerText.gsub("^M\n","\t")
fo_chiten.print i,href,comment
}
}

end