PowerShellでウェブページの画像ファイルを一括ダウンロードするスクリプト

コンピュータ

はじめに

このスクリプトは変数$uristrにセットしたURIアドレスのWebページ内でリンクされた画像(img)を一括ダウンロードします。
画像ファイルはカレントフォルダにダウンロードされます。
また$html.getElementsByTagName("img")$html.getElementsByTagName("a")に変更しその後の$_.src$_.hrefに変更するといろいろなファイルタイプの一括ダウンロードに対応できます。

私が紹介しているスクリプト共通でいえることですがエラー処理などを省いていますので必要があれば適時対応ください。

PowerShellスクリプトを初めて実行する場合

PowerShellスクリプトの実行を許可してください。
Powershellのps1ファイルを実行する方法
はじめに WindowsのコマンドラインインターフェースであるPowershellはコマンド操作をテキストファイルに記述したスクリプトファイルを実行することが出来ます。 Microsoft Excelで言うところのマクロのような物で...

スクリプト

<#
# ウェブページの画像ファイルを一括ダウンロード
#>

$ErrorActionPreference = "Stop"
Set-StrictMode -Version 2.0

$uristr = 'http://maywork.net/'

$baseuri = New-Object System.Uri($uristr)

$res = Invoke-WebRequest -Uri $baseuri

$html = $res.ParsedHtml

try {
    $t = $html.getElementsByTagName("img")
} catch {
    $t = $html.IHTMLDocument3_getElementsByTagName("img")
}

$result = $t | ? {
    $_.protocol -match "HyperText Transfer Protocol"
} | % {
    New-Object System.Uri($_.src)
} | ? {
    $_.host -eq $baseuri.Host
} | % {
    $src = $_.AbsoluteUri
    $dst = Join-Path (pwd) (Split-Path -Leaf $_.AbsolutePath)
    Invoke-WebRequest -Uri $src -OutFile $dst
}

スクリプト(関数版)

<#
# ウェブページの画像ファイルを一括ダウンロード
# 関数版
#>

$ErrorActionPreference = "Stop"
Set-StrictMode -Version 2.0


# リンクを取得
function GetLinks
{
    param (
        [parameter(ValueFromPipeline=$true)]
        $uri
    )
    process
    {
        $res = Invoke-WebRequest -Uri $uri

        $html = $res.ParsedHtml

        try {
            $t = $html.getElementsByTagName("img")
        } catch {
            $t = $html.IHTMLDocument3_getElementsByTagName("img")
        }

        $result = $t | ? {$_.protocol -match "HyperText Transfer Protocol"} | % { $_.src }

        return $result
    }
}


#
# 重複しないファイル名を生成
#
function Create-UniquePath
{
    param(
        [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
        [string]$BasePath
    )
    process
    {
        if (!(Test-Path -Path $BasePath)) {
            return $BasePath
        }
        $f = Get-Item -Path $BasePath
        $Result = $BasePath
        for($i=1; (Test-Path -Path $Result); $i++) {
            $Result = $f.Directory.FullName + "\" + $f.BaseName + "(" + $i + ")" + $f.Extension
        }
        return $Result
    }
}

# ファイルのダウンロード
function HttpDownload
{
    param (
        [parameter(ValueFromPipeline=$true)]
        $uri,
        $out_dir
    )
    begin
    {
        # カレントディレクトリを保存
        $save_dir = (Convert-Path .)
        
        # 出力先のディレクトリへ移動
        if ($out_dir) {
            Set-Location $out_dir
        }
    }
    process
    {
        
        $tmp_file = New-TemporaryFile

        $res = Invoke-WebRequest -Uri $uri -OutFile $tmp_file -PassThru


        # ファイル名
        $out_file = ""

        if ($res.Headers["Content-Disposition"] -match "filename=`"(.+?)`"") {
            # Content-Dispositionでファイル名が指定されている場合。
            $out_file = $Matches[1]
        } else {
            # ファイルタイプ
            $ext = ""
            if ($res.Headers["Content-Type"] -match "image/([^\s]+)") {
                $ext = $Matches[1]
            }
            if ($res.Headers["ETag"]) {
                # ETagが有る場合
                $out_file = $res.Headers["ETag"]
                if ($out_file -match "^[`"`'](.*)[`"`']$") {
                    $out_file = $Matches[1]
                }
            } else {
                # uriの末尾の要素
                if ($uri -match "(.*)/$") {
                    $uri = $Matches[1]
                }
                $u = New-Object System.Uri($uri)
                $out_file = $u.Segments[-1]

            }
            if ($out_file -notmatch "\.") {
                # .を含まない場合拡張子を加える
                $out_file = $out_file + "." + $ext
            }
        }
        
        $out_file = Create-UniquePath (Join-Path (Convert-Path .) $out_file)

        Move-Item $tmp_file $out_file | Out-Null

        $out_file
    }
    end
    {
        Set-Location $save_dir | Out-Null
    }
}

$uristr = 'http://maywork.net/'
GetLinks $uristr | HttpDownload -out_dir "h:\script\x\"

スクリプトの実行環境

プロダクト名
Windows 10 Home
ビルド番号
17763.316
Powershellバージョン
5.1.17763.316
.NET Framework
.NET Framework 4.7.2

スポンサーリンク

コメント