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で作ってみようかなと思っています。
その様子も記事で紹介していきますね。
んじゃ、また~
おススメのプログラミング独学方法は?













 
		 
		









コメント