画像ダウンロードをVBScriptで自動で行うスクリプトを書きましたので、共有します。
くれぐれも著作権を侵害しない私的利用の範囲で実行をお願いします。
1.スクリプト処理構成
2.スクリプト実行方法
3.想定サイト構成
4.スクリプト詳細
5.完成コード
1.スクリプト処理構成
スクリプトの主な流れとしては下記の通りです。
1.画像ページにアクセスする
2.次のページのURIを取得する
3.画像ダウンロード
4.次の画像ページにアクセスする(2~4を繰り返す)
5.次のページのURIと現在のページのURIが同じになったら終了
2.スクリプト実行方法
下記の通りの引数を指定して実行します
第一引数)画像の保存フォルダパス
第二引数)ファイル名につけるタイトル
第三引数)最初の画像のURI
3.想定サイト構成
ダウンロード対象のファイルがあるページに次ページのURLを含むidがnextという要素があるサイトに対してのみ実行可能
4-1.宣言&初期化
宣言と初期化を同時に行う記述方法です。
1 2 |
Dim strFolderPath : strFolderPath = WScript.Arguments(0) DIm strFileTitle : strFileTitle = WScript.Arguments(1) |
4-2.引数受け取り
引数を受け取る記述方法です。
1 2 |
strFolderPath = WScript.Arguments(0) strFileTitle = WScript.Arguments(1) |
Wscript.Arguments(i)
で第i
+1引数を受け取ります
第一引数を受け取る場合は(0)を指定します。
ただし、該当する引数がない場合、エラーになってしまうので、想定する引数より少ない場合は引数を受け取る前に処理を終わらせてしまいましょう。そのためのコードが↓のコードです。引数の数を数えています。
今回は、引数3つある場合を想定していますので、引数が3つ未満の場合に処理を抜けるようにしました。
1 |
If Wscript.Arguments.Count <3 Then |
4-3.If文
VBScriptでのIf文の記述方法は、ベースとなる記述方法は下記のような、一般的にプログラミング言語によくある記述方法です。
1 2 3 |
If <条件式> Then 'Do Something End If |
C#だと、下のコードのように、{}を書くことなく、1行だけ処理させることができます。
1 2 3 4 5 |
//C# if() 'Do Something Just One Else 'Do Something Just One |
VBScriptにも似たようなものがありまして、それが下のコード
1 |
If <条件式> Then 'Do Something Just One Else 'Do Something Just One |
今回は使用していませんが、If文を1行で書き、その上複数処理を行わせることができる文法があります。それが、下のコード
1 |
If <条件式> Then <処理1> : <処理2> Else <処理3> : <処理4> |
:
でつないでしまうんです。
VBScriptでは、:
でつないだ処理を一通りの処理として行えという命令として認識されるようです。
4-1.宣言&初期化で使いましたが、便利です。
4-4.オブジェクト作成
最初の画像のページをオブジェクトに設定します。ページ要素の取得に使用します。
1 |
Set document = WScript.GetObject(strURI) |
4-5.画像保存サーバーとの通信
最初の画像のページから画像のURLを取得し、サーバーに画像ダウンロードのリクエストを送ります。
1 2 3 4 5 6 7 8 9 |
Set document = WScript.GetObject(strURI) While document.readyState <> "complete" : WScript.Sleep 200 : Wend 'nexturiをセット strNextURI = document.getElementById("next").href '画像取得命令 strIMG = document.getElementById("img").src xhr.open "GET", strIMG, False xhr.send |
5.完成コード
では、まとめ。今回の完成コードです。
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 |
'要件・目的 ' ページ遷移を自動で行わせつつ画像をダウンロードする。 '設計 ' 1.オブジェクトに初期URIを渡す ' 2.GETさせたsrcを次のページのURIにセット ' 3.現在のページのhrefから画像を取得 ' 4.stream.writeさせる ' 5.次のページのURIのsrcをオブジェクトに渡す ' 2~5をループさせる ' ' ' 'if文 は0をfalse それ以外をtrueで返す '初期化 ' ' Const iend = 1 Const iresume = 0 ' If Wscript.Arguments.Count <3 Then msg "Less Arguments. Define 3 Arguments,plese.",iend Dim strNextURI,strarg,strIMG,strnow Dim strFolderPath : strFolderPath = WScript.Arguments(0) DIm strFileTitle : strFileTitle = WScript.Arguments(1) Dim strURI : strURI = WScript.Arguments(2) Dim strFilePath : strFilePath = strFolderPath +"\\" +strFileTitle Dim fs : Set fs = CreateObject("Scripting.FileSystemObject") If Not fs.FolderExists(strFolderPath) Then fs.CreateFolder(strFolderPath) Dim document : Set document = WScript.GetObject(strURI) While document.readyState <> "complete" : WScript.Sleep 200 : Wend Dim xhr : Set xhr = CreateObject("MSXML2.XMLHTTP.3.0") do strnow = strURI Set document = WScript.GetObject(strURI) While document.readyState <> "complete" : WScript.Sleep 200 : Wend 'nexturiをセット strNextURI = document.getElementById("next").href '画像取得命令 strIMG = document.getElementById("img").src xhr.open "GET", strIMG, False xhr.send 'ファイル名取得のために"/"で区切って配列に格納 strarg = split(strIMG,"/") 'DL処理 Dim stream : Set stream = CreateObject("Adodb.Stream") stream.Type = 1 stream.Open stream.Write xhr.responseBody stream.SaveToFile strFilePath +"_"+strarg(ubound(strarg)), 2 stream.Close Set document =Nothing strURI = strNextURI loop while strnow <> strNextURI msg "fin",iend Function msg(ms,num) 'Exit Function msgbox ms msgbox num if num Then Wscript.Quit End Function |
本日も、PROGFRONTをご覧いただきありがとうございました。
少しでもお役に立てますと幸いです。
明日が、あなたにとってなりたい自分に近づける日でありますように。