こんにちは! VBScriptの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩抜け出し、WindowsのOSそのものを手足のように操る自動化の快感を味わいたいなら、ここが最高のスタート地点です。
今回は、業務自動化の現場で今なお絶大な威力を誇る「ブラウザを起動しない超軽量Webスクレイピング」の極意を伝授します。
「Webページからデータを取ってくる」というと、すぐInternet Explorer(IE)を裏で立ち上げたり、重いSeleniumを動かしたりしがちですが……ちょっと待ってください。それ、マシンのリソースを無駄に食っていませんか?
今回は、OSに標準搭載されている `MSXML2.XMLHTTP` と `MSXML2.DOMDocument` を組み合わせ、目に見えない裏側でHTMLを瞬時にダウンロードし、XPathという魔法のクエリでピンポイントにデータを抜き取るテクニックを解説します。
ここをクリアすれば、あなたのVBScriptスキルは間違いなく一段上のステージに到達します。さあ、一緒に扉を開けましょう!
—
なぜ「IE起動なし(XMLHTTP + DOMDocument)」なのか?
業務自動化でよくある失敗が、「画面を表示しながらWebからデータを取得する」というアプローチです。これには以下のような致命的な弱点があります。
1. 重い・遅い:ブラウザの描画処理が走るため、とにかく時間がかかる。
2. 不安定:ポップアップ広告やページの読み込み遅延で簡単にフリーズする。
3. 環境依存:現代のモダンブラウザ事情に左右され、メンテナンスが地獄になる。
今回紹介する手法は、「HTMLのテキストをただの文字列(XML/HTMLツリー)としてメモリ上に展開し、住所録からピンポイントで目的のデータを探し出すように抽出する」というアプローチです。
画面すら描きません。だから、爆速です。
—
全体像のイメージ図(頭の中でこれを描こう!)
[Webサーバー]
│ (HTMLをテキストとして取得: MSXML2.XMLHTTP)
▼
[VBScriptのメモリ空間]
│ (DOMツリー構造に変換 & XPathで一発指定: MSXML2.DOMDocument)
▼
[必要なデータだけを抽出! (Excel出力やログ保存へ)]
この流れるような連携こそ、VBScriptが持つ本来のポテンシャルです。
—
実践!超高速スクレイピング・サンプルコード
百聞は一見に如かず。デスクトップに `scrape.vbs` という名前でテキストファイルを作り、以下のコードをそのまま貼り付けてみてください。
今回は、パブリックなサンプルデータとして、Wikipediaなどの構造をイメージしたHTML取得を想定し、汎用的に使える堅牢なコードを用意しました。
‘ ==============================================================================
‘ スクリプト名: fast_scraper.vbs
‘ 概要: MSXML2とXPathを使用した超軽量Webスクレイピングサンプル
‘ 執筆者: チーフアーキテクトからの伝言
‘ ==============================================================================
Option Explicit
Dim url, http, htmlDoc, targetNodes, node, i
‘ 1. 取得したい対象のURL(今回はテスト用にダミー、もしくは実際の静的ページを指定)
url = “https://example.com” ‘ 必要に応じて実際のURLに変更してください
WScript.Echo “【1/3】サーバーへリクエストを送信中…”
‘ 2. MSXML2.XMLHTTPオブジェクトの生成(通信担当)
Set http = CreateObject(“MSXML2.XMLHTTP”)
http.Open “GET”, url, False
http.Send
‘ ステータスコードのチェック(200以外はエラー)
If http.Status <> 200 Then
WScript.Echo “エラーが発生しました。ステータスコード: ” & http.Status
WScript.Quit
End If
WScript.Echo “【2/3】HTMLデータをメモリ上のDOMに展開中…”
‘ 3. MSXML2.DOMDocumentオブジェクトの生成(解析担当)
Set htmlDoc = CreateObject(“MSXML2.DOMDocument”)
htmlDoc.Async = False
htmlDoc.ValidateOnParse = False
‘ 取得したHTMLテキストをDOMにロード
‘ ※注意: 現代のHTMLは構造が崩れていることがあるため、厳密なXMLパースでエラーが出ないよう工夫が必要な場合があります
htmlDoc.LoadXML http.responseText
‘ 4. XPathを用いたデータ抽出(ここが最大のハイライト!)
‘ 例: 全ての
- タグのテキストをごっそり取得する場合 Set targetNodes = htmlDoc.SelectNodes(“//h2”) WScript.Echo “【3/3】XPathによる抽出結果:” WScript.Echo “————————————————–” If targetNodes.Length = 0 Then WScript.Echo “条件に一致する要素が見つかりませんでした。” Else For i = 0 To targetNodes.Length – 1 WScript.Echo “[” & (i + 1) & “] ” & targetNodes(i).Text Next End If WScript.Echo “————————————————–” WScript.Echo “処理が正常に完了しました。” ‘ 5. オブジェクトの解放(メモリ管理の基本) Set targetNodes = Nothing Set htmlDoc = Nothing Set http = Nothing — コードの核心を噛み砕く!重要ポイント解説
- ` タグを検索 `//table[@id=’results’]/tr/td` ⇒ idが “results” のテーブルの中にある行のセルを狙い撃ち `htmlDoc.SelectNodes(“XPath式”)` を使えば、一瞬で条件に合致する要素のコレクション(配列のようなもの)が手に入ります。 — 現場で絶対につまづく「陥りやすいエラー」と対策
タグのテキストをごっそり取得する場合 Set targetNodes = htmlDoc.SelectNodes(“//h2”) WScript.Echo “【3/3】XPathによる抽出結果:” WScript.Echo “————————————————–” If targetNodes.Length = 0 Then WScript.Echo “条件に一致する要素が見つかりませんでした。” Else For i = 0 To targetNodes.Length – 1 WScript.Echo “[” & (i + 1) & “] ” & targetNodes(i).Text Next End If WScript.Echo “————————————————–” WScript.Echo “処理が正常に完了しました。” ‘ 5. オブジェクトの解放(メモリ管理の基本) Set targetNodes = Nothing Set htmlDoc = Nothing Set http = Nothing — コードの核心を噛み砕く!重要ポイント解説
初心者のうちは、見慣れないオブジェクトやメソッドがたくさん出てきて面食らうかもしれませんが、怯える必要はありません。重要なのは以下の3つのパーツです。
① `MSXML2.XMLHTTP` で「電撃ダウンロード」
Set http = CreateObject(“MSXML2.XMLHTTP”)
http.Open “GET”, url, False
http.Send
`Open` メソッドの第3引数にある `False` は、「同期通信(終わるまで次の処理に進まない)」を意味します。非同期にするとコードが複雑化するため、バッチ処理やスクレイピングでは基本 `False`(同期)を指定するのが鉄則です。
取得した生データは `http.responseText` というただの巨大な文字列として保管されます。
② `MSXML2.DOMDocument` でHTMLを「ツリー構造」に化かす
文字のままだと、どこに何が書いてあるかコンピュータには分かりません。そこで、HTMLを「親子関係を持つツリー構造(DOM)」に変換します。
Set htmlDoc = CreateObject(“MSXML2.DOMDocument”)
htmlDoc.LoadXML http.responseText
ここでポイントなのは、`htmlDoc.Async = False` です。DOMの読み込みが完了する前に次の行にいってしまうバグを防ぐための、VBScript職人の必須のお呪いだと思ってください。
③ 最強の検索クエリ `XPath` によるピンポイント抽出
ここが今回の最大の武器です。例えば、特定のクラスがついたテーブルのセルだけをごっそり抜きたい時、VBScriptで何重もの `For` ループを書くのは地獄です。
そこで XPath(XML Path Language) を使います。
- `//h2` ⇒ ドキュメント内のすべての `
` タグを検索 `//table[@id=’results’]/tr/td` ⇒ idが “results” のテーブルの中にある行のセルを狙い撃ち `htmlDoc.SelectNodes(“XPath式”)` を使えば、一瞬で条件に合致する要素のコレクション(配列のようなもの)が手に入ります。 — 現場で絶対につまづく「陥りやすいエラー」と対策
この手法を実務で使おうとすると、必ず壁にぶつかります。先輩エンジニアからのアドバイスとして、代表的なエラーと回避策を伝授しておきます。
1. 「文字化け」が発生する
- 原因: 取得元のWebサイトがUTF-8なのに、Shift-JIS環境のVBScriptがそのまま受け取ると、日本語が「」のようになります。
- 対策: `MSXML2.XMLHTTP` は文字コードの自動判定をミスることがあります。もし文字化けする場合は、レスポンスをバイナリとして受け取り、ADODB.Stream等で適切な文字コードにデコードする処理を挟む必要があります(少し応用的なテクニックになります)。
2. 「HTMLの構造が汚すぎて DOMDocument.LoadXML がエラーを吐く」
- 原因: 現代のWebページはタグの閉じ忘れなど、HTMLのルール違反がざらにあります。厳格なXMLパーサーである `DOMDocument` は、少しの崩れも許さずエラーを起こします。
- 対策: 完全に整ったXHTMLや、XML形式できれいに記述されたAPIレスポンス(JSONやXML)を狙う場合はこの手法が最強ですが、通常の雑多なHTMLをスクレイピングする場合は、タグの構造エラーを無視するようなパース設定、あるいは正規表現やHTMLfileオブジェクト(`InternetExplorer.Application` ではなく `htmlfile` コンポーネント)の利用を検討する柔軟性も持ち合わせておきましょう。
(※ `CreateObject(“htmlfile”)` を使うと、IEを起動しなくても簡易的なHTMLパースが可能です!)
—
まとめ:VBScriptの真髄は「軽さと手軽さ」にあり
今回は、`MSXML2.XMLHTTP` と `MSXML2.DOMDocument`、そして XPath を駆使した超軽量Webスクレイピングの極意をお伝えしました。
- ブラウザを起動しないから、速い・軽い・壊れない
- XPathを使えば、欲しいデータへ一発でアクセスできる
- オブジェクトの生成と解放(`Set … = Nothing`)を忘れない美意識を持つ
ここをクリアしたあなたなら、もはやただの初学者ではありません。業務の効率化を裏側から支える、立派な自動化エンジニアの思考回路を手に入れています。
日々の退屈なコピペ作業はスクリプトに任せて、あなたしかできないクリエイティブな仕事に時間を使いましょう。それでは、また次の極限の知見でお会いしましょう!
