Excelマクロ(VBA)でWeb上のデータや画像を自動取得!

スポンサードリンク

Webサイトのデータを入手して分析したり、表示されている画像を収集したい。
でも、これをの作業を何回も繰り返すのは大変なんだよな~、でも手作業していたら…日が暮れてしまうんだよ。。。

こんなお悩みはありませんか?

今回はWeb上のデータを収集する作業を効率よく、ささっと片付けてしまう方法を紹介していきます!

さて、今回の問題にどう対処するか?

この問題、Excelのマクロ(VBA)を使えば簡単に処理できるんですよ。

Webサイト上のデータや画像を効率よく収集したいあなた!

是非この方法を参考にしてみてくださいね。
このページの中では、今回紹介するWebサイトのデータおよび画像を収集するマクロを組み込んだExcelファイルがダウンロードできる
ようにしています。

これを使えば、一からExcelを作り込む必要もありませんよ。ファイルを手にした瞬間、作業スピードは一気に早まります!是非使ってみてくださいね。

では本編スタートです!

スポンサードリンク

『Web上のデータや画像を収集する』には?まずは問題を整理しよう!

今回解決するのはWebサイトのデータを入手したり、表示されている画像を収集したりという作業をExcelにまかせて手軽に自動で終わらせたいという課題ですね。

この作業を手作業で行うには、
・データ収集先のWebサイトを開く
・記載されている内容を読む
・必要な部分をコピーして
・コピーした情報をExcelに貼り付け。
・画像が保存したければ、保存場所と保存する名前を設定してダウンロード。
・この動作を全ての対象に対して実施。

という手順をとるのが普通なのではないでしょうか。一つひとつの作業はさほど難しいものではありませんよね。しかし、作業を組み合わせて行わないといけませんし、この作業を必要な数だけ繰り返さなければいけません。これが大変なんですよね~。

では、この手順をExcelで自動化してしまいましょう!

『Web上のデータや画像を収集する』解決の方針をチェック!

ここでは、Web上のデータや画像を収集するという作業をExcelに実施させるためにはどうすればよいかをみていきます。

例として、いろいろな旬な情報のランキングデータを発信しているオリコンニュースhttps://www.oricon.co.jp/)の中の、CDシングルのデイリーランキングを取得するという作業を取り上げたいと思います。

一つひとつ手作業で行うには、上で書いたように

デイリー シングルランキングが記載されているホームページに移動し、
ホームページの構成を確認して、ページの内容を読み、
ランキング1位から順番に、シングルのタイトルとアーティスト名をコピー。そしてコピーしたデータをExcelに保存。

ジャケットの写真もダウンロードしたければ、この保存先、保存名をきめてダウンロード。

この動作を調べたい順位のデータまで繰り返して実施

という手作業が必要でしたよね?

ではこの手順をExcelのマクロ(VBA)をつかって自動で行っていくことにしましょう。Excelマクロで同じことを行うため、次の手順で処理を行わせます。

データ取得先のURLは、定点観測のように何度も同じものを使うと考え、Excelに記載しておくことにします。VBAのソース内に記載しても構いませんが、修正がしやすいようにExcelに記載する方法を採りました。

Excelで作業にもう一つ前準備が必要。

下のように、VBEの「ツール」メニューから「参照設定」を選択し、

参照可能なライブラリファイルの中から、

  • Microsoft HTML Object Library
  • Microsoft Internet Controls

を探し、これらにチェックを入れて利用可能な状態にしておいてください。

続いて、何位までのデータを取得するかを決定。そしてジャケット画像の保存先を決定します。

ここからいよいよデータの取得に移ります。

上で設定した情報をもとに、デイリーシングルランキングが表示されたページをInternet Exploreで開き、1位からタイトル、アーティスト名に関する情報を取得。

データを取得したらこのデータをExcelに書き出し、

掲載されているジャケット写真を特定して、動画が保存されているURLを取得。

ジャケット写真の保存名をタイトル名+.pngとして、指定した画像保存先にダウンロード。

