こんにちは、さべろくと申しますm(_ _)m
普段ココナラでExcel VBAのお仕事をやらせて貰っています。
今回ちょっと技術的に面白い挑戦をしたのでそのご報告をしたいと思います。
Excelでスクレイピングツール(Web上のデータを取得するツール)を作る方法はいくつかありますが、Chromeブラウザを使って簡単に作成する方法としてseleniumというものがあります。
seleniumの機能を使うとWeb上のデータが簡単に取得できるようになるので、Excel VBAでスクレイピングツールを作りたい人にはお勧めです。
さて、そんなselenium(Excel VBAで使うseleniumは厳密にはselenium basic)私が個人的にお気に入りの機能があります。
それはjavascriptを実行する機能です!!
立ち上げたChromeブラウザで表示したWebサイトに対して好きなjavascriptのコードを実行できるというものです。
excel vba seleniumで検索するとまだまだ少ないですが色んなサイトがヒットがします。
けれどもこの機能を紹介しているサイトは少ないです。恐らくexcel vbaで書きたいのにjavascriptで書けるよと言われても嬉しくないからなのかな?とか思っています。
けれど、seleniumとExcel VBAでスクレイピングツールを作ろうすると限界があり、私は仕事でスクレイピングツールを作るときはよくjavascriptも使用します。
因みに下記のように書きます。
-----------------------------------------------------------------------------
Dim strJS As String
'実行するjavascriptのコードを文字列として設定する
strJS = "return document.querySelector(".Heading1").textContent;"
'javascriptのコードを実行し、実行結果をメッセージボックスで表示
MsgBox Driver.ExecuteScript(strJS)
-----------------------------------------------------------------------------
ExecuteScriptというのでjavascriptのコードが実行できるという訳です。
これを知っているとjavascriptでできることなら恐らく全てが出来るということになります。
そこで気になりました。javascriptで外部のライブラリを読み込むことができるのだろうかと…
例えばjqueryが使えるようになったり、他にも便利な色々なjavascriptのライブラリが使えるようになったら素敵じゃんと!
作成できるプログラムの幅が一気に広がりますね(/・ω・)/
結論から言いますと、出来ました!!
var script = document.createElement('script');
script.src = 'ダウンロードしたいソースのURL';
document.body.appendChild(script);
上記コードをExecuteScriptで実行してあげれば出来ました。
上記コードは簡単に言うと<script src="URL"></script>というタグを埋め込んで実行するコードになっています。
私はhtml2canvasというサイトをキャプチャするのに便利なjavascriptのライブラリをインストールしてみたのですが、出来ました。
そこで表題の話になるのですが、html2canvasというライブラリを使うとサイトのhtmlをjavascriptでレンダリングした画像を取得することができます。
javascriptのコードは以下の通りです。
html2canvas(document.body,{
onrendered: function(canvas){
let downloadEle = document.createElement("a");
downloadEle.href = canvas.toDataURL("image/png");
downloadEle.download = "downloadpage.png";
downloadEle.click();
}
});
これで開いているサイトをキャプチャしたかのような画像がダウンロードされます。
キャプチャしたかのようなというのは、実際にキャプチャしている訳ではなくレンダリングしたデータを取得しているので、例えばiframeやflashを利用している部分は取得できないですし、cssやjavascriptで動的に表示されるサイトの場合は上手く取得できないことがあります。
これで取得できる画像が素晴らしい出来だったら商品としてココナラで売ろうかと思ったのですが残念です(;´・ω・)
気になってやってみようという方がいましたら、ちょっとしたコツがあるのでお伝えします。
scriptタグを埋め込むコードと、埋め込んだライブラリを利用するコードは分けて実行した方がいいです。
scriptタグが実行されてライブラリが読み込まれるのに時間がかかるので、繋げて実行した場合、ライブラリを利用できないというエラーが出てしまい、上手く実行できません。
間にwaitを入れて時間を置いてライブラリを利用するコードを実行した方がいいです。
商品としてはお渡しできませんが、本ブログを見てくださった方限定でメッセージでプログラム頂戴と言っていただければ、URLを指定すると指定したURLのサイトの画像が自動で取得できるツールをお渡しします。
seleniumを使うのに初期設定が必要なので、初期設定をまだしていないという方にはマニュアルもお渡ししますので一言お伝えください。
という訳で、Excel VBA+selenium+javascriptで出来ることが広がったというお話でした(私の中では)。
ここまで読んでいただきありがとうございました。
何か気になったことがありましたら気軽にメッセージください。
※2022/05/31追記
本記事ではjavascriptを用いてキャプチャを取得しましたが、ただキャプチャを取得するだけならseleniumにTakeScreenshotというメソッドがあるため、こちらの利用をお勧めします。
driver.TakeScreenshot.SaveAs "C:\test\test.png"
こちらの方法だと表示画面のキャプチャとなります。本記事で紹介した方法だとサイト全体が1枚の画像として保存できます。