PythonでWebスクレイピングをする方法を以前勉強し、ブログの検索順位取得ツールを作ってみたのですが、exe化したらファイルサイズが大きすぎてびっくりしました。
では、VBAで同じようにブログの検索順位取得ツールを作ってみたらどうかな、と考えまして、試しにVBAでWebスクレイピングする方法を勉強してやってみました。
VBAでWebスクレイピングする方法を調べると、SeleniumBasicというツールを使うやり方が一般的な様子。
でもSeleniumBasic無しでもWebスクレイピングはできる模様です。
今回はSeleniumBasicを使った方法と、使わない方法の2通りを試してみました。
自分だけでツールを使うならSeleniumBasicを使った方が楽ですが、誰かにあげるツールの場合は相手の環境が分からないのでSeleniumBasicを使わない方法がいいかなと思います。
SeleniumBasicを使用する方法
SeleniumBasicを使ってWebスクレイピングをする方法です。
今回はブラウザにChromeを使用して操作してみます。
参考サイト:VBA+SeleniumBasicで検索順位チェッカー作成
- STEP1インストールSeleniumBasicとChromeDriverをインストールする
- STEP2VBA設定VBAの参照設定でSeleniumを追加する
- STEP3コーディング処理を記述
STEP1:SeleniumBasicとChromeDriverをインストール
SeleniumBasicをインストールします。
基本デフォルトのまま進めてOK。
ChromeDriverをダウンロードします。
使用しているChromeのバージョンに合ったバージョンをダウンロードしましょう。
次に、ダウンロードしたChromeDriver.exeをSeleniumBasicのフォルダーに上書きする必要があります。
STEP2:VBAの参照設定
インストールしたSeleniumBasicをVBAで使用できるように参照設定を行います。
VBAの開発画面で「ツール」→「参照設定」を開き、「Selenium Type Library」を見つけてチェックを入れ、「OK」をクリックします。

STEP3:コーディング
今回はChromeでYahoo!のTOPページにアクセスし、ニュースをクリックし、出てきたニュースの上3つのトピックスを取得するコードを作ってみました。
操作に指定するCSSの取得方法は参考サイトの通りに取得しました。
ChromeのデベロッパーツールでCSSを取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
'SeleniumBasicでchromeを立ち上げる Sub sample() Dim Driver As New Selenium.WebDriver Dim txt As String Driver.Start "chrome", "https://www.yahoo.co.jp/" Driver.Get "/" 'yahoo newsをクリック Driver.FindElementByCss("#topics").Click '上位3つのニュースのトピックスを取得 txt = Driver.FindElementByCss("#contentsWrap > section.topics > div > div > div > ul > li:nth-child(1)").Text Range("A1") = txt txt = Driver.FindElementByCss("#contentsWrap > section.topics > div > div > div > ul > li:nth-child(2)").Text Range("A2") = txt txt = Driver.FindElementByCss("#contentsWrap > section.topics > div > div > div > ul > li:nth-child(3)").Text Range("A3") = txt Driver.Close Set Driver = Nothing End Sub |
オートメーションエラーの対処
サンプルコードを実行すると、Driver.Startの行でエラーになりました。
オートメーションエラーという、原因が分かりにくいエラーです。

調べてみると、.NET Frameworkが無いからでは、とのことです。
参考サイト:SeleniumBasicでオートメーションエラーが発生する場合の対処方法
この参考サイトの通りに.NET Framework3.5をインストールしてみました。

しかし、.NETをインストールしたのにオートメーションエラーが消えない!
調べても原因が分からない!!
:
:
:
解決方法は簡単でした。
パソコンを再起動したらエラーが出なくなりました!
そんなこと調べてもでてこなかったけど、当たり前なのかな?
同じようにエラーが消えなくてお悩みの方、一度PCを再起動してみてください。
サンプルコードの実行結果は最後に紹介します。
Seleniumを使用しない方法
SeleniumBasicを使用しないで、かつブラウザを介さずにHTMLを取得する方法もあるようなので試してみました。
参考サイト:エクセルVBAでHTTPリクエストをする最も簡単なプログラム
エクセルVBAでIEを使わずにHTMLドキュメントを取得する方法
このサンプルコードは、グーグルニュースにアクセスしてHTMLを取得し、h3タグ(ニュース記事のトピックス)を取得するコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
'ブラウザを使わないやり方 Sub sample2() Dim httpreq As Variant Set httpreq = CreateObject("MSXML2.XMLHTTP") httpreq.Open "GET", "https://news.google.com/?tab=rn&hl=ja&gl=JP&ceid=JP:ja" httpreq.Send Do While httpreq.readyState < 4 DoEvents Loop Dim html As Variant Set html = CreateObject("htmlfile") html.write httpreq.responseText Debug.Print html.Title Dim htmlh3 As Variant Dim i As Integer i = 1 For Each htmlh3 In html.getElementsByTagName("h3") 'google newsのトピックス Cells(i, 2).Value = htmlh3.innerText i = i + 1 Next Set httpreq = Nothing Set html = Nothing End Sub |
このコードはエラーもなくさらっと実行できました。
Webスクレイピングを実行した結果
サンプルコードでWebスクレイピングしてみた結果を載せます。
まず、SeleniumBasicを使用するコードで参照したYahooニュースの画面はこちらです。
Yahooニュースの上位3つの取得結果はExcelシートのA列に出力させました。

お次はSeleniumBasicを使用しないソースコードで使用したグーグルニュースの画面はこちら。
h3タグ(ニューストピックス)を取得した結果をExcelのB列に表示させました。

サンプルコードを実行した結果のExcelシートはこちらです。
A列にYahooニュースの3つのトピックス、B列にグーグルニュースのトピックスが出力されています。

VBAでWebスクレイピングする方法、なんとかできるようになりました。
クラウドワークスとかで案件を見てみると、VBAでWebスクレイピングしてほしいといった要望が多数ありますよね。
Webスクレイピングって今まで言葉すら聞いたことなかったけど、使用したい企業は多いんですね。
今回の勉強によって、そのような案件に提案していけそうですね。
ちょっとやってみようかな。
レッツ副業!
今回は試作でしたが、何か自分で使えるツールをVBAで作ってみようかなと思っています。
その様子も記事で紹介していきますね。
んじゃ、また~
コメント