【エクセルVBA】スクレイピングでWeb上のテーブルデータを取得する(Selenium – AsTable)(Chrome)

WEB上のテーブルデータをエクセルに取得して集計することになったけど、毎回手動でコピペするのは結構手間だな。
VBAからでも「スクレイピング」という手法でWEB上のデータを取得できるらしいけど、基礎的なHTMLの知識も必要みたいで、なんだか難しそう。

VBAからWEB上のデータを取得するというのは、あまりピンとこないかもね。
だけど「Selenium」っていうツールを使えば、思ったより簡単にデータ取得できるよ。

この作業を自動化できたら大分手間が省けるので、とりあえずどんなものかやってみたいな。
それ、教えてもらえませんか?

それじゃまずは「Selenium」のインストールね。

そのあとVBAから「Chrome」を操作して、WEB上のテーブルデータを取得してみましょう。

ということで、「Selenium」を使って、Web上のテーブルデータ(<table>タグ)からデータ取得して、エクセルに貼り付けてみます。

スクレイピングでデータ取得するには、HTMLの構造に合わせて目的のデータまで辿り着くのが大変だったりしますが、この記事では「一つの<table>タグ」の内容を取得する簡単なサンプルを紹介します。

はじめに

まず、事前に以下の準備が必要となります。

  1. Chromeのインストール(Chromeを使用していない場合)
  2. SeleniumBasicのインストール
  3. ChromeDriverの配置
  4. ChromeDriverへの参照設定

「事前準備」のところで手順の説明をします。

また、スクレイピングはサイトによっては禁止しているところもあります。

例えば、「Yahoo!ファイナンス」なんかは、以下のように明示的に禁止を謳っています。

Yahoo!ファイナンスでは、Yahoo!ファイナンスに掲載している株価やその他のデータを、プログラム等を用いて機械的に取得する行為(スクレイピング等)について、システムに過度の負荷がかかり、安定したサービス提供に支障をきたす恐れがあることから禁止しています。

【Yahoo!ファイナンスヘルプ】Yahoo!ファイナンス掲載情報の自動取得(スクレイピング)は禁止しています

スクレイピングでアクセスするサイトの利用規約などを確認し、実行については自己責任でお願いします。

事前準備

以下の手順に従って、事前準備をします。(Chromeはインストール済みとします)

SeleniumBasicのインストール

  • 手順1
    「SeleniumBasic」のインストーラーをダウンロードする

    以下の「SeleniumBasic」のダウンロードページにアクセスします。

    Seleniumbasic
    Seleniumbasic : A Selenium based browser automation framework for VB.Net, VBA and VBScript

    Downloadのところにある「Release page」をクリックします。

    Seleniumbasicダウンロード手順1

    「exe」ファイルのリンクをクリックし、インストーラーをダウンロードします。

    Seleniumbasicダウンロード手順2
  • 手順2
    「SeleniumBasic」をインストールする

    ダウンロードしたファイルをダブルクリックし、ウィザードに従ってインストールします。

    Seleniumbasic インストールウィザード1
    Seleniumbasic インストールウィザード2
    Seleniumbasic インストールウィザード3

    ※この記事では「Chrome」を操作しますが、他のブラウザにチェックが入っていても問題ないので、デフォルトのままとしています。

    Seleniumbasic インストールウィザード4

