業務自動化とプログラミングのためのTips

自動化.work

PowerShell Windows

画像ダウンローダーを作る[PowerShell]

更新日:

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

結果、画像ファイルがダウンロードされて保存されました。

今回のコードです。


-PowerShell, Windows

Copyright© 自動化.work , 2020 All Rights Reserved.