【入門編】【IE終了対策】InternetExplorer.Applicationに依存しないMSXML2.XMLHTTPとMSHTMLを用いたWebデータ収集手法 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!VBScriptの基礎から実務での応用まで、一緒にマスターしていきましょう。

今回は、現場でよくある「IE(Internet Explorer)がなくなって、昔書いたスクレイピングスクールが動かなくなった……!」という大ピンチを華麗に解決する、極限までモダンでスマートな手法を伝授します。

「マクロの記録」や古いサンプルコードに頼ってきた方も、ここをクリアすればVBScriptとWindows自動化の基本はバッチリですよ。ぜひ最後までついてきてくださいね!

なぜ「InternetExplorer.Application」はもう使えないのか?

かつて、VBScriptやVBAの世界では、Webページを自動で取得・操作するために `InternetExplorer.Application` オブジェクトを使うのが定番でした。

‘ 【注意】もう動かない、あるいは動かなくなる古いコード
Set ie = CreateObject(“InternetExplorer.Application”)
ie.Visible = True
ie.Navigate “https://example.com”
‘ …要素を取得する処理…

しかし、ご存知の通りInternetExplorerはすでに完全にサポート終了(リタイア)しています。無理やりIEを起動させようとしても、セキュリティの壁に阻まれたり、環境によってはエラーで強制終了したりします。

そこで私たちが取るべきアプローチが、「通信(MSXML2.XMLHTTP)」と「解析(MSHTML)」の完全分離です。

  • 通信担当: サーバからHTMLのテキストだけを高速でGETする (`MSXML2.XMLHTTP`)
  • 解析担当: 取得したHTML文字列をメモリ上でツリー構造に展開し、DOMで要素を自在に引っこ抜く (`MSHTML.HTMLDocument`)

この2つを組み合わせることで、画面(ブラウザ)を一切立ち上げずに、IE時代とは比較にならないほどの爆速でWebデータ収集が完結します。

爆速スクレイピングの全体像(アーキテクチャ)

まずは、今回構築する仕組みのフローをイメージしてください。

[ VBScript ]

├─ 1. HTTP通信 (MSXML2.XMLHTTP.6.0) ──> ターゲットのWebサーバ
│ │ (HTMLテキストを返却)
│ <─────────────────────────────────────────┘ │ ├─ 2. DOM解析 (MSHTML.HTMLDocument) │ └─ 取得したHTML文字列をメモリ上でパース │ └─ 3. 要素の抽出 (getElementById / getElementsByTagName など) └─ 欲しいデータをコンソール出力 or CSV保存 ブラウザのレンダリングエンジンを起動しないため、メモリ消費量はIEの数分の一、実行速度は圧倒的に高速です。 ---

実装コード:IEを使わないWebデータ収集スクリプト

それでは、実際のVBScriptコードを見ていきましょう。
デスクトップなどに `scraper.vbs` という名前で保存し、ダブルクリックすればそのまま実行できます。

今回は例として、サンプル用の構造を持つHTMLを想定した堅牢なコードを記述します。

‘ =================================================================00
‘ 署名: Advanced VBScript Web Scraper (IE-Less Architecture)
‘ 概要: MSXML2.XMLHTTP と MSHTML を用いた高速かつモダンなデータ収集
‘ =================================================================00

Option Explicit

Sub Main()
Dim url, http, htmlDoc, targetElements, i
Dim resultText

‘ 1. 取得対象のURLを指定(適宜書き換えてください)
url = “https://example.com”

WScript.Echo “【情報】サーバへリクエストを送信中…”

‘ 2. MSXML2.XMLHTTP.6.0オブジェクトの生成(通信担当)
‘ ※古い 3.0 や 4.0 ではなく、必ず 6.0 を使用してください(セキュリティ・安定性の面から)
Set http = CreateObject(“MSXML2.XMLHTTP.6.0”)

‘ 3. HTTPリクエストのオープンと送信 (GETメソッド、非同期=Falseで同期通信)
http.Open “GET”, url, False
http.SetRequestHeader “User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64)”
http.Send

‘ ステータスコードの確認 (200以外はエラー処理)
If http.Status <> 200 Then
WScript.Echo “【エラー】データの取得に失敗しました。HTTPステータス: ” & http.Status
Exit Sub
End If

WScript.Echo “【情報】データ取得成功。メモリ上でHTML解析を開始します…”

‘ 4. MSHTML.HTMLDocumentオブジェクトの生成(解析担当)
‘ 生のHTML文字列をDOM(ドキュメントオブジェクトモデル)として扱えるように流し込みます
Set htmlDoc = CreateObject(“MSHTML.HTMLDocument”)

