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

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

VBAプログラム開発、スクレイピング・データ要素を充実させる【2】書籍詳細ページURLを収集する

前回検討した書籍詳細情報ページからより詳細なデータを取得する手順を元に、書籍情報取得を実施していきます。

今回の目的

書籍詳細ページURLを収集して、個別に詳細ページへアクセスできるようにする。

なぜやるか

初めに全書籍の詳細ページURLを準備することで、準備したURLを全て巡回すればデータ取得完了とできるようにするため

やりたいこと

  • 全書籍の詳細ページURLだけを1箇所へ集約する
  • 集約URLデータさえあれば、後の処理にまかせるだけでいい状態を作る

やったこと

  • 詳細ページURL収集のみを実施する状態に変更する
  • 集約情報を専用リストとして保存できるようにする

実施内容

書籍詳細URLを取得する

書籍詳細ページ内の情報を収集するためにも、まずは書籍一覧に表示される全書籍の詳細ページURLがまずは必要です。

 

実はもうできている 

が、実はもう収集できています。

f:id:Fippiy:20190615105002j:plain

書籍情報一覧

書籍一覧表示に表示されていた情報を収集するVBAを作成していました。この中の4列目に詳細ページのURLは既にあります。

このURLから詳細ページに順番にアクセスして、詳細ページにある情報が取得できればいいのです。

 

詳細ページURL取得専用VBAに編集する

URL以外の情報は書籍一覧からは取得しない

早速詳細ページ内の情報を取得したいところですが、そのまえに詳細ページにアクセスするURLだけ取得できるVBAとなるように編集します。

現状のままでは、一覧表示のURL以外の情報も同時取得されます。他の情報は、詳細ページから取得するので、詳細ページURLだけ取得できるように変更しておきます。

# call呼び出し先プロシージャ

Sub getBookList(SWSheet As Worksheet, htmlDoc As HTMLDocument, i As Integer)

 Dim Bookdata As HTMLDivElement 'レコード単位データ
 Dim detailField As HTMLDivElement '詳細フィールドデータ
 Dim BookdataURL As String '詳細ページURL

 For Each Bookdata In htmlDoc.getElementsByClassName("book-table__list")

 '--detail情報からデータ取得

  '--detailを取得
  Set detailField = Bookdata.getElementsByClassName("book-table__list--detail")(0)

  '詳細ページURL
  BookdataURL = detailField.getElementsByTagName("a")(0) 'URL取得
  SWSheet.Cells(i + 1, 4).Value = BookdataURL '取得URL反映

 '--detail情報からデータ取得ここまで

 '列番号処理
 i = i + 1
 Next Bookdata

End Sub

詳細ページURL出力以外の処理を全て削除しました。

 

この状態で一度動作を確認しておきます。

f:id:Fippiy:20190616161652j:plain

URLのみ取得

URLだけが取得できました。

 

詳細ページURLのみを扱うシートを用意する

しかし、このワークシートでは書籍の詳細情報を取得・表示させたいです。

URLも情報のひとつであり、最初に作っていたリスト一覧にも表示していましたが、「全書籍の詳細ページ」を参照するための情報として扱います。

このため、コードを少し編集します。

# call呼び出し先プロシージャ

Sub getBookList(DWSheet As Worksheet, htmlDoc As HTMLDocument, i As Integer)

 '詳細ページURLを取得
 Dim Bookdata As HTMLDivElement 'レコード単位データ
 Dim detailField As HTMLDivElement '詳細フィールドデータ
 Dim BookdataURL As String '詳細ページURL

 For Each Bookdata In htmlDoc.getElementsByClassName("book-table__list")

 '--detail情報からデータ取得

  '--detailを取得
  Set detailField = Bookdata.getElementsByClassName("book-table__list--detail")(0)

  '詳細ページURL
  BookdataURL = detailField.getElementsByTagName("a")(0) 'URL取得
  DWSheet.Cells(i, 1).Value = BookdataURL '取得URL反映
 '--detail情報からデータ取得ここまで

 '列番号処理
 i = i + 1
 Next Bookdata

End Sub

ほぼ変わりがないように見えますが、あらたな変数とセルの位置が変更になっています。

# メインプロシージャ

Dim DWSheet As Worksheet 'DetailWorksheet
Set DWSheet = ThisWorkbook.Worksheets("詳細ページ情報")

詳細ページのURLを表示するためのワークシートを準備して、そちらにURLを書き出せるようにしました。

こうしておくことで、URLだけが一覧表示されるのでなく、URLを一端別で蓄積しておいて、そこから詳細ページを順番に確認する形をとりました。

f:id:Fippiy:20190616162637j:plain

URL情報取得ワークシート

取得したURLを別シートへと反映した状態です。

最終的には別のワークシートではなく、配列等に一時格納できれば、わざわざExcel画面上に表示する必要はなさそうですが、いったんこれで作成します。

配列でいきなり作ろうと思っていたのですが、ちょっと個人的にすぐ扱えなさそうだったものです…。

 

ともかく、詳細ページURLを専用ワークシートに集約することができました。

従来のページネーションを考慮したVBAを利用しているので、全ページのURLが取得できている状態です。

 

後は、取得したURL一つ一つにアクセスして詳細ページから情報を取得すれば、今回作成している「詳細ページからより多くの情報を取得する」ができそうです。