VBAプログラム開発、スクレイピング・データ要素を充実させる【2】書籍詳細ページURLを収集する
前回検討した書籍詳細情報ページからより詳細なデータを取得する手順を元に、書籍情報取得を実施していきます。
今回の目的
書籍詳細ページURLを収集して、個別に詳細ページへアクセスできるようにする。
なぜやるか
初めに全書籍の詳細ページURLを準備することで、準備したURLを全て巡回すればデータ取得完了とできるようにするため
やりたいこと
- 全書籍の詳細ページURLだけを1箇所へ集約する
- 集約URLデータさえあれば、後の処理にまかせるだけでいい状態を作る
やったこと
- 詳細ページURL収集のみを実施する状態に変更する
- 集約情報を専用リストとして保存できるようにする
実施内容
書籍詳細URLを取得する
書籍詳細ページ内の情報を収集するためにも、まずは書籍一覧に表示される全書籍の詳細ページURLがまずは必要です。
実はもうできている
が、実はもう収集できています。
書籍一覧表示に表示されていた情報を収集する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出力以外の処理を全て削除しました。
この状態で一度動作を確認しておきます。
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を一端別で蓄積しておいて、そこから詳細ページを順番に確認する形をとりました。
取得したURLを別シートへと反映した状態です。
最終的には別のワークシートではなく、配列等に一時格納できれば、わざわざExcel画面上に表示する必要はなさそうですが、いったんこれで作成します。
配列でいきなり作ろうと思っていたのですが、ちょっと個人的にすぐ扱えなさそうだったものです…。
ともかく、詳細ページURLを専用ワークシートに集約することができました。
従来のページネーションを考慮したVBAを利用しているので、全ページのURLが取得できている状態です。
後は、取得したURL一つ一つにアクセスして詳細ページから情報を取得すれば、今回作成している「詳細ページからより多くの情報を取得する」ができそうです。