‘ writelnでHTMLを流し込み、closeでパースを確定させる
htmlDoc.open
htmlDoc.writeln http.responseText
htmlDoc.close

‘ 5. DOMを駆使してデータを自在に抽出する
‘ 例: 特定のIDを持つ要素を取得する場合
‘ Dim targetEl
‘ Set targetEl = htmlDoc.getElementById(“main-title”)
‘ If Not targetEl Is Nothing Then
‘ WScript.Echo “タイトル: ” & targetEl.innerText
‘ End If

‘ 例: すべてのリンク(タグ)のURLとテキストを列挙する場合
Set targetElements = htmlDoc.getElementsByTagName(“a”)

resultText = “”
For i = 0 To targetElements.length – 1
resultText = resultText & “テキスト: ” & targetElements(i).innerText & _
” / URL: ” & targetElements(i).href & vbCrLf
Next

‘ 結果の出力
WScript.Echo “— 抽出結果 —” & vbCrLf & resultText

‘ 6. オブジェクトの解放(メモリリーク防止の美学)
Set htmlDoc = Nothing
Set http = Nothing

WScript.Echo “【完了】すべての処理が正常終了しました。”
End Sub

‘ メイン処理の実行
Main()

コードの重要ポイントと「知っておくべき極意」

ここからは、チーフアーキテクトとして実務で絶対に押さえておいてほしいポイントを解説します。

1. なぜ `MSXML2.XMLHTTP.6.0` なのか?

VBScriptの世界では単に `CreateObject(“Microsoft.XMLHTTP”)` と書くこともできますが、これは非常に古いバージョン(MSXML 3.0ベース)を呼び出します。
セキュリティプロトコル(TLS 1.2/1.3など)の対応状況や安定性を考慮すると、必ず `MSXML2.XMLHTTP.6.0` を明示的に指定するのがプロの作法です。

2. `htmlDoc.open` と `htmlDoc.writeln` のマジック

`MSHTML.HTMLDocument` は、本来IEが内部で使っていた強力なパーサーです。
`http.responseText` で得たただの「文字列」を `writeln` で流し込み、`close` を叩くことで、VBAやVBScriptから `getElementById` や `getElementsByTagName` といった馴染み深いDOM操作メソッドが使えるようになります。これが最高に便利なんです。

3. オブジェクトの解放(`Set … = Nothing`)をサボるな

VBScriptにはガベージコレクタ(メモリを自動掃除する仕組み)が一応ありますが、COMオブジェクト(`CreateObject` で生成した外部コンポーネント)は、スクリプトが終わるまでメモリに居座り続けることがあります。
特に大量のURLをループ処理するようなバッチを書く場合、処理の最後できちんと `Set obj = Nothing` を呼ぶことが、メモリリークを防ぐための鉄則です。

陥りやすい罠とエラー対策

最後に、この手法を実務で使うときにつまずきやすいポイントを先回りして解決しておきます。

  • Q. 動的JavaScript(ReactやVue.jsなど)で描画されるデータが取れません!
  • A. `MSXML2.XMLHTTP` は、あくまでサーバーから返ってきた「最初のHTMLソース」しか取得できません。JavaScriptがブラウザ上で実行されて初めて描画される要素は、この手法単体では取得が困難です(その場合はPlaywrightやSeleniumなど、別のアプローチを検討する必要があります)。まずはターゲットのページが「静的HTMLか」を確認しましょう。
  • Q. 文字化けが発生します。
  • A. サイト側の文字コード(UTF-8やShift-JISなど)と、VBScriptが解釈するコードのミスマッチが原因です。もし文字化けする場合は、`http.responseBody`(バイナリデータ)を一度ADODB.Stream等で適切な文字コードに変換するテクニックが必要になります(これについてはまたの機会に深く解説しましょう)。

まとめ

今回は、IE依存からの脱却をテーマに、`MSXML2.XMLHTTP` と `MSHTML` を組み合わせたモダンで高速なWebデータ収集手法を解説しました。

  • IEはもう使わない。通信と解析を分離する。
  • `MSXML2.XMLHTTP.6.0` で高速にHTMLをゲットする。
  • `MSHTML.HTMLDocument` に流し込んでDOMでスマートに要素を抜く。

この型を一度マスターしてしまえば、日々の面倒なデータ収集や定期レポートの自動化などが、驚くほど軽快に動くようになります。ぜひあなたの開発現場でも活用してみてくださいね。

ここをクリアしたあなたなら、もうVBScriptの基礎はバッチリです!次のステップへ進みましょう。

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