WEB上のテーブルデータをエクセルに取得して集計することになったけど、毎回手動でコピペするのは結構手間だな。
VBAからでも「スクレイピング」という手法でWEB上のデータを取得できるらしいけど、基礎的なHTMLの知識も必要みたいで、なんだか難しそう。
VBAからWEB上のデータを取得するというのは、あまりピンとこないかもね。
だけど「Selenium」っていうツールを使えば、思ったより簡単にデータ取得できるよ。
この作業を自動化できたら大分手間が省けるので、とりあえずどんなものかやってみたいな。
それ、教えてもらえませんか?
それじゃまずは「Selenium」のインストールね。
そのあとVBAから「Chrome」を操作して、WEB上のテーブルデータを取得してみましょう。
ということで、「Selenium」を使って、Web上のテーブルデータ(<table>タグ)からデータ取得して、エクセルに貼り付けてみます。
スクレイピングでデータ取得するには、HTMLの構造に合わせて目的のデータまで辿り着くのが大変だったりしますが、この記事では「一つの<table>タグ」の内容を取得する簡単なサンプルを紹介します。
はじめに
まず、事前に以下の準備が必要となります。
- Chromeのインストール(Chromeを使用していない場合)
- SeleniumBasicのインストール
- ChromeDriverの配置
- ChromeDriverへの参照設定
「事前準備」のところで手順の説明をします。
また、スクレイピングはサイトによっては禁止しているところもあります。
例えば、「Yahoo!ファイナンス」なんかは、以下のように明示的に禁止を謳っています。
Yahoo!ファイナンスでは、Yahoo!ファイナンスに掲載している株価やその他のデータを、プログラム等を用いて機械的に取得する行為(スクレイピング等)について、システムに過度の負荷がかかり、安定したサービス提供に支障をきたす恐れがあることから禁止しています。
【Yahoo!ファイナンスヘルプ】Yahoo!ファイナンス掲載情報の自動取得(スクレイピング)は禁止しています
スクレイピングでアクセスするサイトの利用規約などを確認し、実行については自己責任でお願いします。
事前準備
以下の手順に従って、事前準備をします。(Chromeはインストール済みとします)
SeleniumBasicのインストール
- 手順1「SeleniumBasic」のインストーラーをダウンロードする
以下の「SeleniumBasic」のダウンロードページにアクセスします。
SeleniumbasicSeleniumbasic : A Selenium based browser automation framework for VB.Net, VBA and VBScriptDownloadのところにある「Release page」をクリックします。
「exe」ファイルのリンクをクリックし、インストーラーをダウンロードします。
- 手順2「SeleniumBasic」をインストールする
ダウンロードしたファイルをダブルクリックし、ウィザードに従ってインストールします。
※この記事では「Chrome」を操作しますが、他のブラウザにチェックが入っていても問題ないので、デフォルトのままとしています。
ChromeDriverの配置
- 手順1「Chrome」のバージョンを確認する
「Chrome Driver」にはバージョンがあり、使っている「Chrome」のバージョンと合わせる必要がるため、確認をします。
「Chrome」を起動して、
「右上の設定ボタン」→「ヘルプ」→「Google Chrome について」
と進めます。
Chromeのバージョンを控えておきます。
- 手順2「ChromeDriver」をダウンロードする
以下の「ChromeDriver」のダウンロードページにアクセスします。
ChromeDriver - WebDriver for Chrome - DownloadsCurrent 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 のバージョン」と同じバージョンのリンクをクリックします。
「Current Releases」のところに同じバージョンがない場合は、ページをスクロールすれば古いバージョンのリンクがありますが、「Chrome」を最新版にアップデートすることを推奨します。
OSにマッチしたzipファイルをダウンロードします。(この記事ではWindowsを想定しています)
- 手順3「ChromeDriver」を所定のフォルダに配置する
ダウンロードしたzipファイルを解凍し、「chromedriver.exe」をSeleniumBasicのインストールフォルダに配置します。
デフォルトフォルダにインストールした場合は、以下の場所です。
C:\Users\ユーザー名\AppData\Local\SeleniumBasic
すでに同名ファイルがありますが、上書きしてください。
ChromeDriverへの参照設定
- 手順1VBEの参照設定をする
VBEの参照設定から「Selenium Type Library」にチェックを入れます。
以上で事前準備は完了です。
ソースコード
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のHTMLがそのよう構成になっていたためです。
説明
ソースコードの説明は、コメントの通りです。
実行すると画面上では、
Chromeの起動 → 目的のページを表示 → Chromeの終了
(見た目上はわかりませんが、テーブルデータの取得もされています)
が数秒で実施され、VBAから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で構成されているので、もっと突っ込んだ取得をしたい場合は、このように簡単にはいきませんが、スクレイピングを始めるとっかかりにでもなれば幸いです。
以上、ご覧いただきありがとうございました。