tech.guitarrapc.cóm

Technical updates

Html Agility Pack と SgmlReader を使って PowerShell でスクレイピングしてみる

WebページのスクレイピングをPowerShell 単独でやるのはあまり楽しくありません。

が、C# で用いるように Html Agility PackSGMLReader を使えば楽に触れます。

今回は、 某ブログをこれらを使って少し見てみましょう。

目次

HTMLパースに何を使うの?

HTML Agility Pack

有名どころなので特にいうことはありません。

これはこれで楽です。

SGMLReader

HTML Agility Pack 以外に何かないかなーと思うと以前読んだ記事にあった SGMLReader が思い出されます。

指摘も読んだり。

PowerShell は Linq メソッドをメソッドチェーンで使えないので、Linq to Xml の利便性を余り享受できず.... 両方比べて見ます。

なにやるの

某サイトの記事更新を正座待機すると足がしびれるので任せてしまいます。

そこで某サイトの構造を見ると?

f:id:guitarrapc_tech:20141225051136p:plain

どうやら各記事のタイトルが h2 タグで捉えられそうです。あとは、ページを取得してパースするだけです。

Html Agility Pack

さくっとやりましょう。Html Agility Pack の dll を Add-Type でインポートしてあとは C# で書くのを PowerShell に翻訳するだけです。

結果も取れてます。

Date                                             Result Title                      
----                                             ------ -----                      
2014/12/25 4:59:12                                False 山盛り千切りキャベツを食べない人がいて    
SgmlReader

https://neue.cc/2010/03/02_244.html のコードがわかりやすいので、PowerShell に直します。

Nuget から SGMLReader の dll を参照に取得してAdd-Typeで参照しましょう。

あとは、HTTP Agility Pack と同様の処理ですね。

Date                                           Result Title                    
----                                           ------ -----                    
2014/12/25 5:08:02                              False 山盛り千切りキャベツを食べない人がいて    

C# のusing 構文がないため try{}finally{}をしてますがしょーがにゃい。

比較

さくっと使う分には、HTML Agility Pack でもさくさくかけますが、微妙に//h2 とかがちょっとやですね。

SGMLReader は読み込み部分さえ作ってしまえばタグ指定も、要素取得も簡単ですね。

PowerShell でもパイプラインでどちらとも同様に扱えるので違和感は少ないと思います。

まとめ

PowerShell で記事更新監視も簡単ですね。てきとーループとお好きな通知を組み合わせてもいいでしょうし、スケジュールしてもいいでしょう。

do
{
    $result = Get-DullahanArticleCheck -Url "https://donabeneko.jp" -LastTile "山盛り千切りキャベツを食べない人がいて"
    $result
    
    # おすきな通知

    # sleep
    if ($result.Result -eq $false){Start-Sleep -Seconds 300}
}
while ($result.Result -eq $false)

あまりスクレイピングしないのですが、この程度の軽量さならC# で書いてもどちらでもやりやすい方でいいでしょう。

あ、アドベントカレンダー忘れてないし書きますよ。