Win7 (PowerShell 2.0) + IE11 な環境でスクレイピングしたかったので.
querySelector()、querySelectorAll() に CSS セレクタを指定して DOM 要素を取得しています.
InvokeMember() でメソッドを呼び出す必要がありました(後述).
試していませんが getElementById() や getElementsByTagName() を使う場合も同様と思います.
ソースコード
※管理者権限で実行する必要があります
ie.ps1
# IEのページ読み込みが完了するまで待機する
function Wait-IE($ie)
{
# ビジーでない状態が3秒くらい継続したら読み込み終わったと判断する(適当)
$i = 0
while ($i -lt 3) {
if ($ie.Busy) {
$i = 0
}
else {
$i++
}
Start-Sleep -Seconds 1
}
}
# CSSセレクタでノードを得る(複数ノード)
function Select-Nodes($node, [string]$selector)
{
$nodes = [System.__ComObject].InvokeMember("querySelectorAll", [System.Reflection.BindingFlags]::InvokeMethod, $null, $node, $selector)
$result = New-Object System.Collections.Generic.List[System.__ComObject]
for ($i = 0; $i -lt $nodes.Length; $i++) {
$result.Add([System.__ComObject].InvokeMember("item", [System.Reflection.BindingFlags]::InvokeMethod, $null, $nodes, $i))
}
$result
}
# CSSセレクタでノードを得る
function Select-SingleNode($node, [string]$selector)
{
[System.__ComObject].InvokeMember("querySelector", [System.Reflection.BindingFlags]::InvokeMethod, $null, $node, $selector)
}
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Visible = $false
# (1)Googleの検索結果一覧を取得してみる
$ie.Navigate("https://www.google.co.jp/search?q=test")
Wait-IE $ie
$links = Select-Nodes $ie.Document "h3.r a"
$links | % { $_.innerText }
# (2)別のキーワードで検索してみる
$text = Select-SingleNode $ie.Document "#lst-ib"
$text.Value = "google"
$btn = Select-SingleNode $ie.Document "#_fZl"
$btn.click()
Wait-IE $ie
$ie.Visible = $true
はまったポイントなど
- COM オブジェクトのメソッドを直接コールできない → InvokeMember() を使用 (https://blogmaster365.wordpress.com/2014/07/31/powershell-%E3%81%A7ie%E8%87%AA%E5%8B%95%E5%AE%9F%E8%A1%8C/)
- Office のインストールの有無など環境による?
- Navigate() でページ遷移後、IE オブジェクトが無効になる → 原因はわかりませんが管理者権限で実行することで回避できました