はじめに
こんにちは。
今回はExcel VBAでのGoogleChromeを操作して、Webページをスクレイピングして情報を取得する内容となっています。
取得する情報としては、米国株式の1つであるHDVというETFの構成銘柄です。
(あくまでもスクレイピングで取得する情報が株式関連というだけで、株式についてを取り扱う記事ではありません)
今回の記事で書いた内容を実際に実行するには、下準備としてSeleniumBasicの導入やChromeDriverのダウンロードが必要です。
これについては以前、下の記事で紹介していますので、よかったら見てみてください。
www.77-lifework.com
処理の流れとVBAのコード
まずは今回取得したい情報の確認と、処理の流れについて書いていきます。
HDVの情報や構成銘柄は下のサイトに記載されています。
www.blackrock.com
今回は、このWebサイトの中段ぐらいにある「保有銘柄一覧」に表示されている「組入上位10銘柄」を表形式で取得し、Excelシートに貼り付けて取得するところまでをゴールとしたいと思います。
取得したいのは下の画像の表ですね。
ここで、スクレイピングの下準備として、Webページ上で取得する対象の表についての要素情報を調べておきましょう。
GoogleChromeで目的のサイトを開き、キーボードの「F12」を押してデベロッパーツールを開きます。
「F12」でうまく開けない場合はWebページを右クリックして「検証」を選択します。
すると画面右側のウィンドウにHTMLのコードが表示されてきます。
赤枠の矢印マークをクリックした上で左側のWebページの表部分を選択すると、そこに対応するHTMLのコードが右側のウィンドウに表示されてきます。
したがって、このWebページで取得したい表を指定するには、この右側のウィンドウに表示されているHTMLの情報を指定すれば良いことになります。
今回はIDを使って表の要素を指定しようと思いますので、「id="topHoldingsTable"」という情報をコピーして用意しておきましょう。
Excelシートもあらかじめ準備しておきましょう。
今回は「Sheet1」のB2セルにスクレイピング対象URLを記載して、それを読み取って処理をするようにしています。
また、取得した情報を書き込むための「TableData」というシートも作成しておきましょう。
さて、ここからはVBAのコーディングに移ります。
VBAで表現しやすいように、処理の流れを1ステップずつ分けて書いてみるとこんな感じになります。
①スクレイピング対象のWebサイトにアクセス
②アクセスしたサイト内で目的の表を探し、表の情報を取得
③取得した表をExcelシートに貼り付け
これをVBAで表現してみると、下のようになります。
Option Explicit Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub main() Dim chromeDriver As New Selenium.chromeDriver Dim targetURL As String Dim table As TableElement Application.DisplayAlerts = False Application.ScreenUpdating = True ' ================== 処理開始 ================== targetURL = ThisWorkbook.Worksheets("Sheet1").Range("B2") ' chromeを起動し、対象URLにアクセス chromeDriver.Get targetURL Call Sleep(5000) Set table = chromeDriver.FindElementById("topHoldingsTable").AsTable table.ToExcel [TableData!A1] ' chromeの終了 chromeDriver.Close Set chromeDriver = Nothing End Sub
とても短いコードで表現できました。
1つずつ処理を説明していきます。
1~14行目は変数宣言等の記載となっていて、実際のスクレイピング処理は15行目から始まっています。
15行目では、マクロが保存されているExcelブックの「Sheet1」のB2セルの値を読み取っています。
18行目でGoogleChromeを起動し、15行目の処理で読み取ったURLを開いています。
19行目では、Webページが開くまで少し時間を空けたかったので、5秒待機する処理を入れています。
ここで使用しているSleepはかっこの中で指定した秒数(ミリ秒で指定)だけ処理をせず待機する関数です。
使用するには「Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)」という記述をしておく必要があります。(今回は2行目に記載)
21行目では、上で開いたURLのページから、今回取得したい表の情報を抽出しています。
ここでは「FindElementById」というメソッドによって、取得したい表の要素のID情報を指定しています。
あらかじめ調べておいた「id="topHoldingsTable"」の情報をここで記載しましょう。
そして「FindElementById("topHoldingsTable")」によって取得した要素を「AsTable」によって表形式で取得した上で「table」という変数に格納しています。
22行目で、変数「table」に格納されている情報を「TableData」シートのA1セルに貼り付けています。
(あらかじめTableDataという名前のシートを作成しておかないとエラーになります)
ここまででスクレイピング処理は終了です。
25~26行目では後処理として、開いたWebページを閉じて、GoogleChromeを終了させています。
これですべての処理が終了です。
これを実行すると、下のように「TableData」シートに目的の表の情報が出力されています。