今回の記事はC#でスクレイピング用ライブラリのAnglesharpを用いてサイト内のボタンをクリックしてその先のサイト情報や応答結果の取得を行う方法に関しての記事です。初心者にも分かりやすいように記事を記載していくので是非参考にして下さい。
C#でAnglesharpを使う方法
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
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単体での限界〜」
では今回のメインに進んでいきます。
Anglesharpでボタンクリック
上記で簡単な使い方に関しては理解できたと思うのでボタンセレクターを特定してボタンクリックを行っていきます。
using System;
using System.Linq;
using System.Threading.Tasks;
using AngleSharp;
using AngleSharp.Html.Dom;
namespace test
{
class Program
{
static async Task Main(string[] args)
{
var titles = await searchByGoogle("AngleSharp");
foreach (var title in titles)
{
Console.WriteLine(title);
}
}
private static async Task<System.Collections.Generic.IEnumerable<string>> searchByGoogle(string searchKeyword)
{
// セットアップ
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
// 検索ページを開く
var document = await context.OpenAsync("https://www.google.co.jp/");
// 指定したキーワード(test)で、検索を行う
var form = document.QuerySelector("form") as IHtmlFormElement;
await form.SubmitAsync(new { q = searchKeyword,} );
// 検索結果のタイトル一覧を取得する
var tags = context.Active.QuerySelectorAll("h3");
var titles = tags.Select(m => m.TextContent);
return titles;
}
}
}
以上でボタンクリック に関して行えていると思います。googleページを対象ページにしていますが、google検索欄のへの値記入し、検索ボタンを押すという動作です。要はフォーム情報送信を「submitasync」で担っているみたいなイメージです。
ただ、ボタンクリックといっても要はサーバへのhttp通信でフォーム情報を送信していることが多いのでその場合は、http通信で簡単に処理を行うことができると思います。そのような場合は先ほど紹介した記事「C#でAnglesharp+http通信でスクレイピングする方法。〜AngleSharp単体での限界〜」でAnglesharp+Post通信で処理を実装できるかも興味があれば確認してみて下さい。
コメント
[…] 「【C#】AngleSharpでボタンクリック」 […]