【備忘】IFrameの中にある要素を取得するVBAコード
昨日、投降したVBAでネット上のファイルをダウンロードするマクロですが、どうやらご希望に添えるものではなかったようです。なんでも、IFrameがDOMにあったために、要素にたどり着けないんだとか。調べてみると、IFrameがあるDOMは一度IFrameのsrcを取得し、そこにNavigateしてから再度要素を取得しなければ取れないようです。 今回はアマゾンにあるフィギュアの画像を取るコードを書いていきたいと思います。
御覧の通り、このページにはIFrameが入っています。今回はここから澪ちゃんのかわいい画像を保存するVBAを書きたいと思います(ファイルのダウンロードはないので)。
' Windows 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 Sub IFrame() Dim objIE As New InternetExplorer Dim URL As String, productTitle As String Dim objFrame As Object Dim result As Long ' おなじみの処理 objIE.Visible = True URL = "https://www.amazon.co.jp/????????-?H?R?Y-1-7?X?P?[??-PVC?h?????????i/dp/B0041N46YS/ref=pd_sbs_0_5?_encoding=UTF8&pd_rd_i=B0041N46YS&pd_rd_r=a406524c-db7e-11e8-839d-5bb4d62fdf30&pd_rd_w=uhimH&pd_rd_wg=aIcmG&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=cda7018a-662b-401f-9c16-bd4ec317039e&pf_rd_r=CMY0BXR864H44YSETHH0&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=CMY0BXR864H44YSETHH0" objIE.Navigate URL Do Until objIE.ReadyState = READYSTATE_COMPLETE DoEvents Loop ' IFrameタグの一番目を抽出し、そのソースコードへ移動(画面上に変化はなし) Set objFrame = objIE.document.getElementsByTagName("iframe")(0) objIE.Navigate objFrame.getAttribute("src") ' うまく取れているか試すために商品名を抽出 productTitle = objIE.document.getElementById("productTitle").innerText Debug.Print productTitle ' 画像のリンクを保存 link = objIE.document.getElementById("landingImage").src ' ファイル名を取得 Filename = Mid(link, InStrRev(link, "/") + 1) saveName = "C:\Users\aashi\Pictures" & "\" & Filename ' ダウンロードを実行 result = URLDownloadToFile(0, link, saveName, 0, 0) End Sub
とれました。
ここまで書いて判明したことですが、別にこのページに関してはIFrameのsrcを読み込まなくてもDLできました。けど、たぶんIFrameの中に組み込まれている要素もとれるはず(サンプルとなるページが見当たりませんでした)。 調べているとこんなページも見つけました。HTMLIFrameという変数の型があるらしく、そのプロパティやメソッドを使っているらしいです。具体的にどんなものかはまだ調べられていませんが、これを駆使するのも一つの方法かもしれません。