ExcelVBAを使ってWebスクレイピングを行う
Webスクレイピングは、Webページから情報を抽出する強力な方法です。ExcelVBAを使ってWebスクレイピングを行うことで、データの自動取得、時間と労力の節約、データの正確性といったメリットがあります。手動で情報を入力する手間を省き、自動的にデータを取得することができるため、大量の情報を収集する場合でも短時間で処理することができます。また、人手による入力ミスを避けることができるため、正確なデータを取得することが可能です。サンプルアプリでは、和暦と西暦の早見表を指定されたURLのWebページからデータを読み込み、Excelに書き込んでいます。次項でサンプルアプリの使い方を説明しますので、Webスクレイピングを実際に試してみて下さい。
サンプルアプリの使い方
シート上に配置した「和暦西暦早見表取込み」ボタンをクリックするだけで、指定されたURLのWebページからデータを読み込むことができます。読み込んだデータは、Excelシートの5行目以降に表示されます。
↓
サンプルコードの処理内容
まず、ExcelVBAを使ってWebスクレイピングを行うためには、「SeleniumBasic」というオープンソースの外部ライブラリーをインストール必要があります。また、パソコンの環境によっては、「.NET Framework3.5」を有効にする必要があります。具体的なインストール手順・設定手順については、下記リンク先をご覧ください。
https://scodebank.com/?p=1492
インストールおよび設定が完了したら、Excelの「開発」メニューから「コード表示」→「ツール」→「参照設定」を表示して、「Selenium Type Library」にレ点マークがついていることを確認します。
付いていない場合は、「Selenium Type Library」にレ点マークをつけて下さい。
今回のサンプルアプリの処理内容は以下の通りです。
1.WebDriverオブジェクトの宣言
myDriver As New WebDriverでWebDriverオブジェクトを宣言します。
これはWEBブラウザを制御するために使用されます。
↓
2.Webページへのアクセス
「 .Start “edge"」によりMicrosoft Edgeブラウザを開始し、
「.Get」で指定されたURLにアクセスします。
↓
3.テーブルデータの取得:
myTable = .FindElementById(“Table")で「Table」というIDを持つテーブル要素を取得します。
↓
4.データの読み込みとExcelへの書き込み
myTDs = myTable.FindElementsByTag(“td")でテーブル内のすべてのセルを取得し、
For Eachループを使って各セルのテキストをExcelシートに書き込みます。
↓
5.データの整形
1行の処理が終わったら、次の行に移動してデータを書き込むようにしています。
↓
6.ブラウザの終了
「.Close」でブラウザを閉じます。
サンプルコード アプリの作成手順はこちら
サンプルコードは以下の通りです。
各コードの説明はコメント行に記載していますのでご覧ください。
Option Explicit
Sub 和暦西暦早見表取込み()
'WebDriverオブジェクトを宣言しています。これはWEBブラウザを制御するために使用されます。
Dim myDriver As New WebDriver
'WebElementオブジェクトを宣言しています。これはWEBページ内のテーブル要素を表します。
Dim myTable As WebElement
'WebElementsオブジェクトを宣言しています。これはWEBページ内の複数の要素(テーブルのセルなど)を表します。
Dim myTDs As WebElements
'WebElementオブジェクトを宣言しています。これはテーブルのセル要素を表します。
Dim myTD As WebElement
'整数型変数「myRowNo」を宣言しています。これはテーブルの行番号を表します。
Dim myRowNo As Integer
'整数型変数「i」を宣言しています。これは列番号を表します。
Dim i As Integer
'myDriverオブジェクトを使用して、複数のコマンドをブロックでまとめて実行します。
With myDriver
'Microsoft Edgeブラウザを開始します。chromeを利用する場合は「.Start "chrome"」にします。
.Start "edge"
'指定されたURLに対してブラウザを起動し、WEBページにアクセスします。
.Get "https://scodebank.com/WarekiSeireki/WarekiSeirekiIchiran.html"
'「Table」というIDを持つ要素を検索して、「myTable」変数に代入します。この行では、指定したIDを持つテーブル要素を見つけています。
Set myTable = .FindElementById("Table")
'「myRowNo」変数に5を代入しています。これはデータを書き込むExcelの行番号を表します。
myRowNo = 5
'「i」変数に2を代入しています。これはデータを書き込むExcelの列番号を表します。
i = 2
'「myTable」内のすべての`td`要素(テーブルセル)を検索して、「myTDs」変数に代入します。
Set myTDs = myTable.FindElementsByTag("td")
' 「myTDs」内のすべての「myTD」要素に対してループを開始します。
For Each myTD In myTDs
'「myTD」のテキストを「myRowNo」行「i」列のExcelセルに書き込みます。
Cells(myRowNo, i).Value = myTD.Text
'列番号「i」を1増やします。
i = i + 1
'もし「i」が6であれば(6列目までデータを書き込んだ場合)以下の処理を実行します。
If i = 6 Then
'列番号「i」を2にリセットします(次の行の2列目にデータを書き込むため)。
i = 2
'行番号「myRowNo」を1増やします(次の行にデータを書き込むため)。
myRowNo = myRowNo + 1
End If
'「For Each」ループを次の要素に進めます。
Next
'ブラウザを閉じます。
.Close
'「With」ブロックを終了します。
End With
'「myDriver」オブジェクトを解放(開放)します。これにより、メモリを解放し、オブジェクトを破棄します。
Set myDriver = Nothing
End Sub
ディスカッション
コメント一覧
まだ、コメントがありません