VBA

【VBAでIE操作】Webサイトでページ遷移しながらテーブルデータをExcelに書き出す

株の人
株の人
♪~♪~

9月末といえば~♪♪

もり
もり
あんた、また株主優待の情報探してるの?!
株の人
株の人
9月といえば権利確定月だ!おっ、400件以上もあるのか

んんっ?このWebサイト、1ページ10件までしか見れないのか?

9月の銘柄
株の人
株の人
1ページずつ移動するのめんどうくさいな・・・
次のページへのリンク
株の人
株の人
全件を一覧で見たいぞ、もり、なんとかしてくれ
もり
もり
しょうがないなぁ~

じゃあ、スクレイピングでExcelシートに書き出そうか

Webサイトのデータ(検索結果)をExcelシートに書き出すマクロを紹介します。複数ページある場合は、リンクをクリックして最終ページまでクロールします。

Webサイトをクロールしてスクレイピング

題材として、イチロー選手と天海祐希さんでおなじみ「SMBC日興証券」のWebサイトを使います。

※SMBC日興証券の取引アカウントをお持ちでなくてもマクロは使えます!

スクレイピングのイメージ動画です(9月は件数が多いため、8月データ)

画面左側がWebサイトです。画面のチラつきは画面遷移(次ページへ移動)です。

Webサイトをクロール(次ページ遷移)しながらExcelシートに書き出すマクロの使い方

もり
もり
まずはマクロを作っていくよ~!

(事前準備)VBEの参照設定

VBAでIEを操作するためには下記2つのライブラリを参照します。

  • Microsoft HTML Object Library
  • Microsoft Internet Controls

VBE(エディタ)で「メニュー」→「ツール」→「参照設定」を選択します。

VBAでIE操作するための参照設定

マクロを標準モジュールに貼り付け

下記のコードを標準モジュールに貼り付けます。コードの解説は後の項で紹介します!

Internet Explorerを起動して日興証券のページを開く

このマクロは「起動してるInternet Explorerを取得する」仕組みなので、事前に対象のページにアクセスしておく必要があります。

※ブラウザはInternet Explorerを使用します。

Internet ExplorerでSMBC日興証券の「マーケット情報 > 株主優待の検索」にアクセスし、検索条件を指定して検索結果を表示しておきます。

ここでは、権利確定時期=9月 で検索してみます(他の条件でもOKです)

 

※起動してるウィンドウを順番にチェックして、最初に見つかったInternet Explorerを処理対象として取得する仕組みなので、Internet Explorerの起動は1つのみとしてください。

マクロを実行する

IEを起動して、対象の検索結果画面を表示させた状態で、マクロのmainプロシージャを実行してください。

423件が、約75秒でExcelシートに書き出せました!

VBAで株主優待銘柄をスクレイピング

オートメーションエラーが発生した場合

下記のエラーが発生した場合は、IEを再起動してみてください。

VBAのオートメーションエラー

スクレイピングコードの解説

もり
もり
それじゃあVBAのプログラムの解説いくよ~

起動済みのIEを取得する

起動してるウィンドウを順番にチェックして、最初に見つかったInternet Explorerを処理対象として取得します。

シェルオブジェクトのウィンドウは、エクスプローラーやインターネットのブラウザを取得できます。

検索結果の最終ページまで処理を繰り返す

このスクレイピングでは、検索結果のページ数、処理を繰り返します。そのため、「最終ページであるか否か」の判定処理が必要です。

変数isLastPageFlagを用意し、Falseの間(=最終ページでない)処理を繰り返します。最終ページか否かの判定は後ほど紹介します。

銘柄の検索結果の範囲を取得する

検索結果のHTMLを確認してみます。HTMLの確認はChromeを使いましょう!

検索結果の部分は、id名=item01であることが確認できます。

 

Chromeで検索結果のHTMLを検証

 

