Categories: excel

VBAでできる!Excelを使ったスクレイピング入門ガイド

「スクレイピング」と聞くと、PythonやJavaScriptを使った難しそうな技術を想像するかもしれません。ですが、実はExcelのVBAでも簡単なスクレイピングが可能です。
業務でよく使うサイトから定期的に情報を取得したいときや、データ収集を自動化したいときに、VBAでのスクレイピングはとても便利な手段です。

この記事では、VBAでのスクレイピングの基本から、実際のコード例まで、初心者にもわかりやすく丁寧に解説します。


VBAでスクレイピングを行うための基本知識

VBAでスクレイピングを行うには、以下のような準備が必要です。

  • Microsoft HTML Object Libraryの参照設定
    HTMLドキュメントを操作するには、このライブラリの参照設定が必須です。
    Excelの「開発」タブ →「ツール」→「参照設定」で「Microsoft HTML Object Library」にチェックを入れてください。
  • XMLHttpRequestの使用
    インターネット上のページを取得するために、XMLHttpRequestオブジェクトを使います。
  • HTML構造の理解
    スクレイピングは、HTML要素の構造(タグやクラス名など)を把握してデータを抽出する作業です。ブラウザの開発者ツール(F12)を使って構造を確認しましょう。

VBAでスクレイピングを行うコードの基本構造

以下に、VBAでWebページのデータを取得し、特定の情報を取り出す基本コードを紹介します。

Sub WebScrapingSample()
Dim http As Object
Dim html As Object
Dim url As String
Dim result As String

url = "https://example.com" ' ここに対象のURLを指定

Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.Send

If http.Status = 200 Then
Set html = CreateObject("HTMLFile")
html.body.innerHTML = http.responseText

' 例: タイトルタグの内容を取得
result = html.getElementsByTagName("title")(0).innerText
MsgBox "ページのタイトル: " & result
Else
MsgBox "ページの取得に失敗しました。"
End If
End Sub

このコードでは、WebページのHTMLを取得し、タイトル要素(<title>タグ)の内容を抽出しています。


HTML要素から必要な情報を取得する方法

スクレイピングでは、目的の情報を取得するためにHTMLの構造を把握する必要があります。

たとえば、特定のclassを持つ<div>から情報を取りたい場合、以下のように記述できます。

Dim elements As Object
Set elements = html.getElementsByTagName("div")

For Each element In elements
If element.className = "news-title" Then
Debug.Print element.innerText
End If
Next

このようにclassNameidで条件を指定し、ループで目的の情報を抽出します。


実践例:ニュース見出しを取得する

たとえば、Yahoo!ニュースの見出しを取得してみましょう(対象ページの構造は変わる可能性があります)。

Sub GetYahooNews()
Dim http As Object
Dim html As Object
Dim elements As Object
Dim element As Object
Dim url As String
Dim i As Integer

url = "https://news.yahoo.co.jp"

Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.Send

If http.Status = 200 Then
Set html = CreateObject("HTMLFile")
html.body.innerHTML = http.responseText

Set elements = html.getElementsByTagName("a")
i = 1
For Each element In elements
If InStr(element.className, "sc-h") > 0 Then
Cells(i, 1).Value = element.innerText
i = i + 1
End If
Next
Else
MsgBox "取得に失敗しました。"
End If
End Sub

このコードでは、見出しに使われているリンク要素を抽出し、Excelのセルに書き出しています。classNameの確認には、ブラウザの検証ツールを使います。


スクレイピングの注意点とマナー

VBAによるスクレイピングを行う際には、以下の点に注意してください。

  • 対象サイトの利用規約を確認する
    サイトによってはスクレイピングを禁止している場合があります。
  • 大量アクセスを避ける
    不要なアクセスを繰り返すと、相手のサーバーに負荷をかけてしまいます。
  • APIの利用を検討する
    スクレイピングよりもAPIの提供があれば、そちらの利用が望ましいです。

まとめ:VBAでも十分にスクレイピングは可能!

VBAはエンジニアでなくても触れることができる便利なツールです。業務で毎回ブラウザから手作業でコピペしているような作業があれば、今回紹介したようなスクレイピングで自動化できる可能性があります。

まずは簡単なページから、VBAでのスクレイピングを試してみてください。データ収集の効率が格段にアップするはずです。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。