ChromeDriverの配置

  • 手順1
    「Chrome」のバージョンを確認する

    「Chrome Driver」にはバージョンがあり、使っている「Chrome」のバージョンと合わせる必要がるため、確認をします。

    「Chrome」を起動して、

    「右上の設定ボタン」→「ヘルプ」→「Google Chrome について」

    と進めます。

    Chromeバージョン確認方法1

    Chromeのバージョンを控えておきます。

    Chromeバージョン確認方法2
  • 手順2
    「ChromeDriver」をダウンロードする

    以下の「ChromeDriver」のダウンロードページにアクセスします。

    ChromeDriver - WebDriver for Chrome - Downloads
    Current Releases If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON ...

    手順1で控えておいた「Chrome のバージョン」と同じバージョンのリンクをクリックします。

    CromeDriverダウンロード手順1

    「Current Releases」のところに同じバージョンがない場合は、ページをスクロールすれば古いバージョンのリンクがありますが、「Chrome」を最新版にアップデートすることを推奨します。

    OSにマッチしたzipファイルをダウンロードします。(この記事ではWindowsを想定しています)

    CromeDriverダウンロード手順2
  • 手順3
    「ChromeDriver」を所定のフォルダに配置する

    ダウンロードしたzipファイルを解凍し、「chromedriver.exe」をSeleniumBasicのインストールフォルダに配置します。

    デフォルトフォルダにインストールした場合は、以下の場所です。

    C:\Users\ユーザー名\AppData\Local\SeleniumBasic

    すでに同名ファイルがありますが、上書きしてください。

    CromeDriver配置手順

ChromeDriverへの参照設定

  • 手順1
    VBEの参照設定をする

    VBEの参照設定から「Selenium Type Library」にチェックを入れます。

    CromeDriverへの参照設定

以上で事前準備は完了です。

ソースコード

Yahooの天気のページから、東京都の週間天気のテーブルデータを取得してみます。

Sub Test()
    'Yahooの東京都の週間天気のページを指定
    Const TARGET_URL As String = "https://weather.yahoo.co.jp/weather/jp/13/4410.html"
    
    'Chromeドライバのオブジェクトを取得
    Dim driver As New Selenium.ChromeDriver

    'Chromeを起動し、指定されたURLのページを表示する
    driver.Get TARGET_URL

    'テーブル情報を取得し、エクセルに貼り付ける
    driver.FindElementById("yjw_week").FindElementByTag("table").AsTable.ToExcel ThisWorkbook.Worksheets("天気").Range("A1")

    'ドライバをクローズし、Chromeを終了する
    driver.Close
    Set driver = Nothing
End Sub

実行結果

Yahooの東京都の週間天気
Yahoo! Japan週間天気ページ(東京)
取得結果
取得結果

※一部、セル内改行があったりなかったりしていますが、これはYahooのHTMLがそのよう構成になっていたためです。

説明

ソースコードの説明は、コメントの通りです。

実行すると画面上では、

Chromeの起動 → 目的のページを表示 → Chromeの終了

(見た目上はわかりませんが、テーブルデータの取得もされています)

が数秒で実施され、VBAからChromeを操作できていることがわかります。

データの取得箇所の決定方法ですが、まずは画面上の目的のデータのところで、「右クリック → 検証」と選択します。

HTML検証

すると、以下のように該当箇所のソースコードが画面右側に表示されます。

Chrome デベロッパーツール

右側にカーソルをあてると、そのHTMLコードに対応する部分が左側の画面上でハイライトされます。

今回は以下のように取得箇所を決定しています。

取得箇所の選定
    <テストコードの12行目>

    driver.FindElementById("yjw_week").FindElementByTag("table").AsTable.ToExcel ThisWorkbook.Worksheets("天気").Range("A1")

「FindElementById」で「id=”yjw_week”」で指定されている「<div>・・・</div>」の部分を取得する。

→「FindElementByTag」で取得した「<div>」の中にある「<table>・・・</table>」の部分を取得する。

→「AsTable」でテーブル形式に変換する。

→「ToExcel」で貼り付け先を指定して、エクセルに貼り付ける。

まとめ

紹介したサンプルでは「テーブルデータを取得する」に特化した内容ですが、取得部分のソースコードがわずか1行でWeb上からデータ取得できるので、とりあえずVBAでスクレイピングをしてみたいという方にはとっつきやすく、スクレイピングをイメージしやすいのではないかと思います。

昨今のサイトは複雑なHTMLで構成されているので、もっと突っ込んだ取得をしたい場合は、このように簡単にはいきませんが、スクレイピングを始めるとっかかりにでもなれば幸いです。

以上、ご覧いただきありがとうございました。