この操作を指定した順位まで繰り返します。

Oriconシングルデイリーランキングは、10位づつ1ページに記載されているので、11位から、21位からのデータを取得する必要がある場合には、次のページへ移動するリンクを探し、これをクリックする動作をさせてページ移動するという動作を加えます。

これをVBAで書けば今回のWeb上のデータや画像を収集する作業は一発で完了!

今回Excelにやらせる作業は人の手で行う作業とよく似ていますが、処理はプログラムした内容に従って、いつでも何度でも実施できるので、処理を間違ってしまうということもありませんよ。

スポンサードリンク

『Web上のデータや画像を収集』する課題をExcelで解決!

ではOriconのシングルデイリーランキングデータとこのジャケット画像を取得するいう課題を解決する、具体的なマクロの記述をみていきましょうね!VBAで書いたリストは次の通りです!


'***********************************************************
'** 仕事サクサク!定時退社のために EXCEL GO! GO!
'** (URL:https://excelgogo.net/)
'** 是非ご活用ください♪
'***********************************************************
'画像をダウンロードするWindows APIのURLDownloadToFile関数を使用するためのAPIの宣言
Declare Function URLDownloadToFile Lib "urlmon" Alias _
    "URLDownloadToFileA" (ByVal pCaller As Long, _
    ByVal szURL As String, _
    ByVal szFileName As String, _
    ByVal dwReserved As Long, _
    ByVal lpfnCB As Long) As Long
'キャッシュを削除するWindows APIのDeleteUrlCacheEntry関数を使用するためのAPIの宣言
Declare Function DeleteUrlCacheEntry Lib "wininet" _
    Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
'Sleep関数を使用するためのAPIの宣言
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If

Sub Get_Oricon_Ranking()
Dim TargetNum As Integer      '取得するデータの数
Dim Title(1000) As String     'タイトル名
Dim Artist(1000) As String    'アーティスト名
Dim TargetUrl As String       'データを調べるURL
Dim PathImage As String       'ジャケット画像の保存先
Dim Ita As Integer            '繰り返し数
Dim Amari As Integer          'TargetNumの1の位
Dim objIE As InternetExplorer 'IEオブジェクトを準備
Dim objaItemTags As Object    '全aタグを格納するオブジェクト
Dim objaItem As Object        '抽出したaタグを格納するオブジェクト
'
On Error GoTo Errhandler
'
Sheets(1).Range("C5:D34").Select
Selection.ClearContents
'データ取得先のURL
Url = Cells(2, 3)
'インプットボックを使ってTargetNumを取得
TargetNum = InputBox _
("何位までデータを取得しますか?", "30までの数字を入力")
'インプットボックスで取得するデータに関するエラー処理
If TargetNum > 30 Or TargetNum <= 0 Then
   MsgBox "30までの整数を入れてください"
   GoTo Lastline
End If
'
Ita = Int(TargetNum / 10) + 1  '処理の繰り返し数
Amari = TargetNum - _
        Int(TargetNum / 10) * 10 'TargetNumの1の位
'
'ジャケットの画像を保存するフォルダ指定のためダイアログボックスを利用
Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
'キャンセルボタンクリック時にはマクロを終了
If dlg.Show = False Then
    GoTo ErrHandler2
Else
    '選択したディレクトリを画像保存フォルダに設定
    PathImage = dlg.SelectedItems(1)
End If
'新しいIEオブジェクトを作成してセット
Set objIE = CreateObject("Internetexplorer.Application")
'IEを表示
objIE.Visible = True
'IEでURLを開く
objIE.navigate Url
'読み込み待ち
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
    DoEvents
