VBAでSelenium経由Chromeを起動し、画像ファイルなどをダウンロードしたい時があります。
Win32APIのURLDownloadToFileでダウンロードする事が可能です。
Webページの画像をダウンロードするサンプルコード
'■URLDownloadToFile/DeleteUrlCacheEntryを使用宣言
#If VBA7 Then
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
Declare PtrSafe Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
#Else
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
Declare Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
#End If
'■Edge/Chromeでファイルダウンロードするサンプルコード
Dim driver As New WebDriver
Public Sub sample()
'■ブラウザを起動
driver.Start "chrome"'"edge"
driver.Get "https://vba-create.jp/"
Dim obj As WebElement
For Each obj In driver.FindElementsByTag("img")
'■ダウンロード対象のキャッシュをクリア
Call DeleteUrlCacheEntry(obj.Attribute("src"))
'■絶対パス付きファイル名(srcが存在するもの)のみダウンロードを行う。
If obj.Attribute("src") <> "" Then
Call URLDownloadToFile(0, obj.Attribute("src"), "C:\vba" & "\" + Call_SpecificCharacterAfterDelete(obj.Attribute("src"), "/"), 0, 0)
End If
Next obj
End Sub
URLDownloadToFileパラメータ
| 引数 | パラメータ | 設定値 |
| 1 | pCaller | 0(固定) |
| 2 | szURL | ダウンロードするURL |
| 3 | szFileName | 保存先パス |
| 4 | dwReserved | 0(固定) |
| 5 | lpfnCB | 0(固定) |
注意点
- サーバーに対して休み無く、アクセスすることを控えましょう。DDoS攻撃とみなされる恐れがあります。
- スクレイピングは優れた技術ですが、節度を持った対応を心がけましょう。
- 上記コードのみでは動作しません。下記記事のパーツ化した処理を入れましょう。
特定文字以前を削除する処理をパーツ化する【Split関数応用】
SeleniumBasicについて
Internet Explorer11 のサポート期限が2022年6月までと、スクレイピング自体入れ替えていく必要があります。
今一番スムーズなのはSeleniumBasicを使用したスクレイピングと考えます。
但し、VBAでのネット記事は少なく困っている方も多いと思います。
弊社で代行開発も可能ですので、お気軽にご用命ください。



コメント