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

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

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 &amp; 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を動作させて画像が取得できていることを確認します。

f:id:Fippiy:20190610162102j:plain

レコード単位画像取得

画像が表示できました。

これで、レコード単位処理として、テキストと画像を取得して表示できるようになりました。

 

細かな調整を行う

後は、テスト用のワークシートで取得レコード全体のHTMLも表示されていたので、本来のデータ表示用ワークシートで出力出来るようにします。

# スクレイピング

'作業ワークシート指定
Dim SWSheet As Worksheet 'ScrapingWorksheet
Set SWSheet = ThisWorkbook.Worksheets("スクレイピング")

 

'タイトル名
SWSheet.Cells(i + 1, 2).Value = _

 detailField.getElementsByClassName("list-book-title")(0).innerText

ワークシート名を毎回指定していたので、変数へ格納する形へと変更しました。 例としてタイトル名のみ表示しましたが、他の要素も同様に変更しました。

 

以上でスクレイピングによってレコード単位でデータ取得を実施し、Excelワークシートへ反映させる処理が完了しました。

 

次回は、ここから更に処理を拡張していきます。