Loop
Sleep 1000
'読み込み待ち終わり
'HTMLドキュメントオブジェクトを準備
Dim htmlDoc As HTMLDocument
'objIEで読み込まれているHTML
Set htmlDoc = objIE.document
For i = 1 To Ita
    If i < Ita Then 
        For j = 1 To 10 
            'ClassのNameがtitleのinnnrTextを取得してTitleに
            Title(j) = htmlDoc.getElementsByClassName("title")(j - 1).innerText
            'ClassのNameがnameのinnnrTextを取得してArtistに 
            Artist(j) = htmlDoc.getElementsByClassName("name")(j - 1).innerText 
            'Excelシートにデータを書き出す 
            Cells(4 + (i - 1) * 10 + j, 3) = Title(j)
            Cells(4 + (i - 1) * 10 + j, 4) = Artist(j)
            'TagがImgのデータをすべて調べる
            For Each img In htmlDoc.getElementsByTagName("img") 
                'IMG 画像URL imgURL = img.src 
                '画像ファイル名 fileName = Title(j) + ".png" 
                '画像保存先(+画像ファイル名) 
                savePath = PathImage + "\" + fileName 
                'キャッシュクリア 
                cacheDel = DeleteUrlCacheEntry(imgURL) 
                'IMGのAltがTilteと同じ場合に画像をダウンロードする 
                If img.alt = Title(j) Then
                     ret = URLDownloadToFile(0, imgURL, savePath, 0, 0)
                     Exit For 
                End If
            Next img Next
        '次のページへの移動 
        'IDやNAMEが振られていないので全aタグを調べ
        'outerHTMLが目的のものの場合にクリック 
        Set objaItemTags = objIE.document.getElementsByTagName("a") 
        For Each objaItem In objaItemTags 
            If i >= 3 Then
                GoTo SearchEnd
            ElseIf i = 1 Then
                If InStr(objaItem.outerHTML, "11位~20位") > 0 Then
                    objaItem.Click
                    Exit For
                End If
            ElseIf i = 2 Then
                If InStr(objaItem.outerHTML, "21位~30位") > 0 Then
                    objaItem.Click
                    Exit For
                End If
            End If
        Next
        '読み込み待ち
        Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
            DoEvents
        Loop
        Sleep 1000
        '読み込み待ち終わり
    ElseIf Amari <> 0 Then
        For j = 1 To Amari  '上の処理と同様の処理を繰り返し数を変えて実施
            Title(j) = htmlDoc.getElementsByClassName("title")(j - 1).innerText
            Artist(j) = htmlDoc.getElementsByClassName("name")(j - 1).innerText
            Cells(4 + (i - 1) * 10 + j, 3) = Title(j)
            Cells(4 + (i - 1) * 10 + j, 4) = Artist(j)
                For Each img In htmlDoc.getElementsByTagName("img")
                    imgURL = img.src
                    fileName = Title(j) + ".png"
                    savePath = PathImage + "\" + fileName
                    cacheDel = DeleteUrlCacheEntry(imgURL)
                    If img.alt = Title(j) Then
                        ret = URLDownloadToFile(0, imgURL, savePath, 0, 0)
                        Exit For
                    End If
                Next img
        Next
    End If
Next
'
SearchEnd:
'
'IE終了
objIE.Quit
Set objIE = Nothing
'
GoTo Lastline
'
ErrHandler2:
    MsgBox "画像を保存するフォルダを選択してください"
    GoTo Lastline
'
Errhandler:
    MsgBox "データを取得する「数字」を入力してください"
    GoTo Lastline
'
Lastline:
'
End Sub

 

マクロの下準備とダイアログボックス使用時のエラー処理

Get_Oricon_Rankingというのが今回のマクロの名称ですが、このマクロの記述が始まる前に、数行コードがありますよね。これらは、今回使用する、次の3つの機能を使うための前準備です。同じように記載すれば他のマクロでもこれらの機能が使えるようになります。

  • 画像をダウンロードする
  • キャッシュを削除する
  • Sleep関数を使用する

データを探しに行くサイトのURLは、ExcelのC3セルにかかれているとして、以下のコードで、Urlという変数に代入されます。

Url = Cells(2, 3)

何位までのデータを取得するか、画像データをどこに保存するかについては、それぞれダイアログボックスを介して入力する方式としました。

