VBAでwebスクレイピング~2通りの方法をお試し~

VBAでwebスクレイピング
  • URLをコピーしました!
※当ブログではアフィリエイト広告を表示しています

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をインストールする
  • STEP2
    VBA設定
    VBAの参照設定でSeleniumを追加する
  • STEP3
    コーディング
    処理を記述

STEP1:SeleniumBasicとChromeDriverをインストール

SeleniumBasicをインストールします。
基本デフォルトのまま進めてOK。

ChromeDriverをダウンロードします。
使用しているChromeのバージョンに合ったバージョンをダウンロードしましょう。

次に、ダウンロードしたChromeDriver.exeをSeleniumBasicのフォルダーに上書きする必要があります。

STEP2:VBAの参照設定

インストールしたSeleniumBasicをVBAで使用できるように参照設定を行います。

VBAの開発画面で「ツール」→「参照設定」を開き、「Selenium Type Library」を見つけてチェックを入れ、「OK」をクリックします。

VBAの参照設定でSeleniumを追加
VBAの参照設定でSeleniumを追加

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の行でエラーになりました。
オートメーションエラーという、原因が分かりにくいエラーです。

SeleniumBasicを使ってWEBページにアクセスしようとすると、オートメーションエラーが発生
SeleniumBasicを使ってWEBページにアクセスしようとすると、オートメーションエラーが発生

調べてみると、.NET Frameworkが無いからでは、とのことです。

参考サイト:SeleniumBasicでオートメーションエラーが発生する場合の対処方法

この参考サイトの通りに.NET Framework3.5をインストールしてみました。

.NET Framework 3.5をインストール
.NET Framework 3.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列に表示させました。

Googleニュースのトピックス
Googleニュースのトピックス

サンプルコードを実行した結果のExcelシートはこちらです。

A列にYahooニュースの3つのトピックス、B列にグーグルニュースのトピックスが出力されています。

Webスクレイピングで取り出したニューストピックス
Webスクレイピングで取り出したニューストピックス

VBAでWebスクレイピングする方法、なんとかできるようになりました。


クラウドワークスとかで案件を見てみると、VBAでWebスクレイピングしてほしいといった要望が多数ありますよね。

Webスクレイピングって今まで言葉すら聞いたことなかったけど、使用したい企業は多いんですね。

今回の勉強によって、そのような案件に提案していけそうですね。
ちょっとやってみようかな。
レッツ副業!

今回は試作でしたが、何か自分で使えるツールをVBAで作ってみようかなと思っています。

その様子も記事で紹介していきますね。

んじゃ、また~

おススメのプログラミング独学方法は?

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

関連記事

応援よろしくお願いします☆

この記事を書いた人

理系夫婦の妻のほうです。
大学、大学院(修士)で物理を専攻。
2016年に長女を出産、2021年に長男を出産。
フルタイム勤務ワーママ→休職→専業主婦。

コメント

コメントする

目次