powershellでスクレイピングする

Powershellスクレイピングを行う方法

今回はPowershellスクレイピングを行う方法を解説します。



PowershellでHTMLを取得する


    • まずはネットからhtmlを拾ってくるところから始めるよ
    • 了解!

PowerShellInvoke-WebRequestコマンドレットを使用して、WebページのHTMLを取得することができます。

$url = "https://example.com"
$response = Invoke-WebRequest -Uri $url
$html = $response.Content

今回はexampleですが、例えばyahooの天気予報を取得したい場合にはurlを次のように変更しましょう。

$url = "https://weather.yahoo.co.jp/weather/"
$response = Invoke-WebRequest -Uri $url
$html = $response.Content
echo $html

サンプル実行例

<!DOCTYPE html>
<html lang="ja">

<head>
  <link rel="stylesheet" href="https://s.yimg.jp/images/weather/pc/v2/css/map-1.1.0.css">
  <title>Yahoo!天気・災害 - 天気予報 / 防災情報</title>
  <link rel="canonical" href="https://weather.yahoo.co.jp/weather/">
</head>

<body class="yj950-2">
  (中略...)
        
  <script src="https://s.yimg.jp/images/weather/pc/v2/js/yjw_cre_sub-1.1.js" type="text/javascript" charset="UTF-8"></script>
</body>
</html>

注意:robots.txtを確認すること


    • 今回の例では"https://example.com"から拾ってきているしこのサイトはほぼ自由に扱って問題ないけど
    • 情報を拾いたいサイトを入力するときにはそのサイトがスクレイピングを許容しているかどうか確認する必要があるよ
    • 気をつけないと警察に捕まっちゃうのね
    • どう確認すればいいの?
    • その通り、特にrobots.txtの中でもUser-agent: *の下にある項目を確認すれば、許可されているページとそうでないページがわかるよ

HTML agility Packをインストールする


    • それじゃあ手に入れたhtmlコードを解析していこうか
    • さっき見た生のhtmlはクソまずいわね
    • どうしたら綺麗に見えるかしら...
    • PowerShellHTML Agility Packと呼ばれる外部ライブラリを使用することができるよ
    • 以下のコマンドを使用して、NuGetパッケージマネージャーを使用してHTML Agility Packをインストールしようか。
    • Install-Package HtmlAgilityPack
  • - なんかよくわかんないけどエンター押したら行けたっぽい!


HTMLを解析するために、PowerShellHTML Agility Packと呼ばれる外部ライブラリを使用することができます。

まずはHTML Agility Packをインストールする必要があります。 次のコマンドを使用してNuGetパッケージマネージャーからHTML Agility Packをインストールします。

Install-Package HtmlAgilityPack

スクレイピング結果を保存する

HTMLを解析して、必要な要素を抽出することができます。たとえば、すべてのリンクを取得するには、次のようにします。

$url = "https://example.com"
$response = Invoke-WebRequest -Uri $url
$html = $response.Content

Add-Type -Path ".\packages\HtmlAgilityPack.1.11.28\lib\net45\HtmlAgilityPack.dll"

$doc = New-Object HtmlAgilityPack.HtmlDocument
$doc.LoadHtml($html)

$links = $doc.DocumentNode.SelectNodes("//a")
foreach ($link in $links) {
    Write-Output $link.InnerHtml
}

結果を保存する


    • 必要に応じて、スクレイピングされたデータをファイルに保存することができるよ。
    • out-Fileコマンドを使うことで先ほど取得した結果をすべてファイルに出力してみよか。
    • なんかよくわかんないけどエンター押したら行けたっぽい!

Out-File -FilePath "output.txt" -InputObject $links

まとめ


    • そうだね。よく言う、大いなる力には大いなる責任が伴うってやつだね。

title:Powershellスクレイピングする