PowershellによるIEWebスクレイピング

Internet ExplorerをPowershellでWebスクレイピングする方法

IEでしか動かないページがまだ有るという悲しい状況でWebスクレイピングする方法を探してみました。

HTML要素の取得

一番簡単なhttpリスクエストに対する応答(Response)を取得するだけならInvoke-WebRequestで実行できます。

認証が必要ならCredentialsオプション、プロキシが必要ならProxyオプションを使いましょう。

httpsを要求するサイトも増えてきました。そういったサイトの場合、Invoke-WebRequestが失敗します。
例:

上記を実行すると、下記のエラーが返ってきます。

Powershellで使われているSSL/TLSの設定を確認してみましょう。

SSL3.0,TLS1.0のようです。TLS1.0は脆弱性が報告されていて、TLS1.2以上を要求されます。
.Netでの記法を確認してみましょう。

Tls12で良いようなので、これを追加しましょう。

HtmlWebResponseObjectというオブジェクトに格納されます。オブジェクトのMemberを見てみましょう。

返ってきたhtml応答をparse(解析)した結果が格納されます。ImageやLink,Scriptなんかは配列として格納されているのでこのまま参照できます。その他のhtml tagについてはPasedHTMLのgetElementsByTagNameメソッドで取り出す事ができます。
$Table=$Response.ParsedHtml.getElementsByTagName("table")

表示されている文字列を取り出すのであれば下記で出来ます

これ、結果にSystem.__ComObjectが入ってくるんですが、内部的にIEをCOM呼び出しで実装しているようで、取り出してみないとどう格納されているのかわからないところがあります。

Comオブジェクトを使ったIEの操作

Invoke-WebRequest便利なんですが、返ってくるのは静的HTMLです。動的に表示する要素はxxxx.jsなどjava scriptへの参照が表示されるだけです。これで済むのであればIEじゃなくてもどのブラウザでも表示できるので、「IEじゃないと動かない」ってことは無いんじゃないですかね?

そういった場合、ブラウザに動的ページを表示させて、その結果を取得するというのは可能というのは過去の経験から分かっています。ということで、IEを外部から操作してみます。

IEを外部操作しようとすると、今のところComオブジェクトになるようです。

これはアプリケーション間の操作として作られていてVBAなどでオブジェクトを作って操作する方法が紹介されています。

InternetExplorer.Applicationで検索するとExcel VBAの書き方がたくさんヒットします。
Windows上のオブジェクトなので終わったらQuitして変数を初期化しておきましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください