【VBA×Selenium】Web上の画像ファイルをダウンロードする方法について
みなさんこんにちは。
Webスクレピングをしているとサイト内に表示されている画像をローカルPC内に保存したい場合があるかと思います。
そのような場合は、APIを使用してWeb錠の画像ファイルをダウンロードすることが可能です。
APIを使用するため、初級~中級者向けの内容になるかと思いますが、
覚えておくととてもためになるので、スキルアップのきっかけになればと思います。
この記事はこんな人におすすめ
この記事はこんな人におすすめです!
- VBAプログラミング:初級者~中級者
- Webスクレイピング:初級者~中級者
- コードだけサクッと取得したい人
- 効率の良いコードを書きたい人
といったところでしょうか。
VBA×Seleniumに関する過去の記事
VBA×Seleniumに関する小ワザやテクニックなどの参考記事については、過去にご紹介しておりますのでそちらもどうぞ。
今回の記事を読むメリット
Web上の画像ファイルをダウンロードする方法を知るメリットは以下の通りです。
- VBAの基礎スキル定着
- 時間短縮と作業効率化
- 正確な操作の実現
- ニッチな需要への対応拡大
といったところでしょうか。
本件は日常業務でも使用する機会が非常に多いかと思いますので、
一度やり方を覚えてしまえばかなり有効的なスキルになるかと思います。
かつ、スクレイピングを数多く実施していると誰しもが経験する内容かと思いますので、
忘れずに覚えていくことが作業効率につながりますし、
一度やり方を覚えてしまえば今後も活かせる内容になるかと思います。
手順紹介
使用するAPIについて
今回はWindows APIの「URLDownloadToFile関数」を利用してWeb上にあるファイルをダウンロードします。
URLDownloadToFile関数とは
URLDownloadToFile関数とは指定したファイルをダウンロードすることのできる関数です。
この関数を使うことでPDFやZipファイルなど画像ファイル以外のさまざまなファイルをダウンロードすることができます。
URLDownloadToFile関数はWindows APIの中にある関数で、
Windows APIとはWindowsに用意されている機能がまとまっているセットのようなものになります。
VBAを活用してWindows APIを呼び出すことで、Windowsに備わっているさまざまな機能を利用できます。たとえば、システムの効果音を鳴らしたり、キーボード入力を取得したりすることが可能です。
Windows APIに馴染みがないと「なんだか難しそう」と感じるかもしれませんが、実際のコードはそれほど複雑ではありません。VBAの基礎を理解していれば、比較的スムーズに扱えるようになるでしょう。
なお、名前のとおりWindows APIはWindowsの機能を呼び出すためのものなので、基本的にWindows以外のOSでは使用できません。
URLDownloadToFile関数を使用する前に
URLDownloadToFile関数を使用するには、まず「このコードでWindows APIのURLDownloadToFile関数を使います」と宣言する必要があります。
※この宣言を忘れると関数が認識されずエラーになるため、注意が必要です。
また、使用しているWindowsが32bitか64bitかによって、宣言の書き方が異なります。
以下のいずれかをコードの冒頭(Option Explicitの直後あたり)に記述することで、そのモジュール内でURLDownloadToFile関数を使用できるようになります。
CHECK!!!
'//////////////////////////////////////////////////////////////////////////////////////////
' 64bitの場合
'//////////////////////////////////////////////////////////////////////////////////////////
Private Declare PtrSafe 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
'//////////////////////////////////////////////////////////////////////////////////////////
' 32bitの場合
'//////////////////////////////////////////////////////////////////////////////////////////
Private 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のbit数と宣言の構文が一致していないとエラーが発生するため、注意が必要です。
どちらの宣言を使えばよいかわからない場合は、以下のコードをコピーしてモジュールの先頭に貼り付けてください。
この構文を記述しておけば、自動的に適切な宣言が適用されます。
#If Win64 Then
Private Declare PtrSafe 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
#Else
Private 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
#End If
URLDownloadToFile関数の構文について
URLDownloadToFile関数の構文は下記のとおりです。
POINT!!
Dim res As Integer
res = URLDownloadToFile(0, URL, SavePath, 0, 0)
この関数には5つの引数を設定する必要がありますが、基本的には URL と SavePath の2つだけを指定すればOKです。
(それ以外の引数はすべて「0」で問題ありません。)
URL にはダウンロードしたいファイルのURLを入力します。
例えば、本サイトのロゴ画像のURLは
https://epsilon-delta-blog.com/wp-content/uploads/2024/06/4b1dc78f96030b80cde7373830acf932.png です。
(このURLをブラウザのアドレスバーに入力すると、ロゴ画像のみが表示されることを確認できます。)
SavePath には、保存するファイルのフルパス(ファイル名を含む)を指定します。
例えば、デスクトップ上の「Download」フォルダに「Sample.png」として保存する場合、
C:\Users\user\Desktop\Download\sample.png と入力します。
※指定したパスに同名のファイルが存在すると、自動的に上書きされるので注意してください。
この関数の戻り値(例: res 変数)は、ファイルの保存結果を示します。
- 保存成功時: 0 が返る
- 保存失敗時: 0 以外の値 が返る
サンプルコード
最後に、URLDownloadToFile関数 を活用したサンプルコードを紹介します。
このコードでは、本ブログのヘッダー部分にあるロゴ画像をダウンロード します。
処理の流れとして、DownloadImage という関数を作成し、その中で URLDownloadToFile関数 を使用しています。
この関数では、以下の2つの引数を受け取ります。
ダウンロードする画像のURL
保存先フォルダのパス
保存する際の ファイル名はURLから取得 しており、
サンプルコードでは”https://epsilon-delta-blog.com/wp-content/uploads/2024/06/4b1dc78f96030b80cde7373830acf932.png“
というURLから “logo.png” のファイル名をデスクトップ上に保存します。
コード内の “URL” の値を変更すれば、任意の画像やファイルをダウンロード できます。
また、ダウンロード結果はイミディエイトウィンドウに表示 される仕様になっています。
Sub DownloadLogo()
Dim URL As String
Dim SavePath As String
Dim res As Long
' ロゴ画像のURL
URL = "https://epsilon-delta-blog.com/wp-content/uploads/2024/06/4b1dc78f96030b80cde7373830acf932.png"
' 保存先 (デスクトップに "logo.png" として保存)
SavePath = "C:\Users\user\OneDrive\デスクトップ\logo.png"
' URLDownloadToFile を使用してダウンロード
res = URLDownloadToFile(0, URL, SavePath, 0, 0)
' 結果を確認
If res = 0 Then
Debug.Print "ダウンロード成功!ファイルは " & SavePath & " に保存されました。", vbInformation
Else
Debug.Print "ダウンロード失敗 (エラーコード: " & res & ")", vbCritical
End If
End Sub
最後に
いかがでしたでしょうか。
Seleniumを使用していると予測不能な謎エラーや疑問に遭遇することが多々あります。
ですので、しっかりマスターして基本を抑えながらと実装できると業務効率も格段に向上するかと思います。
そのきっかけとして、少しでも参考になればと思います。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!
Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?