VBAプログラム開発、スクレイピング・データ取得をレコード単位に修正する【3】レコード要素取得に対応した画像処理をする
前回までにスクレイピングデータをレコード単位で取得できるようにしました。
今回は取得したレコードデータを要素毎に指定のセルへ表示させていきます。
今回の目的
スクレイピングによりレコード単位で取得したデータから、画像データをとりだしてExcelへ表示させる
なぜやるか
レコードデータからのテキスト処理は完了したので、画像についても対応するため
やりたいこと
既存の画像表示コードを活用してレコード単位処理に組み込む
やったこと
- 画像表示処理を組み込む
- 画像処理を修正する
- 確認用シートから、実装を行うシートへ処理を変更する
実施内容
レコードデータから画像データを出力する
画像出力手順の確認する
初めに作成していたスクレイピングコードでWeb一覧表示内の書籍画像を取得して表示ができていました。
そして、スクレイピング手順をレコード単位として変更も実施しました。
レコード単位データには表示すべき画像のURLも含まれているので、このURLを取得して画像表示処理へと組み込みできれば、画像表示が完成する…という流れで作成できそうです。
画像表示処理を確認する
では、改めて初めに作成していが画像処理を確認します。
# 旧画像処理
For Each Img In htmlDoc.images
imgURL = Img.src
Set ActCell = Worksheets("スクレイピング").Cells(i + 1, 5)
Worksheets("スクレイピング").Shapes.AddPicture _
fileName:=imgURL, _
LinkToFile:=True, _
SaveWithDocument:=True, _
Left:=ActCell.Left, _
Top:=ActCell.Top, _
Width:=100, _
Height:=100
i = i + 1
Next Img
htmlDoc変数にHTML全体を格納し、imagesにて画像イメージを取得。
そこからsrcとしてURLを取得してAddPictureによる画像表示を実現していました。
まず、この内容を現在のレコード単位処理に移し替えます。
# レコード単位処理
For Each Bookdata In htmlDoc.getElementsByClassName("book-table__list")
'Bookdata要素全体HTML
Worksheets("テスト").Cells(i + 1, 2).Value = Bookdata.innerHTML
'--detail部処理(省略)
'画像処理
Img = Bookdata.images '画像取得
imgURL = Img.src '画像URL
Set ActCell = Worksheets("テスト").Cells(i + 1, 6)
'画像出力セルのピクセルを指定して表示
Worksheets("テスト").Shapes.AddPicture _
fileName:=imgURL, _
LinkToFile:=True, _
SaveWithDocument:=True, _
Left:=ActCell.Left, _
Top:=ActCell.Top, _
Width:=100, _
Height:=100
'画像処理ここまで
'次のレコードの行番号
i = i + 1
Next Bookdata
Bookdataにレコード情報が入っているので、ここからimagesを指定して画像を取得する記載に変更しました。
後は、取得情報に応じて画像出力する流れとしました。
画像表示を実装する
が、しかし、これでは正常動作しませんでした。
Bookdataは既にクラス名を指定してHTMLとして取得しています。そのため、このHTMLに対してimagesを指定してもイメージとしては認識されず、結果として画像データが取得できませんでした。
そこで、最終的に必要な物…つまり画像が保存されているURLに着目しました。イメージとしての指定ができなくても、URLさえ取得できればいいのです。
画像URLが何処に記載されていたかを確認します。
画像URLはBookdata変数内、つまりレコード内には情報として存在していました。
# HTML(Bookdata)
<div class="book-table__list--checkbox">
<input name="select_books[]" type="checkbox" value="8">
</div>
<div class="book-table__list--picture">
<a href="/book/8">
<img src="https://cover.openbd.jp/9784797398892.jpg">
</a>
</div>
<div class="book-table__list--detail">
<a href="/book/8">
<h3 class="list-book-title">
1冊ですべて身につくHTML & CSSとWebデザイン入門講座
</h3>
</a>
<p class="list-book-detail">
日本で2年間...
</p>
</div>
画像URLはIMGタグに指定していました。
画像イメージを指定するimagesを使用せずとも、IMGタグを指定すればURLが取得できそうです。タグ指定でコードを修正します。
# 画像取得処理
'画像処理
Img = Bookdata.getElementsByTagName("img")
imgURL = Img.src
Set ActCell = Worksheets("テスト").Cells(i + 1, 6)
Worksheets("テスト").Shapes.AddPicture _
fileName:=imgURL, _
LinkToFile:=True, _
SaveWithDocument:=True, _
Left:=ActCell.Left, _
Top:=ActCell.Top, _
Width:=100, _
Height:=100
'画像処理ここまで
画像URLの取得方法をimages指定からタグ名IMGを取得に変更しました。
これでVBAを動作させて画像が取得できていることを確認します。
画像が表示できました。
これで、レコード単位処理として、テキストと画像を取得して表示できるようになりました。
細かな調整を行う
後は、テスト用のワークシートで取得レコード全体のHTMLも表示されていたので、本来のデータ表示用ワークシートで出力出来るようにします。
# スクレイピング
'作業ワークシート指定
Dim SWSheet As Worksheet 'ScrapingWorksheet
Set SWSheet = ThisWorkbook.Worksheets("スクレイピング")
'タイトル名
SWSheet.Cells(i + 1, 2).Value = _
detailField.getElementsByClassName("list-book-title")(0).innerText
ワークシート名を毎回指定していたので、変数へ格納する形へと変更しました。 例としてタイトル名のみ表示しましたが、他の要素も同様に変更しました。
以上でスクレイピングによってレコード単位でデータ取得を実施し、Excelワークシートへ反映させる処理が完了しました。
次回は、ここから更に処理を拡張していきます。