Excel VBA + Selenium でスクレイピングしてみた

Excel の VBA は Windows3.1Aの時代からお手軽なシステム開発用言語として使ってる。
その当時は空間熱量のシミュレーションシステムなどという「言語選定間違ってるんじゃね?」というようなものまで作らされたりして最後はチート技まで作り出せるレベルにまでなったんだけど、VBAを使っている限りMSの呪縛からは逃れられないので今はPythonがお気に入りになっている。

そんな訳でブラウザコントロールの主な方法には、Python + Seleniumを使用している。もちろんPython(+Selenium)からExcelをコントロールする方法もあるのだが、Excelから直接Seleniumをコントロールできれば、無駄がなくメリットも多いだろう。

で調べてみると、やっぱりあるんですね。

VBAでWebスクレイピングする方法としてIE自動操作がありますが、VBA記述が結構面倒になります、もっと簡単にスマートにVBAを書きたいと思ったら…SeleniumBasicを使ってみましょう。SeleniumBasicは、エクセルVBAでのWeb閲覧を自動化することを強力かつ簡単に実現してくれます。

既に詳しく書いてくれている方々がいるので参考にさせて頂きました。
ここではメモレベルの解説になるので、内容が理解できない場合はリンクを辿ってもらった方が良いかもしれない。


この記事では、速攻でExcelでブラウザ(Chrome)をコントロールできる環境にすることが目的です。

では始めます。

今回使用したソフトウェアの各バージョンは、
Windows 10 Pro 1809
Excel 2007 12.0.6787.5000
Chrome  64bit  79.0.3945.130
ChromeDriver 79.0.3945.36
SeleniumBasic v2.0.9.0

てな感じです。

SeleniumBasicをダウンロードしてインストールする。
A Selenium based browser automation framework for VB.Net, VBA and VBScript - florentbr/SeleniumBasic

更新が2016年で止まっているようですが、現時点でこれが最新のようですね。

ダウンロードしたらインストーラを実行します。

最新のChromeDriverをダウンロードし上書きする。

現時点で最新は、80.0.3987.16のようですが、
使用しているChromeのバージョンに合わせて、79.0.3945.36をダウンロードします。
「大抵のものは最新版を入れれば間違いない」と適当に選ぶのですが、
これはバージョンをちゃんと合わせないとうまく動かないことが多いです。

解凍しSeleniumBasicのフォルダ内にあるChromeDriver.exeに上書きします。
これはもちろんSeleniumBasicに入っているChromeDriverが古くて今使用しているChromeがコントロールできないからです。

場所は、

C:\Users\自分のユーザー名\AppData\Local\SeleniumBasic

ですね。

Excel VBA でSeleniumが使用できるように環境を整える

「開発」タブがない場合は、 「Excelのオプション」から追加します。


Excel/開発/VisualBasic でウィンドウを開き。

ツール/参照設定を開きます。

Selenium Type Library にチェックを入れます。

これでもう使えるようになっているはずです。

動くか確かめる

まるむしアンテナのタイトルを取得してみましょう。

タイトル部のXPathは、「//*[@id=”site-title”]/a」
ですが、VBAで「”」は意味があるので、「””」となります。
「//*[@id=””site-title””]/a」ってことですね。

テストコードはこんな感じです。

Sub ボタン1_Click()
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome"
Driver.Get "https://antenna.infomixer.net/"
Title = Driver.FindElementByXPath("//*[@id=""site-title""]/a").Text
Debug.Print (Title)
End Sub

実行結果です。

Chromeが起動して、まるむしアンテナを表示し、イミディエイトウィンドに「まるむしアンテナ」の文字が出力されました。

成功です。^^

シェアする

フォローする