torianon201’s blog

30代男性が好きなことを好きなように書いているブログです。

Excel VBA初心者がGoogle Chromeを使ったWebスクレイピングに挑戦

VBA初心者がWebスクレイピングをしてみました

ExcelVBA(マクロ)機能を使用して、Webから取得した情報をExcelに落とし込むプログラムを作成しました。
VBAは便利だということは噂では聞いていたのですが、なかなか手を出せずにいて、最近時間ができたので勉強を始めました。
全くの素人の状態から適当に購入した一冊の本とインターネットの情報を頼りに、何とか目指していた形に仕上げることができました。
質の低いプログラムになっていると思いますが、VBAを使い始めた最初の記録として残しておきたいと思います。

プログラム概要

株式の情報が記載されている株探のHP(https://kabutan.jp/)で

  1. 銘柄コードで調べたい企業を検索
  2. PER、PBR、利回り、株価を情報を取得
  3. 取得した情報をExcelで表にする

今までは手動で一銘柄ずつ調べて、Webページから転記して・・・という方法で行っていましたが、VBAで自動化に成功しました!

作成に掛かった時間

【前提】
VBAを一度も触ったことがない
Excelは最低限の関数(SUM、IF、LOOKUP、etc...)は使える程度
の状態からスタート


【費やした時間】
・本を読みながら基本的な動作の理解、習得:5時間
・プログラムの作成:2時間

Chromeからのスクレイピングの方法を調べるのに1時間ほど時間を費やしてしまいました。Internet Explorerがサポート終了する前は、Internet Explorerを使用したスクレイピングが一般的?だったようで、Internet Explorerスクレイピングの方法はいろんなwebページが見つかりましたが、素人にもわかりやすいChromeのページがなかなか見つからず苦労しました。


プログラムの内容

初期設定

ChromeVBAで操作するためにはいくつか設定が必要です。初期設定についてはこちらを参考にしてください。
torianon201.hatenablog.com



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を調べて情報を取得します。

  1. Chromeで情報を取得したいページを開いた状態で右クリック
  2. 検証をクリック
  3. 画面右側に表示される↓図の赤枠部分をクリック

するとWebページにカーソルを合わせると、右側の画面でカーソルを合わせた部分のHTMLコードが光って教えてくれます。



今回は株探のHPのPER、PBR、利回りの情報を取得したいので、下のようにid情報を調べました。