このExcelスクレイピングガイドでは、次の項目について説明していきます。
- VBAとは何か。
- カスタムVBAモジュールでWebからデータを取得できるのかどうか。
- Internet Explorerのサポート終了した今、どうすればExcelでウェブスクレイピングができるのか。
- Seleniumを使ってウェブスクレイピング用のVBAコードを作成する方法。
- Excelでのオンラインデータを取得するための従来の方法。
さっそく始めましょう!
VBAとは何か
VBAとはマイクロソフトが開発したプログラミング言語で、Visual Basic for Applicationsを略した名称です。VBAの開発目的はExcel、Word、Accessなどの様々なMicrosoft Officeアプリケーションで、ユーザーがカスタム関数を作成し、タスクを自動化できるようにすることです。
ExcelではVBAを使用し、スプレッドシートのセル内のデータを操作するためのマクロを細かく組み込んでいくことができます。VBAを使用すると、ワークフローを簡素化して生産性を向上させることができ、さらにExcelの機能を組み込み関数では実現できないレベルに拡張できます。
VBAを使えば、Excelからウェブスクレイピングができますか?
はい。VBAを使えば、Excelから直接ウェブスクレイピングができます。VBAがあれば、次のようなカスタムモジュールを作成できます。
- ブラウザ経由でウェブページに接続する。
- ウェブから取得したHTMLコンテンツをパースする。
- パース結果からデータを抽出する。
- スクレイピングしたデータをExcelのセル内に直接書き込む。
つまり、VBAを使えば、Excel上でウェブスクレイピングを完結させられるのです。さらにただスクレイピングできるだけでなく、VBAを使えばデータをExcelに直接インポートできるため、作業効率が高まります。ここからは、Excelでのスクレイピングの利点と問題点について詳しく学んでいきます。
Excelでウェブスクレイピングをすることの利点と問題点
ウェブスクレイピング用のVBAコードの記述方法を詳しく説明する前に、まずVBAを使ったExcelでのウェブスクレイピングの利点と問題点を確認しておきましょう。
👍 利点
- Excelの機能へのアクセス:スクレイピングしたデータはExcelに直接インポートされるため、そのままExcelのパワフルな機能を使用してデータを操作および分析できます。
- すぐに使える:VBAはMicrosoft Officeに標準で付属しています。つまり、お使いのPCにMicrosoft Office 365をインストールするだけで、ウェブスクレイピングを行うために必要なものがすべて揃うのです。
- 全てのタスクを自動化:VBAのウェブスクレイピングスクリプトを使用すると、データの取得からデータの描写まで、データ収集タスクの全てをExcelで自動化できます。
👎 問題点
- Windowsでしか使用できない機能がある:Active-XコントロールやCOMオートメーション用の VBAパッケージはWindowsでしか使用できず、Office for Macでは動作しません。
- VBAは古臭い: Visual Basicは最新のモダンなプログラミング言語というわけではありません。VBAを使用したことがない場合、構文やコーディング方法が古臭いために、使いにくいと感じるかもしれません。
- Internet Explorerのサポートはすでに終了:ウェブブラウザをコントロールするためのVBA COMオートメーションはInternet Explorerをベースにしていますが、Internet Explorerのサポートはすでに終了しています。
この最後の項目はかなり大きい問題なので、さらに解説していきましょう。
Internet Explorerのサポートが終了した今、どうのようにしてVBAでウェブスクレイピングができるのか?
ウェブスクレイピング用のVBAコードを作成する従来のアプローチは、 InternetExplorerオブジェクトに付属するCOMオートメーションインターフェイスに依存していました。このインターフェイスを使うだけで、Internet Explorer経由でサイトにアクセスし、そのHTMLコンテンツをパースして、サイトからデータを抽出することができました。しかし、Internet Explorerのサポートは2022年6月15日に終了しています。
つまり、Windowsの最新バージョンにはInternet Explorerが付属していません。その結果、現在VBAスクリプトでInternetExplorerオブジェクトを使用するとエラーが発生します。とはいえ、Internet Explorerの代わりとしてEdgeが導入されているので、VBAでも同じようなオブジェクトを使用できるだろうと思う方もいるでしょう。ところが、EdgeにはCOMオートメーションインターフェイスが付属していません。そのため、EdgeをInternet Explorerのようにプログラムでコントロールすることはできません。
その代わり、EdgeではSeleniumなどのブラウザ自動化ツールをWebDriver経由でサポートしており、それを使うことでオートメーションを実装できます。そのため、現在はExcelでVBAを使ってウェブスクレイピングをする場合、SeleniumのVBA用ライブラリを使用することになります。この技術を使用することで、ChromeやEdge、Firefoxなどのブラウザをコントロールできます。
以下では、SeleniumとEdgeを使って、Excelのウェブスクレイピングスクリプトを作成していきます。その後、サードパーティの依存関係を必要としないレガシーアプローチのコードスニペットも見ていきます。
Seleniumを使ってウェブスクレイピングをするためのVBAコードの書き方
このチュートリアルでは、VBA向けのSelenium APIライブラリであるSeleniumBasicを使い、VBAでウェブスクレイピングを実行する方法を学んでいきます。
今回はScrape This Siteにある練習用の世界の国データをスクレイピングしていきます。この練習用データには、世界のすべての国のリストが含まれています。
VBAスクレイパーでこのデータを自動的に取得し、Excelスプレッドシートに書き込むことが今回の目標です。
さぁ、VBAコードを書いていきましょう!
準備するもの
お使いのマシンにMicrosoft Office 365の最新バージョンがインストールされていることを確認してください。このチュートリアルでは、Windows 11とOffice 2024バージョンを使用しています。macOS版やその他のバージョンのOfficeでも、下記と同じような方法を使用できます。
このチュートリアルでは、デスクトップバージョンのOfficeを使用する必要があります。その点にご注意ください。また、無料のMicrosoft 365ウェブプラットフォームでは、VBAスクリプトがサポートされていません。
ステップ1:SeleniumBasicのインストール&セットアップ
GitHubリポジトリのリリースページから、SeleniumBasicのインストーラーをダウンロードします。
.exeインストーラーをダブルクリックし、インストールプロセスが完了するまで待ちます。
ほとんどのVBAパッケージと同様、SeleniumBasicは何年も更新されていません。そのため、最近のブラウザでは動作しなくなったWebドライバが付属しています。これを修正するには、SeleniumBasicのインストールフォルダにあるドライバーの実行ファイルを手動で上書きする必要があります。
ここではEdgeのWebDriverを上書きする方法を説明しますが、ChromeやFirefoxの場合も同じ手順を実行してください。
まず、 Microsoft Edge WebDriverの最新の安定版をダウンロードします。
ほとんどの場合、「x64」バージョンを使うことになります。
これで、edgedriver_win64.zipファイルをダウンロードできたはずです。zipファイルを解凍し、解凍したフォルダに入って、msedgedriver.exeという実行ファイルが含まれていることを確認してください。これがEdge WebDriverの実行ファイルです。
名前を「edgedriver.exe」に変更します。次にこのファイルを正しいフォルダの中に移動させていきます。
次の場所にあるSeleniumBasicのインストールフォルダを開きます:
C:\Users\
edgedriver.exeをこのフォルダ内に移動させ、既存のEdge WebDriver実行ファイルと置き換えてください。
その調子です!これでSeleniumBasicを使って、Excelで最新バージョンのEdgeをコントロールできるようになりました。
ステップ2:Excelを起動する
Windowsのスタートメニューを開き、「Excel」と入力して、Excelアプリをクリックします。その後、「空白のブック」オプションを選択して、新しいスプレッドシートを作成します。
このチュートリアルの終盤で、スクレイピングされたデータがここに書き込まれることになります。
ステップ3:開発者タブを表示させる
上部のタブバーを探しても、VBAスクリプトを作成するオプションは表示されていないかもしれません。その場合、Excelの設定から開発者タブの表示を有効にしなければなりません。
そのためにはまず、左上隅の「ファイル」をクリックします。
その後、次のように「オプション」を選択します。
オプションのポップアップウィンドウで「カスタムリボン」タブを開き、「メインタブ」セクションの「開発者」オプションに移動します。
「OK」を押すと、新しい「開発者」タブが表示されます。
ステップ4:VBAウェブスクレイピングモジュールを初期化する
「開発者」タブをクリックし、「Visual Basic」ボタンを押します。
これにより、次のウィンドウが開きます。
その後、トップメニューの「挿入」、次に「モジュール」をクリックして、VBAスクレイピングモジュールを初期化します。
このような画面が表示されているはずです。
「Book1-Module1 (Code)」の内側のウィンドウに、ウェブスクレイピング用のVBAコードを記述します。
ステップ5:SeleniumBasicをインポートする
トップメニューから「ツール」→「参照設定…」をクリックします。
ポップアップウィンドウで「Selenium Type Library」を探して、開いてください。
「OK」ボタンをクリックすると、Excel上でSeleniumを使用してウェブスクレイピングできるようになります。
ステップ6:Edgeで目的のサイトを自動的に開く:
以下のコードをVBAモジュールウィンドウに貼り付けます:
Sub scrape_countries()
' initialize a Selenium WebDriver instance
Dim driver As New WebDriver
' open a new Edge window
driver.Start "Edge"
' navigate to the target page
driver.Get "https://www.scrapethissite.com/pages/simple/"
' wait 10 seconds before shutting down the application
Application.Wait Now + TimeValue("00:00:10")
' close the current driver window
driver.Quit
End Sub
これによりSeleniumインスタンスが初期化され、さらにそのインスタンスがEdgeに目的のページへアクセスするよう指示を送ります。実行ボタンをクリックして、コードのテストを行なってください。
これにより、次のEdgeウィンドウが開きます。
「Microsoft Edge は自動テストソフトウェアによって制御されています。」というメッセージが表示されます。このメッセージが表示されれば、SeleniumがEdge上で我々の意図どおりに動作しています。
Edgeを表示させたくない場合は、次のコードを組み込むことで、ヘッドレスモードを有効にできます。
driver.SetCapability "ms:edgeOptions", "{""args"":[""--headless""]}"
ステップ7:ウェブページのHTMLコードを検証する
ウェブスクレイピングでは、ページ上のHTML要素を選択し、それらの要素からデータを収集します。HTMLノードを選択する際に最もよく使われるマーカーの一つがCSSセレクタです。ウェブ開発者の方であれば、CSSセレクタについてすでにご存知でしょう。ウェブ開発者でない方は、公式ドキュメントを参照してください。
上手くCSSセレクターを選択するには、まず目的のページのHTML構造に慣れる必要があります。そのため、まずはブラウザでScrape This Siteの練習用国データを開き、国の要素を右クリックして、「検証」オプションを選択してください。
ここからそれぞれの国を表したHTML要素を確認できます
.country
.country以下のHTMLノードを指定する場合、次のセレクタをターゲットにします。
- .country-name要素内の国名。
- .country-capital要素内の首都の名前。
- .country-population要素内の人口情報。
- .country-area要素内の国が占めるkm²単位の面積。
これらは全てCSSセレクタです。この中から希望のHTMLノードを選択し、そこからデータを抽出していきます。では、次のステップでこれらのセレクタの使い方を見てみましょう。
ステップ8:VBAでウェブスクレイピングのコードを書く
WebDriverのfinElementsByCSS()メソッドに、.country CSSセレクタを渡し、ページ上のすべての国 HTMLノードを選択してください。
Dim countryHTMLElements As WebElements
Set countryHTMLElements = driver.FindElementsByCss(".country")
Then, define an integer counter to keep track of the current Excel row to write data in:
Dim currentRow As Integer
currentRow = 1
次に、.countryのHTMLノードを反復処理し、そこから必要なデータを抽出して、 Cells()関数を使用してExcelセルに書き込みます。
For Each countryHTMLElement In countryHTMLElements
' where to store the scraped data
Dim name, capital, population, area As String
' data retrieval logic
name = countryHTMLElement.FindElementByCss(".country-name").Text
capital = countryHTMLElement.FindElementByCss(".country-capital").Text
population = countryHTMLElement.FindElementByCss(".country-population").Text
area = countryHTMLElement.FindElementByCss(".country-area").Text
' write the scraped data in Excel cells
Cells(currentRow, 1).Value = name
Cells(currentRow, 2).Value = capital
Cells(currentRow, 3).Value = population
Cells(currentRow, 4).Value = area
' increment the row counter
currentRow = currentRow + 1
Next countryHTMLElement
その調子です!これで、完成したExcelウェブスクレイピングコードを試してみる準備ができました。
ステップ9:仕上げ
VBAウェブスクレイピングモジュールを書き終わると、次のようになっているはずです。
Sub scrape_countries()
' initialize a Selenium WebDriver instance
Dim driver As New WebDriver
' enable the "headless" mode
driver.SetCapability "ms:edgeOptions", "{""args"":[""--headless""]}"
' open a new Edge window
driver.Start "Edge"
' navigate to the target page
driver.Get "https://www.scrapethissite.com/pages/simple/"
' select all country HTML nodes on the page
Dim countryHTMLElements As WebElements
Set countryHTMLElements = driver.FindElementsByCss(".country")
' counter to the current row
Dim currentRow As Integer
currentRow = 1
' iterate over each country HTML node and
' apply the Excel scraping logic
For Each countryHTMLElement In countryHTMLElements
' where to store the scraped data
Dim name, capital, population, area As String
' data retrieval logic
name = countryHTMLElement.FindElementByCss(".country-name").Text
capital = countryHTMLElement.FindElementByCss(".country-capital").Text
population = countryHTMLElement.FindElementByCss(".country-population").Text
area = countryHTMLElement.FindElementByCss(".country-area").Text
' write the scraped data in Excel cells
Cells(currentRow, 1).Value = name
Cells(currentRow, 2).Value = capital
Cells(currentRow, 3).Value = population
Cells(currentRow, 4).Value = area
' increment the row counter
currentRow = currentRow + 1
Next countryHTMLElement
' close the current driver window
driver.Quit
End Sub
起動して、モジュールの実行が完了するのを待ちます。VBAスクリプトが終わると、Excelスプレッドシートに次の内容が書かれているはずです。
このファイルには、目的のサイトと同じデータが不完全な形の構造で書き込まれているはずです。このようにExcelの機能を活用すれば、データの分析とフィルタリングがはるかに簡単になります。
これで完成です!100行未満のVBAコードで、Excel上でウェブスクレイピングができました。
詳細は「Excel上で行うウェブスクレイピングの仕組み」の記事をご覧ください。
Internet Explorerを使用した従来のVBAウェブスクレイピング方法
古いバージョンのWindowsを使用している場合は、Internet Explorerを使ってVBAでウェブスクレイピングができます。
これはMicrosoft HTML Object LibraryとMicrosoft Internet Controlsの参照を有効にするだけで使用できるようになります。
この2つのパッケージはExcelに組み込まれているため、ライブラリを追加でインストールする必要はありません。
参照を有効にした後、次のウェブスクレイピング用のVBAコードを使用すると、上述のスクリプトと同じ結果が得られます。
Sub scrape_countries()
' start Internet Explorer
Dim browser As InternetExplorer
Set browser = New InternetExplorer
' enable the "headless" mode
browser.Visible = False
'visit the target page
browser.navigate "https://www.scrapethissite.com/pages/simple/"
' wait for the browser to load the page
Do: DoEvents: Loop Until browser.readyState = 4
' get the current page
Dim page As HTMLDocument
Set page = browser.document
' retrieve all country HTML nodes on the page
Dim countryHTMLNodes As Object
Set countryHTMLElements = page.getElementsByClassName("country")
' counter to the current row
Dim currentRow As Integer
currentRow = 1
' iterate over each country HTML node and
' apply the Excel scraping logic
For Each countryHTMLElement In countryHTMLElements
' where to store the scraped data
Dim name, capital, population, area As String
' data retrieval logic
name = countryHTMLElement.getElementsByClassName("country-name")(0).innerText
capital = countryHTMLElement.getElementsByClassName("country-capital")(0).innerText
population = countryHTMLElement.getElementsByClassName("country-population")(0).innerText
area = countryHTMLElement.getElementsByClassName("country-area")(0).innerText
' write the scraped data in Excel cells
Cells(currentRow, 1).Value = name
Cells(currentRow, 2).Value = capital
Cells(currentRow, 3).Value = population
Cells(currentRow, 4).Value = area
' increment the row counter
currentRow = currentRow + 1
Next countryHTMLElement
' close the current Internext Explorer window
browser.Quit
End Sub
VBAモジュールを実行して、上述と同じ結果が得られたことを確認してください。お疲れ様です。Internet Explorerを使い、Excel上でウェブスクレイピングができました。
まとめ
このガイドではVBAとは何か、そしてExcelでウェブスクレイピングをする方法を学びました。問題となるのは、Internet Explorerのサポートが終了したにも関わらず、VBAブラウザ自動化ライブラリが以前としてInternet Explorerに依存していることです。ここではSeleniumとVBAを使い、Excel上でデータ取得を自動化するアプローチを紹介しました。また、古いバージョンのWindowsを使った従来のアプローチについても学びました。
一方で、インターネットからデータを抽出する際には、注意すべき問題が多数あるということも心に留めておいてください。特に覚えておいて欲しいのが、ほとんどのサイトでVBAウェブスクレイピングスクリプトを検出してアクセスをブロックするスクレイピング・ボット対策技術が使われていることです。弊社のScraping Browserソリューションを使用すれば、それらの対策をすべて回避できます。この次世代ブラウザはSeleniumと統合されており、自動再試行、CAPTCHAへの回答、ブラウザフィンガープリンティングの回避などの機能を自動的に処理できます。
ウェブスクレイピング処理に手を煩わせたくないが、Excelデータには興味があるという方もいらっしゃるでしょう。そんな方には、すぐに使えるデータセットがおすすめです。どのデータソリューションを選ぶべきかわからない?今すぐお問い合わせください!
クレジットカードは必要ありません