SeleniumVBA(2)

by

in

 以前紹介した 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 の仕様の何れに拠るものかは分からないが、未遂であった。