以下の内容はhttps://tech.guitarrapc.com/entry/2014/12/25/052630より取得しました。


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

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

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

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

HTMLパースに何を使うの?

HTML Agility Pack

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

https://htmlagilitypack.codeplex.com/

これはこれで楽です。

SGMLReader

HTML Agility PackのほかにSGMLReaderが思い出されます。

https://neue.cc/2010/03/02_244.html

指摘も読んだり。

https://atsushieno.hatenablog.com/entry/2013/09/06/053327

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

なにやるの

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

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

image

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

Html Agility Pack

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

https://gist.github.com/guitarrapc/e622a2ec965fe155922d

結果も取れてます。

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

SgmlReader

参考サイトのコードがわかりやすいので、PowerShellに直します。

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

https://www.nuget.org/packages/SgmlReader/

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

https://gist.github.com/guitarrapc/dfa1c629767af805ee4e

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

C# のusing構文がないためusingをしてますがしょーがない。

比較

さくっと使う分には、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# で書いてもどちらでもやりやすい方でいいでしょう。

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




以上の内容はhttps://tech.guitarrapc.com/entry/2014/12/25/052630より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14