tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

スクレイピングにはAngleSharpが良いらしい

https://raw.githubusercontent.com/AngleSharp/AngleSharp/master/header.png

github.com

C#スクレイピングライブラリはHtml Agility Packがメジャーですが、昔使った感じだとなんか微妙なので(XPathとかだるい)他のライブラリを探してみたらAngleSharpってのが良さそうなのでこちらを使ってみました。ちなみに僕が運用しているみんなの洋楽ランキングでは、情報の収集と自動化にAngleSharpを使っています。
mygkrnk.com

AngleSharpをダウンロードします。

dotnet add package AngleSharp --version 0.9.10

余談ですが、メジャーバージョンが出ていない理由は.net coreの進みが早くてライブラリが追っついていないようです。作者はこう嘆いています。

One of the greatest killers was Microsoft's ever growing change
最大の殺人者の1人は、マイクロソフトの絶え間ない変化(翻訳ママ)

killersってすげー表現だな、どういうニュアンスで言ってんだろ?
Request for stable release (=version 1.0) · Issue #709 · AngleSharp/AngleSharp · GitHub

using

using AngleSharp.Parser.Html;

stackoverflowとか見てて名前空間がわからない調べることが多いんだけど、みんなどうしてんのかな?

htmlをパースする

htmlは適当に取ってきてください。

var parser = new HtmlParser ();
var doc = parser.Parse (html);

属性を取得

今回はみんなの洋楽ランキングのいいね数を取得します。一番最初に取得するいいね数なので10位のいいね数が取得されます。
これ
f:id:tekitoumemo:20180921003302p:plain
f:id:tekitoumemo:20180921003423p:plain

var likeApp = doc.GetElementsByClassName ("like-app");
var count = likeApp.First().Attributes["react-prop-counts"].Value;
// count : "5"

InnerHtmlを取得

せっかくなんで曲名で検索します。
f:id:tekitoumemo:20180921003631p:plain
f:id:tekitoumemo:20180921003646p:plain

var enrryTitles = doc.GetElementsByClassName ("entry-title");
var title = enrryTitles.Where(x => x.InnerHtml.Contains("In My Feelings")).First().InnerHtml;
// title : <a href=\"/music/784\">In My Feelings</a>

HtmlAgilityPackに比べてめちゃめちゃ使いやすくなってるので、スクレイピングを検討している人は試してみてはどうでしょうか。まだまだいろんなやり方はあるので、ドキュメントを見てください。一応、調べてる最中にタラタラ書いたコードをGithubに上げたので参考になれば。個人の趣味ブログなのですげーテキトーにコード書いてますのでご注意を。
github.com