自分でマクロを作成し、自分だけがこれを利用するならば良いですが、不特定多数の人が使用するマクロの場合、ダイアログボックスの使用にはちょっと注意が必要です。入力してほしいデータとことなるデータを入力するかもしれませんから、このような場合への備えが必要です。

今回の例では、取得するランキング順位 TargetNumには数字を入力してほしいのですが、もしかすると数字ではない文字や現実的ではない数字が入力されるかもしれません。今回は、TargetNumを整数だと宣言し、これ以外のものが入力される、あるいは何も入力サれなければメッセージを表示してマクロが終了するように対処しています。加えて、整数だったとしても1~30の整数でなければ同じようにメッセージを表示してマクロが終了します。

また、画像の保存先を選んでもらう際に、ダイアログボックスの「キャンセル」ボタンが押されてしまった場合もメッセージを表示してマクロが終了します。

Excel VBAでClass属性のデータを取得

上で書いたところまでが、マクロ上の下準備。

Web上のデータを取得する部分で大事な部分は、以下の部分。前部はVBAでInternet Exploreを介してOriconのホームページを開く動作を行う部分です。Webページがきれいに読み込まれてから次の処理を行わないと、処理がうまく進まない場合がありますので、読み込みが終了するのを待つコードを入れているところもポイントです。

後半は、Webページの内容が記述サれているHTMLから条件に合う情報を取り出す部分。Oriconのホームページの場合、タイトルやアーティスト名にClass属性がついていて、これにそれぞれtitleとnameという名称がつけられていますので、情報取得にこれを利用しています。


'新しいIEオブジェクトを作成してセット
Set objIE = CreateObject("Internetexplorer.Application")
'IEを表示
objIE.Visible = True
'IEでURLを開く
objIE.navigate Url
'読み込み待ち
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Sleep 1000
'読み込み待ち終わり
'HTMLドキュメントオブジェクトを準備
Dim htmlDoc As HTMLDocument
'objIEで読み込まれているHTML
Set htmlDoc = objIE.document

.....

'ClassのNameがtitleのinnnrTextを取得してTitleに
Title(j) = htmlDoc.getElementsByClassName("title")(j - 1).innerText
'ClassのNameがnameのinnnrTextを取得してArtistに
Artist(j) = htmlDoc.getElementsByClassName("name")(j - 1).innerText 

Excel VBAでaタグのaltの情報を使って他のページへ移動

続いて、次のページへ移動する処理。Oriconのホームページの場合、次のページへ移動するリンク部分に、HTMLのIDやNAME、Classなどの属性がなく単なるaタグしかついていません。このため、ページ内のすべてのaタグ付きのHTMLを調べて、”11位~20位”や”21位~30位”と表示されている文字列を頼りに、お目当てのaタグを抽出しています。


        'IDやNAMEが振られていないので全aタグを調べ
        'outerHTMLが目的のものの場合にクリック 
        Set objaItemTags = objIE.document.getElementsByTagName("a") 
        For Each objaItem In objaItemTags 
            If i >= 3 Then
                GoTo SearchEnd
            ElseIf i = 1 Then
                If InStr(objaItem.outerHTML, "11位~20位") > 0 Then
                    objaItem.Click

Excel VBAでTagNameの情報を使って画像を保存

最後のポイントは、画像の保存部分。画像はimgというTagNameがついていますので、これを画像のダウンロードに利用します。imgというTagNameのデータをすべて調べていきますが、Oriconのホームページの場合、ジャケット写真のaltの情報がタイトルと同じでしたので、これを利用してお目当ての画像を特定しました。特定したファイルは、名前をつける作業も毎度行うと面倒なので、あとで見分けがつけられるように、タイトル名と同じ名前を自動で割り振り、png形式の画像ファイルとして保存しています。


            For Each img In htmlDoc.getElementsByTagName("img") 
                'IMG 画像URL imgURL = img.src 
                '画像ファイル名 fileName = Title(j) + ".png" 
                '画像保存先(+画像ファイル名) 
                savePath = PathImage + "\" + fileName 
                'キャッシュクリア 
                cacheDel = DeleteUrlCacheEntry(imgURL) 
                'IMGのAltがTilteと同じ場合に画像をダウンロードする 
                If img.alt = Title(j) Then
                     ret = URLDownloadToFile(0, imgURL, savePath, 0, 0)
                     Exit For 
                End If
            Next img Next

 

