nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

AngleSharpを用いて、Webスクレイピングをしましょう[AngleSharp]

はじめに

Webスクレイピングとは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。 ウェブ・クローラーあるいはウェブ・スパイダーとも呼ばれる。(wikipedia参照)

Webスクレイピングに、Html Agility Packではなく、今回は、AngleSharpを使用してみようと思います。 AngleSharpHTMLだけでなく、SVG、MathML、CSSもパース可能なようです。 (詳細は、C#でモダンにスクレイピングするならAngleSharp)

コード

以下のように簡単にインターネットのホームページのクエリーセレクタを指定して情報を取得可能です。

                // 株価を取得したいサイトのURL
                var code = "7984.T";
                var urlstring = $"http://stocks.finance.yahoo.co.jp/stocks/detail/?code={code}";

                // 指定したサイトのHTMLをストリームで取得する
                var doc = default(IHtmlDocument);
                using (var client = new HttpClient())
                using (var stream = await client.GetStreamAsync(new Uri(urlstring)))
                {
                    // AngleSharp.Parser.Html.HtmlParserオブジェクトにHTMLをパースさせる
                    var parser = new HtmlParser();
                    doc = await parser.ParseAsync(stream);
                }

                // クエリーセレクタを指定し株価部分を取得する
                var priceElement = doc.QuerySelector("#main td[class=stoksPrice]");

                string priceString = priceElement.TextContent.Replace(",", string.Empty);
                // 取得した株価がstring型なのでint型にパースする
                int.TryParse(priceString, out var price);

                Debug.WriteLine("コクヨ(7984.T)の株価: {0}円", price);

使い方

IDEがVisual Studioであれば、NuGetから取得可能です。

あとがき

この後は、非同期で、Webスクレイピングを行っていきたいと思います。

非同期で引っ掛かりやすいポイントをあらかじめ調べておこうと思います。

非同期に、データを追加するのであれば、以下の記事の方法で実現可能です。 WPF:DataGridやListViewなどに表示しているデータを別スレッドから変更するには?[C#、VB]:.NET TIPS - @IT

非同期処理のあるプログラムにおいて、どのスレッドで処理されているか、手順が記載されている記事です。 [C#5.0~] async/awaitとTask.Runメソッドを用いた非同期処理のメモ |

非同期は実現できても、非同期にデータベースにデータ追加していくと、データ不整合が発生とかなりそう・・・。 (現在、その状況になったので、試行錯誤中)

neue cc - asyncの落とし穴Part3, async voidを避けるべき100億の理由

非同期:awaitを含むコードをロックするには?(SemaphoreSlim編)[C#、VB]:.NET TIPS - @IT

第3回 マルチスレッドでデータの不整合を防ぐための排他制御 ― マルチスレッド・プログラミングにおける排他制御と同期制御(前編) ― (1/3):連載.NETマルチスレッド・プログラミング入門 - @IT

リンク

anglesharp.github.io