みなさん、こんにちは!うえはら(@tifoso_str)です。
【JavaScriptで動作するWebページを色々な言語でスクレイピング】するシリーズの第二弾です。
前回は、JavaScriptで動作するWebページはVBAのHTTP通信ではスクレイピングできないことを確認しました。
なぜ、スクレイピングできないか?というと、Webページがサーバーからソースを読み込んだ後に、ブラウザー(Chromeなど)でJavaScriptを実行して画面に表示しているからでした。
これを解決する為には、ブラウザーでこのWebページを処理させてあげればいいわけです。
そこで、今回は、「VBAでInternet Explorerを操作してJavaScriptで動作するWebページをスクレイピング」していきます。
VBAでInternet Explorerを操作する準備
VBAでInternet Explorerを操作するには下記のライブラリを追加する必要があります。
- Microsoft HTML Object Library
- Microsoft Internet Controls
VBEの「ツール」、「参照設定」から追加してください。
Microsoftで始まるライブラリは結構な数があるので、見落とさないようにしてくださいね。
VBAでIEを操作するための準備は、下記記事で詳しく解説していますので、ご覧下さい。
VBAでInternet Explorerを操作するスクリプト
下記は、VBAでInternetExplorerを操作して、沖縄県企業局のホームページから貯水率を取得するスクリプトです。
Webページへの接続、処理待ち、タイトル表示までは下記シリーズで解説しているので、その次から説明していきます。
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メソッドを使用します。
この指定時間は、Excelの日付形式で指定します。
今回は実行時刻に1秒足した時間まで停止するようにします。
実行時刻はNow関数で取得できます。
1秒足した時間を表すのに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メソッドを使用します。
今回でいうと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について、解説します。
お楽しみに!
連載目次:JavaScriptで動作するWebページを色々な言語でスクレイピング
Webスクレイピングしていて、値が取得できないということはありませんか?
そんな時は、Webサイトの表示にJavaScriptを利用しているからです。
本連載では、色々な言語でその対応をご紹介します!
- GASやVBAでスクレイピングができない理由として考えるべきJavaScriptのこと
- VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング
- GASでJavaScriptで動作するWebページをスクレイピングするPhantomJsとは
- GASでPhantomJSを利用してWebページをスクレイピング
- GASでスクレイピングしたデータからmatchメソッドと正規表現を使って目的の値を取得
- PythonでPhantomJs Cloudを利用してWebページをスクレイピング
- PythonとPhantomJs CloudでスクレイピングしたデータをBeautifulSoupで解析