今回の記事はC#でWebページをスクレイピングを、ライブラリのAnglesharpを用いて行う方法についての記事になります。
AngleSharpのみを使用してスクレイピングに取り組んでいましたが、これ単体ではやはり使い勝手が悪い為、業務で使用する場合などはC#のhttp通信ライブラリなどと併用する必要があると思います。その為下記記事が参考になると思いますので是非業務で使用する場合は下記を参考にしてみてください。
「C#でhttp通信を行う方法。〜 Get/Post通信 〜」
「C#で実際のサイトをスクレイピングする手順」
ではメインの記事に進みます。
C#でWebスクレイピングをするメリット
C#でスクレイピングをするメリットとしてはやはりWindowsのWindowsサービスにアプリを組み込める点ではないでしょうか?基本的に他の言語でもスクレイピングをすることは可能ですが、Windowsサービスに組み込む場合はC#が最も便利かと思います。とはいえ、結果確認がしやすいと言う観点から今回は、コンソールアプリを作成します。
機械学習などに組み込む場合はPythonかなといったイメージです。
C#でWindowsサービスを作成する手順に関しては下記記事で詳しく記載しているので気になる方は下記を参考にしてください。
「【C#】C#を使ってVisual StudioでWindowsサービスを作成する方法」
スクレイピングライブラリ「AngleSharp」とは?
こちらはC#で使用できるスクレイピングライブラリです。DOM情報をそのまま取得できるようなので、DOM情報が更新されない場合は非常に使い勝手がいいと思います。
物理的なキーボードをクリックするなどの操作はできませんがDOMからの情報取得に関してはこちらで問題なく操作できるものと思います。この辺りまではPythonと遜色ないかと思います。
物理操作を行う際はブラウザを開いて行うSeleniumやPythonでキーボード操作を自動化する「pyautogui」の使用が考えられます。下記記事が参考になると思います。
「Pythonのおすすめライブラリ「pyautogui」の使用方法」
AngleSharpをVisualStudioにインストール
まずはVisualStudioにAngleSharpをインストールします。Nugetのパッケージ管理からインストールできます。
メニューバーの[tool]→[nu get]→[パッケージの管理]からAngleSharpを検索してインストールを押すのみです。
AngleSharpでスクレイピング
では実際にサンプルページを参考にしてスクレイピングしてみてください。
下記コードはgoogleの検索ページの入力欄に文字入力、検索ボタンクリック 、表示されたサイトのタイトル一覧を取得するコードになります。(こちらはネットに転がっていたものです。)
using System;
using System.Linq;
using System.Net.Http;
using AngleSharp.Html.Parser;
namespace test
{
class Program
{
// HttpClientのインスタンス
private static HttpClient client = new HttpClient();
// HttpClientのインスタンスは使いまわす必要があります。
static void Main(string[] args)
{
//サンプルとして使用するHTML
//ここはclientなどで取得したものでも良い
var htmlText = @"
<html>
<head>
<meta charset = 'UTF-8'/>
<title>AngleSharpの使い方</title>
</head>
<body>
<div id = 'header' name='headerName'>
<h1 id = 'headerTitle'>AngleSharpの使い方</h1>
</div>
</body>
</html>
";
// HtmlParserクラスをインスタンス化
var parser = new HtmlParser();
// HtmlParserクラスのParserメソッドを使用してパースする。
// Parserメソッドの戻り値の型はIHtmlDocument
var htmlDocument = parser.ParseDocument(htmlText);
// aタグの要素を全て取得する。
var urlElements = htmlDocument.QuerySelectorAll("title");
Console.WriteLine(urlElements.ToArray()[0].TextContent);
}
}
}
簡単に解説するとベタガキしたHtmlを取得しています。こちらを業務用に使用する場合はhttp通信などをwebcliantを使用して取得すると思いますが、今回に関してはベタがきのhtmlからtitle要素をSelectorを使用して取得しています。
今回のコードではSelectorAllを使用していますがSelectorでも取得できると思います。
http通信とAngleSharpを併用する場合はこの記事の初めの方でも説明した下記記事が参考記事になっております。
「C#でAnglesharp+http通信でスクレイピングする方法。〜AngleSharp単体での限界〜」
以上で今回の記事は終了します。まだまだC#初心者の枠を抜け切っていないのでどんどん記事を書いていきます。是非他の記事も参考にしてください。
コメント
[…] 「C#でAngleSharpを使用してウェブページをスクレイピングする方法」「C#でhttp通信を行う方法。〜 Get/Post通信 〜」 […]
[…] また、私の過去記事としていくつかリンク貼っておきますのでそちらも興味があれば是非参考にしてみてください。「【C#】Anglesharpを用いたスクレイピング」 […]