まとめ

今回は、『Web上のデータや画像を収集する』という作業をExcelのマクロをつかって自動化し、作業を効率化する方法を紹介しました。

・データ収集先のWebサイトを開く
・記載されている内容を読む
・必要な部分をコピーして
・コピーした情報をExcelに貼り付け。
・画像が保存したければ、保存場所と保存する名前を設定してダウンロード。
・この動作を全ての対象に対して実施。

という地味で辛い作業を、

・Excel上にデータ取得先のURLを記述
・ダイアログボックスに、何位までデータを取得するか入力
・ダイアログボックスで画像保存先を設定
・VBAでInternet Exploreを介して目的のサイトにアクセス
・Class属性、TagNameを利用して目的の情報を取得
・シングルタイトルとアーティスト名をExcelに書き込み、画像を名前をつけてダウンロード
・aタグを利用してページの切り替え

という手順にしてこれをマクロで記述し、自動化するところがポイントです。

 

ある機能をExcelで実現するとき、その方法は一つだけとは限りません。

ExcelVBAで使用できる機能をフルに使ってシンプルに作ることもできます。ただこれにはそれなりの勉強が必要。すぐには使えず、今すぐ問題を解決したいとい状況にはあいません。ですので、このブログで紹介するマクロは、できるだけ簡単なもの、VBAにそう詳しくなくても読めそうなもの、手を加えやすいものになるように心がけています。

マクロって難しそう、と敬遠していた方にマクロって意外とお手軽ね!と感じていただき、これを応用すればあの作業も自動化できるかも!と次のステップやアクションにつなげていただければと思います。

Excelのスキルを一気に向上させて、ライバルに差をつけたい、仕事を一気にさばいてスピードアップしたい、スキルを身に着けて転職や就職に役立てたいと思ったあなた!ぜひ下のボタンをクリックしてください!
締切が迫っているので期間限定で「短期間で実力の向上が見込めるお手頃な方法」を紹介していますよ。

ホントは管理人Goも早く知りたかった!オンラインブートキャンプで、
見やすいデータをより早く仕上げる Excel術をマスターしよう!

 

『Web上のデータや画像を収集する』課題を解決するExcelサンプルをプレゼント

今回紹介した『Web上のデータや画像を収集する』という機能をもたせたマクロを実装したExcelファイル、プログラムを記載したbasファイルが下からダウンロードできます。

お好きな形式のファイルをダウンロードして、実際に動かしてみたり、あなたの課題にあわせてExcelを調整して作業時間短縮、効率化に役立ててみてください!

basファイルって何?どう使うの?という方やマクロはどのようにして実行するの?と疑問に思った方は、関連記事もチェックしてみてくださいね。


 

この記事が気に入ったら
いいね!しよう

最新情報をお届けします

Twitter でExcel GO! GO!をフォローしよう!

スポンサードリンク

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

話題をチェック!

  1. 2018-11-1

    Excelマクロ(VBA)で複数のシート上のグラフに同一の処理を行うには?

    Excelファイル内に複数のシートがあり、この中にグラフがいくつも入っているとします。 これら…
  2. 2018-9-30

    Excelの関数を使ったデータ比較法!INDIRECTとMATCHを活用する!

    最新データと一週間前のデータにどんな違いがあるのか比較してチェックしたい! でも、ひとつひとつ…
  3. 2018-7-16

    Excel マクロ(VBA)でグラフ(散布図)を大量自動作成!

    Excelはグラフを簡単につくれるのも魅力ですが、つくらなければいけないグラフが多いと、この作業も大…
ページ上部へ戻る