LoginSignup
4
5

More than 5 years have passed since last update.

PowerShell 2.0 から IE11 を操作しスクレイピングするサンプルコード(querySelector編)

Last updated at Posted at 2017-04-18

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

はまったポイントなど

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5