はじめに
Webスクレイピングとは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。 ウェブ・クローラーあるいはウェブ・スパイダーとも呼ばれる。(wikipedia参照)
Webスクレイピングに、Html Agility Pack
ではなく、今回は、AngleSharp
を使用してみようと思います。
AngleSharp
HTMLだけでなく、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