Warning: Undefined variable $tag in /home/shirotan/rikei-fufu.com/public_html/wp-content/themes/swell_child/functions.php on line 61
Warning: Undefined variable $tag in /home/shirotan/rikei-fufu.com/public_html/wp-content/themes/swell_child/functions.php on line 61
Warning: Undefined variable $tag in /home/shirotan/rikei-fufu.com/public_html/wp-content/themes/swell_child/functions.php on line 61
Warning: Undefined variable $tag in /home/shirotan/rikei-fufu.com/public_html/wp-content/themes/swell_child/functions.php on line 38
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を取得できます。
'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タグ(ニュース記事のトピックス)を取得するコードです。
'ブラウザを使わないやり方
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で作ってみようかなと思っています。
その様子も記事で紹介していきますね。
んじゃ、また~
おススメのプログラミング独学方法は?
コメント