VBA初心者がWebスクレイピングをしてみました
ExcelのVBA(マクロ)機能を使用して、Webから取得した情報をExcelに落とし込むプログラムを作成しました。
VBAは便利だということは噂では聞いていたのですが、なかなか手を出せずにいて、最近時間ができたので勉強を始めました。
全くの素人の状態から適当に購入した一冊の本とインターネットの情報を頼りに、何とか目指していた形に仕上げることができました。
質の低いプログラムになっていると思いますが、VBAを使い始めた最初の記録として残しておきたいと思います。
プログラム概要
株式の情報が記載されている株探のHP(https://kabutan.jp/)で
- 銘柄コードで調べたい企業を検索
- PER、PBR、利回り、株価を情報を取得
- 取得した情報をExcelで表にする
今までは手動で一銘柄ずつ調べて、Webページから転記して・・・という方法で行っていましたが、VBAで自動化に成功しました!
作成に掛かった時間
【前提】
・VBAを一度も触ったことがない
・Excelは最低限の関数(SUM、IF、LOOKUP、etc...)は使える程度
の状態からスタート
【費やした時間】
・本を読みながら基本的な動作の理解、習得:5時間
・プログラムの作成:2時間
Chromeからのスクレイピングの方法を調べるのに1時間ほど時間を費やしてしまいました。Internet Explorerがサポート終了する前は、Internet Explorerを使用したスクレイピングが一般的?だったようで、Internet Explorerのスクレイピングの方法はいろんなwebページが見つかりましたが、素人にもわかりやすいChromeのページがなかなか見つからず苦労しました。
プログラムの内容
Webからテーブル情報の取得
実際のコード
Sub Table情報取得() Dim Driver As New Selenium.WebDriver 'Seleniumを変数として定義 Dim arr As Variant Driver.Start "Chrome" 'Seleniumを使用してChromeを立ち上げ Dim strcode As String strcode = Range("B10").Value 'strcodeという変数に銘柄コードを格納(B10のセルに銘柄コードが事前に入力済み) Driver.Get "https://kabutan.jp/stock/?code=" & strcode '株探のHPへ移動し銘柄コードを検索 arr = Driver.FindElementsById("stockinfo_i3")(1). _ FindElementByTag("table").AsTable.Data 'テーブルデータを取得 With ThisWorkbook.ActiveSheet .Range(.Cells(1, 1), .Cells(UBound(arr, 1), UBound(arr, 2))).Value = arr .Columns.AutoFit '二次元配列をExcelに出力 End With arr = Driver.FindElementsById("kobetsu_left")(1). _ FindElementByTag("table").AsTable.Data 'テーブルデータの取得 With ThisWorkbook.ActiveSheet .Range(.Cells(7, 1), .Cells(UBound(arr, 1), UBound(arr, 2))).Value = arr .Columns.AutoFit '二次元配列をExcelに出力 End With Cells(2, 1) = Replace(Cells(2, 1), "倍", "") '「倍」の表示を削除 Cells(2, 2) = Replace(Cells(2, 2), "倍", "") '「倍」の表示を削除 Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Date '表の最終行にデータ Cells(Rows.Count, "B").End(xlUp).Offset(1).Value = Range("A2").Value '最終行に取得したPERを入力 Cells(Rows.Count, "C").End(xlUp).Offset(1).Value = Range("B2").Value '最終行に取得したPBRを入力 Cells(Rows.Count, "D").End(xlUp).Offset(1).Value = Range("C2").Value '最終行に取得した利回りを入力 Cells(Rows.Count, "E").End(xlUp).Offset(1).Value = Range("B7").Value '最終行に取得した株価を入力 Range("B12", Cells(Rows.Count, 2).End(xlUp)).NumberFormatLocal = "0.00_ ;[赤]-0.00 " '表示形式を整える Range("C12", Cells(Rows.Count, 3).End(xlUp)).NumberFormatLocal = "0.00_ ;[赤]-0.00 " '表示形式を整える Range("A12", Cells(Rows.Count, 1).End(xlUp)).NumberFormatLocal = "yyyy/mm/dd" '日付表示 Range("E12", Cells(Rows.Count, 5).End(xlUp)).NumberFormatLocal = "\#,##0;[赤]\-#,##0" ' 通貨表示 Range("A12", Cells(Rows.Count, 1).End(xlUp)).HorizontalAlignment = xlRight ' 右詰め Range("B12", Cells(Rows.Count, 2).End(xlUp)).HorizontalAlignment = xlRight ' 右詰め Range("C12", Cells(Rows.Count, 3).End(xlUp)).HorizontalAlignment = xlRight ' 右詰め Range("D12", Cells(Rows.Count, 4).End(xlUp)).HorizontalAlignment = xlRight ' 右詰め Range("E12", Cells(Rows.Count, 5).End(xlUp)).HorizontalAlignment = xlRight ' 右詰め Driver.Close Set Driver = Nothing 'driverを閉じてChrome終了 End Sub
「B10」セルに銘柄コードが記載された状態で上のコードを実行すると
下の黄色の部分が新たに取得されます。
7行目までの表は取得するたびに上書きされ
11行目以下の表は取得するたびに下に行が追加されていきます。
Web情報を取得する部分について補足説明です。
HTMLのid属性を指定して情報を取得
arr = Driver.FindElementsById("stockinfo_i3")(1). _ FindElementByTag("table").AsTable.Data 'テーブルデータを取得
こちらのコードが情報を取得して「arr」に格納しているコードです。
id属性”stockinfo_i3”の中の1つ目のTableタグの情報をテーブルデータとして取得しています。
With ThisWorkbook.ActiveSheet .Range(.Cells(7, 1), .Cells(UBound(arr, 1), UBound(arr, 2))).Value = arr .Columns.AutoFit '二次元配列をExcelに出力 End With
こちらのコードは先ほど取得したテーブルデータをExcelに出力するコードですが、私には詳細が理解できませんでした。
なんでかわからないけどこうなるそうです。
具体的には下の流れでidを調べて情報を取得します。
- Chromeで情報を取得したいページを開いた状態で右クリック
- 検証をクリック
- 画面右側に表示される↓図の赤枠部分をクリック
するとWebページにカーソルを合わせると、右側の画面でカーソルを合わせた部分のHTMLコードが光って教えてくれます。
今回は株探のHPのPER、PBR、利回りの情報を取得したいので、下のようにid情報を調べました。