しまぞうブログ

プログラミングと資産運用

Visual StudioでのC#プログラミング入門【Webスクレイピング】

Webから自動で情報を取ってこれると、何かと捗ります。そこでC#スクレイピングする方法について調べました。

関連記事

スクレイピングライブラリ

スクレイピングライブラリの種類

C#スクレイピングライブラリは以下の2つが有名なようです。

  • AngleSharp
  • Html Agility Pack

色々調べるとAngleSharpの方が使いやすそうだったので、AngleSharpを使用していきます。

AngleSharpのインストール手順

「プロジェクト」→「NuGetパッケージの管理」を選択します。
※新規プロジェクトの作成方法はこちらをご覧ください。

「参照」タブを選択し、検索ボックスに「AngleSharp」を入力すると、AngleSharpが表示されますのでインストールします。

インストールされると、ソリューションエクスプローラーにAngleSharpが表示されます。

スクレイピング手順

AngleSharpを使用したスクレイピングの手順について説明します。

htmlの取得

はじめにhtmlを取得します。以下、サンプルプログラムです。

using AngleSharp;

string strUrl = "https://shimazoh.hatenablog.com/entry/cs-vs-howto-basic/";
var config = Configuration.Default.WithDefaultLoader().WithDefaultCookies();
var context = BrowsingContext.New(config);
var document = await context.OpenAsync(strUrl);
Console.WriteLine(document.ToHtml());

要素の取得

htmlから要素を取得します。例えばタイトルやh2タグを取得する場合は、以下のようなプログラムになります。

using AngleSharp.Html.Parser;

var parser = new HtmlParser();
var doc = parser.ParseDocument(strHtml);    //上記で取得したhtml
            
Console.WriteLine(doc.Title);               //タイトル

var h2Nodes = doc.QuerySelectorAll("h2");   //h2タグ
foreach(var h2Node in h2Nodes)
{
    Console.WriteLine(h2Node.TextContent);
}

その他の要素の取得方法については、こちらのサイトにプロパティ・メソッドがまとめられています。

サンプルプログラム

以上をまとめると、以下のようなプログラムになります。

using AngleSharp;
using AngleSharp.Html.Parser;

namespace SampleNS
{
    public class Sample
    {
        static void Main()
        {
            string strUrl = "https://shimazoh.hatenablog.com/entry/cs-vs-howto-basic/";
            Task<string> task = fetchStrHtml(strUrl);

            var parser = new HtmlParser();
            var doc = parser.ParseDocument(task.Result);
            
            Console.WriteLine(doc.Title);               //タイトル

            var h2Nodes = doc.QuerySelectorAll("h2");   //h2タグ
            foreach(var h2Node in h2Nodes)
            {
                Console.WriteLine(h2Node.TextContent);
            }
        }

        private static async Task<string> fetchStrHtml(string strUrl)
        {
            var config = Configuration.Default.WithDefaultLoader().WithDefaultCookies();
            var context = BrowsingContext.New(config);
            var document = await context.OpenAsync(strUrl);
            return document.ToHtml();
        }
    }
}

実行すると以下のようにタイトルとh2タグのテキストが出力されます。

参考サイト