VBA:【Selenium】ブラウザ起動からファイルダウンロードまでのサンプルコード
そのような作業をSeleniumを使えば自動化できるので、ここではその方法を説明していきます。
◆サンプルコードの概要
あるサイトからデータをダウンロードする際に作ったコードです。
以下のような順番で処理を行っています。
- 処理開始
- ダウンロードするCSBファイルを保存するフォルダを指定
- 一時フォルダを自動作成
- ダウンロード処理
- ファイルの有無チェック(一時フォルダにCSVファイルができるまで処理を繰り返す)
- ファイルができたら、最初に指定したフォルダにコピー
- 一時フォルダを削除
- 処理完了
◆サンプルコード
このサンプルコード内で行うことは、下記コードの次の関連記事欄にあるパーツを組み合わせた感じですので、あわせてご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
Private Sub データ取得_Click() Dim xTmpPath As String Dim saveFolderPath As String saveFolderPath = SelectFolderDialog xTmpPath = CurrentProject.Path & "\xTmp" '一時フォルダの有無の確認。なければフォルダを作成する' If Dir(xTmpPath, vbDirectory) = "" Then MkDir xTmpPath Else '一時フォルダがあればフォルダ内の全てのファイルを削除' Kill xTmpPath & "\*" End If Call getStaticData(xTmpPath, saveFolderPath) MsgBox "指定したフォルダにCSVファイルが保存されました。" End Sub '*********************************************************' Private Sub getStaticData(xTmpPath As String, saveFolderPath As String) Dim Driver As New Selenium.WebDriver Dim chkLoading As Boolean Dim myBy As New By Dim FName As String With Driver 'Chromeのダウンロードの保存先を変更' .SetPreference "download.default_directory", xTmpPath 'Chrome起動' .start "chrome" 'サイトを開く' .Get "https://www.xxxx.com/" chkLoading = False '//判定用フラグ' '//サイトの読み込みに時間がかかるものはエラーなく読み込めるまで繰り返さないと失敗する' Do chkLoading = .IsElementPresent(myBy.xpath("//*[@id=""110_anchor""]/i[1]")) .Wait 1000 Loop Until chkLoading = True '//選択' .FindElementByXPath("//*[@id=""110_anchor""]/i[1]").Click '//2016~2020' .FindElementByXPath("//*[@id=""2016_anchor""]").Click .FindElementByXPath("//*[@id=""2017_anchor""]").Click .FindElementByXPath("//*[@id=""2018_anchor""]").Click .FindElementByXPath("//*[@id=""2019_anchor""]").Click .FindElementByXPath("//*[@id=""2020_anchor""]").Click '//Downloadをクリック。ここはIDが読み込みの都度変わるのでidは使えませんでした。' '//そのため「contains」をユニークであろう値を使っています。' .FindElementByXPath("//button[contains(@data-role,'export')]").Click '作成した一時保存先フォルダにダウンロードするファイルの拡張子のものが存在するようになるまで繰り返す。' Do While Dir(xTmpPath & "\*.csv", vbDirectory) = "" .Wait 500 Loop End With '//一時フォルダからファイルを移動する' FName = Dir(xTmpPath & "\*.csv", vbDirectory) FileCopy xTmpPath & "\" & FName, saveFolderPath & "\" & FName '//一時フォルダを削除する' Kill xTmpPath & "\*" 'フォルダ内の全てのファイルを削除' RmDir xTmpPath 'フォルダを削除' '//ブラウザを終了' Driver.Close Set Driver = Nothing End Sub '*******************************************************' Public Function SelectFolderDialog() Dim myF As FileDialog Set myF = Application.FileDialog(msoFileDialogFolderPicker) With myF '//最初に開く場所(初期フォルダ)の指定。ここではデスクトップにしています。' .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("Desktop") '//ダイアログの左上に出てくるタイトル名' .Title = "フォルダの指定" '//Falseはフォルダ一つ指定、Trueだと複数のフォルダの選択が可能になるが配列で取得できるようにしていないのでここではエラーになる。' .AllowMultiSelect = False If .Show = True Then 'ダイアログを開く' SelectFolderDialog = .SelectedItems(1) '指定したフォルダを返す' End If End With Set myF = Nothing End Function |
関連記事