VBScriptでWEBスクレイピング!ブラウザの読み込み待ちをしてエラーを回避する

こんにちは!あつもり(@atumori17)です。

VBScriptでIEを操作してWEBスクレイピング!の第4回目で~す。
前回はHTMLドキュメントとタイトルを取得する方法を紹介しました。

VBScriptでWEBスクレイピング!HTMLドキュメントとタイトルを取得する方法
IEを操作してHTMLドキュメントからWEBサイトのタイトル名を取得するテクニックを紹介します。IEでページ全体を読み込みんでからtitleタグをキーにしてタイトル名を取得します。HTMLの知識がちょっとだけ必要になってきますので合わせて解説していきます。

しかし、最後の最後でアプリケーションを実行したところ、エラーが表示されてしまいましたよね。その理由がブラウザの読み込み待ち処理をしていないから、というところまで説明しました。

今回はブラウザの読み込み待ちをしてエラーを回避する方法を紹介します。面倒なようですがWEBスクレイピングはIEがページ全体を読み込むまで待ってあげてから、データを取得するという手順を踏まなければならないんですね~。

スポンサーリンク

ブラウザの読み込み待ちをするスクリプト

テキストエディタ開き下記のコードを入力します。全て入力し終わったら「titleタグ取得.vbs」のファイル名でデスクトップに保存します。前回作成したファイルに上書き保存してかまいません。

Option Explicit

    Dim objIE
    Dim objLink

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    'IEを開く
    objIE.navigate "http://google.co.jp/"
    
    'ページが読み込まれるまで待つ
    Do While objIE.Busy = True Or objIE.readyState <> 4
        WScript.Sleep 100        
    Loop    
    
    'タイトルをテキストファイルに書き出す
    OutputText objIE.document.Title 

'テキストファイルへ出力
Function OutputText(ByVal strMsg)

    Dim objFSO
    Dim objText

    'ファイルシステムオブジェクト
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    ’テキストファイルを開く
    Set objText = objFSO.OpenTextFile("C:\work\title.txt", ForAppending, True)

    objText.write strMsg    
    objText.write vbCrLf

    objText.close
    
    'オブジェクト変数をクリア
    Set objFSO = Nothing
    Set objText = Nothing 

End Function

プログラムコードの解説

全体の流れは以下のようになります。

  1. IEでページを開く
  2. IEの読み込み待ちをする
  3. テキストファイルにWEBサイトのタイトル名を書き出す

今回はIEでページを開いたあとの読み込み待ちの処理について説明していきます。

IEの読み込み待ちの処理

冒頭でもご説明した通りIEがページ全体を読み込み終わったあとでないと、タイトル名を抜き出すことはできません。そのためIEがページ全体を読み込むまで待ってあげる必要があります。

下記のようにコードを書くことで、IEがページ全体を読み終えるまで処理を待機させることができます。上のコードの13~16行目にあたります。

    Do While objIE.Busy = True Or objIE.readyState <> 4
        WScript.Sleep 100        
    Loop

BusyプロパティとreadyStateプロパティから読み込み状態を調べる

次の2つの条件のどちらかが満たされるまでループし、ループしている間はsleep関数を実行します。

InternetExplorerオブジェクト.Busy = True

BusyプロパティはIEがビジー状態かを示します。ビジーならTrueを返し、ループ処理を続けます。

InternetExplorerオブジェクト.readyState <> 4

readyStateプロパティはドキュメントの読み込み状態を示します。4の場合に読み込みが完了したということですので、4以外の場合はループ処理を続けます。

Sleep関数でウエイトさせる

WScriptオブジェクト.Sleep 時間

ループ中は画面が固まらないようにSleep関数を実行します。時間はミリ秒で指定します。1000と指定した場合、VBScriptの処理を1秒間中断します。

エクセルVBAですとSleep関数は使わずDoEvents関数を使い、Do Whileでループしている間に画面が固まらないようにOSに処理を渡すということをします。しかしVBScriptはDoEvents関数がないため代わりにSleep関数を使うというわけです。

エクセルVBAでの読み込み待ち処理を過去の記事で紹介していますので参考にしてみてください。

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

読み込み待ちの処理が終わったら、取得したタイトル名をテキストファイルに書き出します。テキストファイルの書き出しについては前回の記事を参考にしてみてください。

VBScriptでWEBスクレイピング!ファイルシステムオブジェクトでテキストに書き出す
VBScriptでファイルシステムオブジェクトを使ってシンプルにテキストファイルに保存するテクニックの紹介です。せっかくWEBスクレイピングでWEBサイトから必要な情報を取得しても、保存する場所がなければ取得したデータを使うことはできないからです。

アプリケーションを実行してみる

では実際に起動してみます。デスクトップにある「titleタグ取得.vbs」をダブルクリックして起動します。エラーメッセージが表示されずに起動するでしょうか?ドキドキですね~。

OpenTextFileメソッドで指定したパスに「title.txt」ができました。

「title.txt」を開くとWEBページのtitileが書かれています。エラーメッセージが表示されることなく無事タイトル名を取得できましたねっ!

まとめ

いかかでしたか?今回の内容をまとめると以下のようになります。

  • WEBページから情報を取得するときはIEのページ読み込み待ち処理を入れる
  • ページの読み込み状態はBusyプロパティとreadyStateプロパティからを調べる
  • ページの読み込み中に画面が固まらないようにSleep関数を使う

今回は以上です。それではお疲れさまでした~。

連載目次:VBScriptでお手軽WEBスクレイピング

Windowsを操作できるプログラミング言語「VBScript」を使えば、InternetExplorerを操作してWEBスクレイピングが可能です。 これで日々の情報収集はダブルクリック一発で完了させましょう!
  1. VBScriptでInternet Explorerを使って複数WEBサイトをダブルクリック一発で開く方法
  2. VBScriptでWEBスクレイピング!ファイルシステムオブジェクトでテキストに書き出す
  3. VBScriptでWEBスクレイピング!HTMLドキュメントとタイトルを取得する方法
  4. VBScriptでWEBスクレイピング!ブラウザの読み込み待ちをしてエラーを回避する
  5. VBScriptでWEBスクレイピング!aタグのリンクURLを全部取得する方法
  6. VBScriptでWEBスクレイピング!aタグのリンクURLをHTMLとして書き出す
  7. VBScriptでWEBスクレイピング!hタグを取得してHTMLとして書き出す
  8. VBScriptでWEBスクレイピング!テーブル要素を取得してCSVファイルで書き出す
  9. VBScriptでWEBスクレイピング!アメブロの管理画面に自動でログインする方法
  10. VBScriptでWEBスクレイピング!アメブロの投稿記事一覧をテキストファイルに書き出す方法
タイトルとURLをコピーしました