HTMLオブジェクトのgetElementByIdメソッドの引数に”item01″を指定して、変数yuutaiTblに格納します。

検索結果テーブルのtdタグをすべて取得する

銘柄のテーブルはシンプルな作りになっています。1銘柄5項目なので、5つのtdタグが存在します。

テーブルの1行(1銘柄)のHTMLです。tdタグで挟まれている中身を取得できればよさそうですね。

 

検索結果テーブルのtdタグ

getElementsByTagNameメソッドの引数にtdタグを指定して、変数tdTagsに格納します。tdタグは複数あるので、tdTagsはコレクションになります。

 

ポイントは、変数yuutaiTblからtdタグを取得していることです。

yuutaiTblを指定せずに、ページ全体のすべてのtdタグにしてしまうと、銘柄の検索結果と関係のないtdタグまで取得してしまうのです。

tdタグを1つずつシートに書き出す

コレクションtdTagsから、tdタグを1つずつ取り出して変数tdTagに格納します。変数名は複数形と単数形にしておくとわかりやすいです。

  • tdTags(複数形・コレクション)
  • tdTag(単数形)

tdタグで囲まれた中身がinnerTextです。

 

tdTagのinnerTextをExcelシートのセルに書き込みます。

次のページに遷移する

1ページ10件の書き込みが終わったら、「次の10件」のリンクをクリックして次のページに進みます。

リンクのHTMLを確認しましょう。

 

class名は”next”です。

次のページへ遷移するリンク

HTMLのidとclassの違いに注意しましょう!

  • id = 同一ページ内で重複不可
  • class = 同一ページ内で重複OK

 

HTMLオブジェクトのgetElementsByClassNameメソッドの引数に”next”を指定して、変数nextPageLinkに格納します。

getElementsByClassNameメソッドの返り値はコレクションなので、何番目の要素であるか、番号を指定します。ここでは1番目なので(0)を指定します。

 

(参考)class名がページ全体の何番目であるか確認する方法

HTMLのclass名は、同一ページに複数指定することが可能です。目的のclassが全体の何番目であるか、chromeの検証機能で検索しましょう。

Ctrl+Fで検索ダイアログが登場します。class名を検索します。(検索結果では2 of 3となっていますが、1番目のnextは無関係なので、ここでは目的のリンクが1番目 = 0 となっています)

Chromeの検証機能で検索

最終ページであるか否かの判定処理

変数nextPageLink(オブジェクト)の中身をチェックし、もしオブジェクトが空でなければ、つまり次のページがあるなら、クリックします。

検索結果の最終ページにはリンクがありません。

クリックするのは、spanタグの中にあるaタグです。

 

nextPageLinkオブジェクトの、getElementsByTagNameメソッドの引数に”a”タグを指定して、Clickメソッドを実行します。

(spanタグの中にaタグは1つのみなので、要素番号は1番目 の (0) を指定)

 

次ページ遷移のリンクがない場合はnextPageLinkが空になります。

nextPageLinkが空の場合、つまり最終ページの場合は、「最終ページであるか否か」の判定に使用する変数isLastPageFlagをTrueにします。

変数isLastPageFlagがTrueになると、ループ処理を抜けます。

まとめ:VBAでIE操作してスクレイピング

日興証券の株主優待銘柄の一覧を題材にして、ページをクロールしながらExcelシートにデータを書き出す方法を紹介しました。

スクレイピングとは、WebサイトのHTMLを収集して、目的のデータを抽出することです。

Webサイトのデータ収集で、コピー貼付けで苦戦している人は、この「スクレイピング」という技術を覚えるとラクですよ。

 

株の人
株の人
♪~♪~どの銘柄買おうかな~♪株主優待♪株主優待♪
もり
もり
あんた、株主優待しかみてないの?!

 

「権利付き最終日」は「権利確定日」の2営業日前なので、「権利確定日=9月末日」の銘柄は9月26日(木)中に買っておけばOKですね。