WebページのスクレイピングをPowerShell 単独でやるのはあまり楽しくありません。
が、C# で用いるように Html Agility Pack や SGMLReader を使えば楽に触れます。
今回は、 某ブログをこれらを使って少し見てみましょう。
目次
HTMLパースに何を使うの?
HTML Agility Pack
有名どころなので特にいうことはありません。
これはこれで楽です。
SGMLReader
HTML Agility Pack 以外に何かないかなーと思うと以前読んだ記事にあった SGMLReader が思い出されます。
指摘も読んだり。
PowerShell は Linq メソッドをメソッドチェーンで使えないので、Linq to Xml の利便性を余り享受できず.... 両方比べて見ます。
なにやるの
某サイトの記事更新を正座待機すると足がしびれるので任せてしまいます。
そこで某サイトの構造を見ると?
どうやら各記事のタイトルが 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# で書いてもどちらでもやりやすい方でいいでしょう。
あ、アドベントカレンダー忘れてないし書きますよ。