Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

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一覧は専用のワークシートへ出力されています。

f:id:Fippiy:20190618131748j:plain

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を入れています。

 

もっと修正できそうな点がちらほらあるのですが、まずはこれで動作することを確認します。

f:id:Fippiy:20190618132728j:plain

詳細データ取得

各URLを参照して詳細ページのテキストデータを出力できました。

 

これで詳細情報全データ取得にかなり近づいたのではないでしょうか。

後は、画像の取得と詳細ページURLをワークシート保存せずに処理だけできれば、データ取得としては完成の形へともっていけそうです。