以前紹介した SeleniumVBA を使って気象庁のウェブサイトから 10 分雨量データの取得を行った。
使用頻度が多いユースケースと考えられるのでお披露目する。
Const URL_PREFIX = "https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=[pref]&block_no=[block]"
Const DRIVER_PATH = "C:\[directory]\chromedriver.exe"
Private Sub Get_Rainfall_data()
Dim data(1 to 144) As Double
dt = #1/1/2015#: dt_exit = #1/1/2025#
Open ThisWorkbook.Path & "\rainfall.csv" For Output As #1
With New SeleniumVBA.WebDriver
.StartChrome DRIVER_PATH
Set caps = .CreateCapabilities
caps.RunInvisible
.OpenBrowser caps
Do
url = URL_PREFIX & "&year=" & Year(dt)
url = url & "&month=" & Month(dt)
url = url & "&day=" & Day(dt) & "&view=h1"
.NavigateTo url
.Wait 200
With .FindElementByID("tablefix1")
row_num = 1
idx = 0
For Each row In .FindElementsByTagName("tr")
If row_num > 2 Then
txt = row.FindElementsByTagName("td"). _
Item(4).GetInnerHTML
idx = idx + 1
If IsNumeric(txt) Then
data(idx) = Val(txt)
Else
data(idx) = 0
End If
End If
row_num = row_num + 1
Next
End With
dt_pr = DateAdd("n", 10, dt)
For idx = 1 To 144
buf = Format(dt_pr, "yyyy/mm/dd hh:nn") & "," & _
Format(data(idx), "0.0")
Print #1, buf
dt_pr = DateAdd("n", 10, dt_pr)
Next
dt = dt + 1
If dt = dt_exit Then Exit Do
Loop
.CloseBrowser
.Shutdown
End With
Close #1
End Sub
このコードを実際に使う場合は、1 行目の URL_PREFIX は気象庁の「過去の気象データ検索」で所望の観測所・日時の「10 分ごとの値」を表示して、遷移画面の URL から [pref] と [block] を読取って書き換える必要がある。また、2 行目の DRIVER_PATH の [directory] は chromedriver.exe が保存されているディレクトリに書き換える。さらに、8 行目の dt は開始日、dt_exit は末尾の翌日を指定する。
35 行目の Item(4) は表の 4 列目に雨量が表示されていることを指す。観測所によって表示項目が異なるので相違する場合は変更を加える。
以上の編集と SeleniumVBA の参照設定を行って、Get_Rainfall_data をコールすると指定した期間の 10 分雨量が rainfall.csv に出力される。
今回、10 年分のデータを取得するのに要した時間は著者の環境で約 4 時間であった(寝ている間に処理)。
なお、ワークブックの分割による並列処理を試みたが、Chrome の仕様・VBA の仕様の何れに拠るものかは分からないが、未遂であった。