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でのネット記事は少なく困っている方も多いと思います。
弊社で代行開発も可能ですので、お気軽にご用命ください。
コメント