VBAプログラム開発、スクレイピング・データ要素を充実させる【4】テキストデータ収集を全件対応させる
詳細ページURL一覧収集と、詳細ページ内のテキストデータ収集が作成できました。
今回は、この2つを組み合わせて、全URLから全テキスト情報を収集して、1回のVBA実行で全て動作できるようにします。
今回の目的
書籍一覧情報から、詳細ページURLを収集しさらに詳細ページのテキストを収集してワークシートに保存する
なぜやるか
URL取得とテキスト取得を組み合わせることで、より詳細な書籍データを一度に収集できるようにするため
やりたいこと
- 詳細ページURL取得と詳細ページテキスト取得を組み合わせる
やったこと
- テキスト取得処理を全URLへ対応させる
実施内容
作成状況の確認
詳細ページのURLを取得するプロシージャを作成。その後、詳細ページ内のテキストを1件のみ取得するプロシージャを作成しました。
# 詳細ページ取得コード
Sub getDetailBookdata(SWSheet As Worksheet, DWSheet As Worksheet, _
objIE As InternetExplorer)
Dim OpenPage As String
Dim htmlDoc As HTMLDocument
Dim DocContent As HTMLDivElement
Dim DocColumn As HTMLDivElement
Dim j As Long
'テスト用に最初のURLだけ実施
OpenPage = DWSheet.Cells(1, 1).Value
objIE.navigate OpenPage
Call WaitResponse(objIE)
Set htmlDoc = objIE.document
j = 1
For Each DocContent In htmlDoc.getElementsByClassName("document-content")
Set DocColumn = DocContent.getElementsByClassName("document-content__column")(0)
SWSheet.Cells(2, j).Value = DocColumn.innerText
j = j + 1
Next DocContent
End Sub
出力は確認できたので、全URL対象にしてきます。
青字部分に対して取得しているURL毎に処理させれば全件に対して処理できます。加えて、行単位で表示させるためのコントロールを追加すれば、レコードが上書きされることもなくなりますね。
詳細データ取得を全件対応にする
出力イメージを確認する
URL取得は既に完成しています。URL一覧は専用のワークシートへ出力されています。
上記表示では、右側のシートに取得した詳細ページURLを出力していました。
このURLを順番に取得して詳細ページのデータを取得するわけです。
繰り返し処理で全ページへアクセスする
詳細ページURLを繰り返し取得しつつ、詳細ページサイト内のテキストを収集できるようにしました。
# 詳細ページ取得[全URLを参照]
Sub getDetailBookdata(SWSheet As Worksheet, DWSheet As Worksheet, _
objIE As InternetExplorer)
Dim OpenPage As String
Dim htmlDoc As HTMLDocument
Dim DocContent As HTMLDivElement
Dim DocColumn As HTMLDivElement
Dim i As Long, j As Long '書き出し用行列処理
i = 2
Dim URLi As Long '詳細URL読み込み行番号処理
URLi = 1
'初期文字列挿入
OpenPage = True
'詳細ページを開いて中のデータを取得
Do Until OpenPage = ""
'URL取得
OpenPage = DWSheet.Cells(URLi, 1).Value
objIE.navigate OpenPage
Call WaitResponse(objIE)
Set htmlDoc = objIE.document
j = 1
'詳細ページHTMLからデータ取得
For Each DocContent In htmlDoc.getElementsByClassName("document-content")
Set DocColumn = DocContent.getElementsByClassName("document-content__column")(0)
SWSheet.Cells(i, j).Value = DocColumn.innerHTML
j = j + 1
Next DocContent
i = i + 1
URLi = URLi + 1
Loop
End Sub
OpenPageにWeb表示するURLを代入し、それに対して処理をしていまいた。今回は、繰り返し処理Do ~ Loop を利用して、OpenPageに詳細ページURLを順番に読み込ませて、各URLに対してデータ取得できるようにしました。
詳細ページ取得毎にi = i + 1とすることで、次のURLを処理するときには次の行へデータを出力する…といったことを繰り返しています。
詳細ページURLの取得と詳細情報の出力でそれぞれセル操作が必要となるので、URL取得用はURLiという別の変数を用意しました。
最終的にOpenPageにはURLがない状態ができるので、OpenPage=""となればループが終了します。はじめから空欄だとループ処理ができないので、はじめだけTrueを入れています。
もっと修正できそうな点がちらほらあるのですが、まずはこれで動作することを確認します。
各URLを参照して詳細ページのテキストデータを出力できました。
これで詳細情報全データ取得にかなり近づいたのではないでしょうか。
後は、画像の取得と詳細ページURLをワークシート保存せずに処理だけできれば、データ取得としては完成の形へともっていけそうです。