PowerShellでInternet Explorerを操作する

コンピュータ
アプリケーションであるIntenetExplorer(以下IE)をPowerShellからマクロ的に操作するサンプルになります。
Webページの文字や画像情報をスクリプト言語で取得する手法の一つで比較的昔からあります。

IEを含めたウェブブラウザは、http(s)でWeb上のファイルをダウンロードしたり、文字コードを返してこないWebサーバーの文字コードを自動認識したり、不完全なHTMLをいい感じに人間が読めるようなページで表示してくれたり、まじめにプログラミングするには、かなり面倒な仕事をうまいこと処理してくれます。そう言った面倒事を自分で処理(プログラミング)するのではなくIEに丸投げ出来る点は非常に素晴らしいと思います。

IEを使ったサンプル

<#
.Synopsis
   IEを操作するサンプル
.DESCRIPTION
   Internet Explorerで指定のページのh2タグで囲まれた文字列を取得します。
.EXAMPLE
   .\sample_ie.ps1 取得するURL
#>
param(
    [string]
    $TargetUrl='https://maywork.net/'
)

function sample_ie($url)
{
    # IEを初期化
    $ie = New-Object -ComObject InternetExplorer.Application
    # IEを可視化
    $ie.Visible = $true
    # URLにページを移動
    $ie.Navigate($url)
    # ページの読み込み待ち
    while ($ie.busy -or $ie.readystate -ne 4) {
        Start-Sleep -Seconds 1
    }
    
    # ドキュメントオブジェクト
    $doc = $ie.Document
    $reslut = $doc.body.all | ? {
        # すべてのタグからH2のみ選択
        $_.tagName -eq 'H2'
    } | % {
        # $ieを参照をそのまま返すと$ie.Quit()で$ieオブジェクトが閉じられてエラーになります。
        # H2に囲まれた文字列を返す
        $_.innerText
    }

    # IEを閉じる
    $ie.Quit()

    $reslut
}

$r = sample_ie $TargetUrl
$r

結果


何かと便利そうなIEですが、人間が見て操作するアプリケーションであり、スクリプトから操作するには向かない部分も多々あります。
すぐに思いつく例としては、スクリプトが起動したIEを人間が閉じてしまったり、逆に人間が起動したIEをスクリプトが閉じてしまったりなど、あまり本質とは関係ない例外処理の対策をする必要があります。
あと、IEはそれなり大きなアプリケーションでありスクリプトで多数同時に立ち上げるには負荷が大きく動作も重くなりがちです。

IEにこだわる必要が無いのであれば今回のサンプル程度であればInvoke-WebRequestを使って同様な結果が得られます。

Invoke-WebRequestを使ったサンプル

<#
.Synopsis
   Invoke-WebRequestサンプル
.DESCRIPTION
   指定のページのh2タグで囲まれた文字列を取得します。
.EXAMPLE
   .\sample_Invoke-WebRequest.ps1 取得するURL
#>
param(
    [string]
    $TargetUrl='https://maywork.net'
)

$ErrorActionPreference = "Stop"

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Win7おまじない

function sample_Invoke-WebRequest($url)
{
    $resp = Invoke-WebRequest $url
    $html = $resp.ParsedHtml

    $html.getElementsByTagName("h2") | % {
        $_.innerText
    }
}
sample_Invoke-WebRequest $TargetUrl

IEと同じ結果になるはずです。IEと比べ動作も軽いので通常はこちらで良いと思いますが、この方法も万能ではなく(というかインターネットやWebが厄介すぎる)どうしても上手くいかないケースに遭遇します。そう言った場合IEの力におすがりするのが良いと思います。

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

PowerShellスクリプトの実行を許可してください。
Powershellのps1ファイルを実行する方法
PowersehllをはじめるにあたりWindowsのコマンドラインインターフェースであるPowershellはコマンドレットと言われる命令をテキストファイルに記述したスクリプトファイルを実行することが出来ます。Powershellはその名...

スクリプトの実行環境

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

コメント