VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング


VBAでIE操作

みなさん、こんにちは!うえはら(@tifoso_str)です。

JavaScriptで動作するWebページを色々な言語でスクレイピング】するシリーズの第二弾です。

前回は、JavaScriptで動作するWebページはVBAのHTTP通信ではスクレイピングできないことを確認しました。

GASやVBAでスクレイピングができない理由として考えるべきJavaScriptのこと
「JavaScriptで動作するWebページ(動的サイト)を色々な言語でスクレイピング」することをシリーズでお伝えしています。 今回はJavaScriptで動作するWebページは普通にスクレイピングできない原因とその解決法をお伝えします。

なぜ、スクレイピングできないか?というと、Webページがサーバーからソースを読み込んだ後に、ブラウザー(Chromeなど)でJavaScriptを実行して画面に表示しているからでした。

HTTP通信

これを解決する為には、ブラウザーでこのWebページを処理させてあげればいいわけです。

そこで、今回は、「VBAでInternet Explorerを操作してJavaScriptで動作するWebページをスクレイピング」していきます。

スポンサーリンク

VBAでInternet Explorerを操作する準備

VBAでInternet Explorerを操作するには下記のライブラリを追加する必要があります。

  • Microsoft HTML Object Library
  • Microsoft Internet Controls

VBEの「ツール」、「参照設定」から追加してください。

参照設定

Microsoftで始まるライブラリは結構な数があるので、見落とさないようにしてくださいね。

参照設定でオブジェクト選択

VBAでIEを操作するための準備は、下記記事で詳しく解説していますので、ご覧下さい。

【エクセルVBAでIE操作】10分で終わるセッティングとWEBページの閲覧確認
エクセルVBAでInternetExplorerを操作するシリーズの導入編です。今回はIEを操作するときに最初にすべきセッティングと実際にWEBページを開く動作確認までをやってみたいと思います。

VBAでInternet Explorerを操作するスクリプト

下記は、VBAでInternetExplorerを操作して、沖縄県企業局のホームページから貯水率を取得するスクリプトです。

Webページへの接続、処理待ち、タイトル表示までは下記シリーズで解説しているので、その次から説明していきます。

【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
エクセルVBAでIEを操作するシリーズの第3回、今回はIEの読み込み待ちの処理を入れていきます。この処理はVBAでIEを扱う限りはほとんどの場合で必要となる処理ですので、ぜひ覚えて頂ければと思います。
Sub scrapingByIE()

    Dim objIE As InternetExplorer
    Set objIE = CreateObject("Internetexplorer.Application")
    objIE.Visible = True
    objIE.navigate "https://www.eb.pref.okinawa.jp/kassui/"

    Do While objIE.Busy = True Or objIE.readyState < 4
        DoEvents '処理待ち
    Loop

    Application.Wait Now + TimeValue("0:00:01")'HTMLの読み込み待ち

    Dim htmlDoc As HTMLDocument
    Set htmlDoc = objIE.document
    
  Debug.Print htmlDoc.Title 'タイトル

    Dim hiduke As IHTMLElement
    Set hiduke = htmlDoc.getElementById("chosui_hiduke")
    Debug.Print "■日付は「" & hiduke.innerText & "」です。"

    Dim ritsu As IHTMLElement
    Set ritsu = htmlDoc.getElementById("ritsu_today4")
    Debug.Print "■本日の貯水率は「" & ritsu.innerText & "」です。"
    
    objIE.Quit 'IEを閉じる
    Set objIE = Nothing
End Sub

JavaScriptの実行待ちの処理を入れる

12行目は、InternetExplorerがJavaScriptを実行するための実行待ち時間です。

小生の環境ではJavaScriptの処理に8ミリ秒必要だったので、1秒あれば十分だと思います。

VBAの処理を指定の時間まで止めるにはApplicationオブジェクトのWaitメソッドを使用します。

Application.Wait 指定時間

この指定時間は、Excelの日付形式で指定します。

今回は実行時刻に1秒足した時間まで停止するようにします。

実行時刻はNow関数で取得できます。

1秒足した時間を表すのにTimeValue関数を使用します。

TimeValue(時刻文字列)

この停止時間は、Webページのソース量やパソコンの性能にもよりますので、時間は適宜調整してください。

なお、今回はJavaScriptの実行待ちでよかったですが、Webページによってはボタンの操作だったり、その他の処理が必要になることがあります。

それぞれのWebページに合わせて、処理を変化させる必要がありますので、ご注意ください。

HTMLタグのIDを利用して要素を取得する

今回は下記のように取得する要素にIDがあるので、IDを元に要素が取得できます。

日付
<span id="chosui_hiduke">06月21日</span>
 
貯水率
<td align="right" id="ritsu_today4">72.1</td>

IDから要素を取得するときは、getElementByIdメソッドを使用します。

HTMLドキュメント.getElementById(ID)

今回でいうとIDは「chosui_hiduke」と「ritsu_today4」になります。

欲しい要素のHTMLタグにIDが設定してあると、ピンポイントで簡単に取得できます。

スクレイピングするときは、要素のタグにIDが設定されていないかまず確認してみてください。

スクレイピング結果の確認

上記のスクリプトを実行すると、Internet Explorerが立ち上がり、目的のWebページが表示されます。

イミディエイトウィンドウに結果が表示された後、Internet Explorerが自動で閉じます。

これくらいだと、あっという間に取得しますね!

イミディエイトウィンドウを確認すると下記のように日付と貯水率が表示されます。

イミディエイトウィンドウで貯水率の確認

今回は、ちゃんと日付と貯水率が取得できました!

まとめ

今回は、VBAでInternet Explorerを操作してJavaScriptで動作するWebページをスクレイピングしました。

Internet Explorerを操作するというと、難しく感じるかもしれませんが、HTTP通信するときとさほど変わらないですよね!

次回はGoogle Apps ScriptでJavaScriptで動作するWebページをスクレイピングするために利用するPhantomJs Cloudについて、解説します。

GASでJavaScriptで動作するWebページをスクレイピングするPhantomJs Cloudとは
「JavaScriptで動作するWebページ(動的サイト)を色々な言語でスクレイピング」することをシリーズでお伝えしています。 今回はGoogle Apps Scriptでスクレイピングするために、PhantomJS Cloudのアカウント作成についてお伝えします。

お楽しみに!

連載目次:JavaScriptで動作するWebページを色々な言語でスクレイピング

Webスクレイピングしていて、値が取得できないということはありませんか?

そんな時は、Webサイトの表示にJavaScriptを利用しているからです。

本連載では、色々な言語でその対応をご紹介します!

  1. GASやVBAでスクレイピングができない理由として考えるべきJavaScriptのこと
  2. VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング
  3. GASでJavaScriptで動作するWebページをスクレイピングするPhantomJsとは
  4. GASでPhantomJSを利用してWebページをスクレイピング
  5. GASでスクレイピングしたデータからmatchメソッドと正規表現を使って目的の値を取得
  6. PythonでPhantomJs Cloudを利用してWebページをスクレイピング
  7. PythonとPhantomJs CloudでスクレイピングしたデータをBeautifulSoupで解析

タイトルとURLをコピーしました