Windowsに付属しているPowerShellではHTMLページの中身の要素を簡単に取り出せる機能が豊富です。
その機能を利用してページに含まれるリンク先の画像をダウンロードするスクリプトを作ってみました。
目次
PowerShellで引数を受け取る
PowerShellで引数を受け取るには"Param(arg1, arg2, ...)"を使用します。
今回はURLを1つだけ受け取るということで以下のようにしました。
Param( $url )
指定したHTMLページを取得
PowerShellでHTMLページを取得するためには"Invoke-WebRequest"を使用します。
今回は引数$urlでURLを受け取っているため以下のように指定します。
$pageには取得したページのオブジェクトが入ります。
$page = Invoke-WebRequest $url
ページに含まれるリンクを調べる
取得したページのオブジェクトにはリンクが含まれているため、リンクそれぞれに対してリンクが画像へのリンクかどうかを調べます。
foreach($変数 in $配列) を利用すると複数ある変数一個一個を取り出して処理を行えます。
foreach($linkElement in $page.Links.href)
全てのリンクを取り出して処理を行ったらループを抜けます。
リンクからファイル名を取り出す
リンクからファイル名を取り出すためには、パスの文字列のうち最後の要素を取り出す必要があります。
そのためにはSplit-Pathを使用します。
Split-Pathにはオプションが色々ありますが、今回は最後の要素(Leaf)を取り出します。
$fileName = Split-Path $linkElement -Leaf
Split-Pathの詳しい説明はMSDNにあります。
Split-Path
https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/split-path
ファイル名から拡張子を取得
ファイル名から拡張子を取得するためにはSystem.IO名前空間のPathクラスを利用します。
Path クラス (System.IO)
https://msdn.microsoft.com/ja-jp/library/system.io.path(v=vs.110).aspx
[IO.Path]::GetExtension($string)
このPathクラスには拡張子を取得する以外にも様々な操作をパスの文字列に対して行うことができます。
拡張子が画像の拡張子であるか判定
普通にif文で行ってます。PowerShellは色々と機能があるため、文字列オブジェクト自体に画像の拡張子であるかどうか判定する機能があるかと考えたのですが、今の所見つかってません。そのため画像の拡張子ごとにorで繋げることにしました。
if ( $extension -eq ".jpg" -or $extension -eq ".png")
画像のダウンロード
またInvoke-WebRequestで画像のURLを指定します。
Invoke-WebRequest $linkElement -OutFile $fileName
ただし今回はファイルとして出力する必要があるため -OutFileオプションを使用し、引数としてファイル名を指定しています。
PowerShellスクリプトを保存して実行
PowerShellスクリプトはファイル名に.ps1拡張子がつきます。
試しにURLを指定して画像をダウンロードしてみます。
実行するためには以下のように先頭に.\をつけます。
.\download_images.ps1 https://jidouka.work/?p=29
結果、画像ファイルがダウンロードされて保存されました。
今回のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Param( $url ) #引数のアドレスのWebページを取得 $page = Invoke-WebRequest $url #Link先の画像をダウンロード foreach($linkElement in $page.Links.href) { # パスの最後の文字列をファイル名として取得 $fileName = Split-Path $linkElement -Leaf #ファイル名から拡張子を取得 $extension = [IO.Path]::GetExtension($filename) #拡張子が".jpg"もしくは".png"の場合 if ( $extension -eq ".jpg" -or $extension -eq ".png") { #リンク先のファイルを取得してファイル名で保存 Invoke-WebRequest $linkElement -OutFile $fileName } } |