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

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

VBAプログラム開発、スクレイピング・データ要素を充実させる【5】IDと画像をExcel一覧表に追加する

詳細ページのテキスト情報を収集できるようにしました。

残る情報としては、画像データがあります。一覧表示データの取得時に作成していたコードを基に詳細ページでも表示できるようにします。

同様に、一覧表示データ取得時にIDも表示していたので、今回も対応させます。

今回の目的

スクレイピング取得情報にIDと画像を追加する

なぜやるか

ワークシートに表示させたい不足情報に対応し、必要な全情報をマクロ実行のみで完結させるため

やりたいこと

  • 画像を取得して表示させる
  • ID番号を表示させる

やったこと

  • データ表示場所を決定する
  • 画像データを取得して表示させる
  • ID番号を取得して表示させる

実施内容

不足情報を格納する場所を用意する

前回までに、詳細ページのテキストデータを取得できるようにしていました。

f:id:Fippiy:20190618132728j:plain

詳細データ取得

この表にIDと画像を追加表示できるようにしていきます。

 

表示させる場所を検討する

詳細ページ情報を取得する以前に一覧表示からデータ取得をするVBAを作成していた時に、IDと画像の取得処理は一度作成していました。

f:id:Fippiy:20190615105002j:plain

一覧表示から直接取得

この時に処理は一度作成していたので、今回のコードに即した形に変更するだけで良さそうです。

 

ところで、Excel内では画像が右側に表示されています。

上記で取得している元データはWeb上の一覧表示でした。

f:id:Fippiy:20190613103326j:plain

一覧表示

Webの一覧表示では画像は左側にあります。詳細ページも同じく左側です。

f:id:Fippiy:20190615144647j:plain

詳細ページ

デザインの観点からも画像が左にあるほうがバランスがいいようにみえるので、挿入位置は左側とします。

f:id:Fippiy:20190618135349j:plain

Excelワークシート

ワークシートデータの左側にIDと画像の枠を準備しました。

 

画像データを取得する

テキスト取得していたコードに画像処理を追加します。

# 詳細ページ取得コード[ループ]

'最初のページ
OpenPage = DWSheet.Cells(URLi, 1).Value

 

Do Until OpenPage = ""
 objIE.navigate OpenPage
 Call WaitResponse(objIE)
 Set htmlDoc = objIE.document
 j = 2

 '画像取得処理
 Set DocPicture = htmlDoc.getElementsByClassName("book-detail__picture")(0)
 Set ImgURL = DocPicture.getElementsByTagName("img")(0)
 Set actcell = SWSheet.Cells(i, j)

 SWSheet.Shapes.AddPicture _
  fileName:=ImgURL.src, _
   LinkToFile:=True, _
   SaveWithDocument:=True, _
   Left:=actcell.Left, _
   Top:=actcell.Top, _
   Width:=100, _
   Height:=100
 j = j + 1

 ~ 以下テキスト処理実施 ~
Loop

あらかじめOpenPageには最初のURLを設定しておき、繰り返し処理を実施する形と書き換えました。

後は、ワークシートの左側からデータ処理をするので画像を先に処理してからテキストデータを処理する形にしています。

※IDは後ほど追加します。

画像データはHTMLの参照元を確認できれば、処理自体は以前作成したものがほぼ流用できるので、それを利用しました。

f:id:Fippiy:20190618142557j:plain

画像取得

 確認用に1件だけ出力しましたが、左側に画像が出力され、続きにテキストデータが出力されました。

 

ID番号を表示する

残るはID表示です。

一覧表示データを取得していた時にコードは作成していました。取得した詳細ページURLのアドレスを"/"で分割して、一番右側にくるのがID番号に相当していました。

こちらのコードを追加してやることで、ID番号を取得します。

# 詳細ページ取得コード[ループ]

Do Until OpenPage = ""

 objIE.navigate OpenPage
 Call WaitResponse(objIE)
 Set htmlDoc = objIE.document
 j = 1

 '1列目にID番号
 GetUrl = OpenPage 'URL取得
 GetUrlData = Split(GetUrl, "/") 'URL要素取得
 GetUrlElement = UBound(GetUrlData) 'URL要素確認
 GetID = GetUrlData(GetUrlElement) 'URLから番号取得
 SWSheet.Cells(i, j).Value = GetID
 j = j + 1

 ~ 以降、画像とテキスト処理実施 ~
Loop

詳細ページURLはOpenPageに格納されているので、この中からID番号を抜き出します。処理自体は一覧表示からスクレイピングしていた時に作成していたので、出力セルさえ修正すればそのまま使えます。

これを画像処理前に追加しました。

f:id:Fippiy:20190618144336j:plain

ID番号処理

ID番号が表示されました。

 

これで詳細ページを参照して一連のデータを取得して表示する。といった内容の処理ができるようになりました。

すべてのデータを取得できるようになりましたが、ひとつ課題として残っていた処理があるので、次回対応します。