C#のスクレイピングライブラリであるAngleSharpを使って、htmlのformに値を入力し、submitを行ったうえで遷移後ページの内容を取得してみます。
formの制御やページ遷移が行えると、ログイン認証があるサイトなどで、認証情報を入力したうえでログイン後ページの情報を非対話でスクレイピングし、保存したい時などにも活用できます。
※AngleSharp自体の導入方法については別記事で解説しています。
WinFormでAngleSharpパッケージによるスクレイピングを行う
今回作るプログラムの説明
今回はgoogleの検索ページで検索キーワードを入力し、検索結果のページからタイトルの一覧をスクレイピングしてみます。
Googleの検索ページの仕様は以下のようになっています。
- 検索ページは"https:/www.google.co.jp/"でアクセスできる
- 検索ページにはformタグが1つだけあり、formタグにidやclassの指定はされていない
- 検索ページのformの検索キーワードを入力するエリアは、name="q"のinputタグとして用意されている
- 検索結果ページのタイトル一覧はh3タグでマークアップされている
AngleSharpで、Form入力での画面遷移を行う
上記の要件を満たすものが以下のプログラムです。
button1_Click()がボタンをクリックしたときのハンドラで、実際のスクレピングはsearchByGoogle()メソッドで行っています。
using AngleSharp.Dom.Html;
using AngleSharp.Extensions;
private async void button1_Click( object sender, EventArgs e ) {
var keyword = txtKeyword.Text;
var titles = await searchByGoogle( keyword );
foreach ( var title in titles ) {
textBox1.AppendText( title + Environment.NewLine );
}
}
/**
* Googleで検索を行い、結果を取得する
*/
private async Task<System.Collections.Generic.IEnumerable<string>> searchByGoogle(string searchKeyword) {
// セットアップ
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New( config );
// 検索ページを開く
await context.OpenAsync( "https://www.google.co.jp/" );
// 指定したキーワード(test)で、検索を行う
await context.Active.QuerySelector<IHtmlFormElement>( "form" ).SubmitAsync( new {
q = searchKeyword,
} );
// 検索結果のタイトル一覧を取得する
var tags = context.Active.QuerySelectorAll( "h3" );
var titles = tags.Select( m => m.TextContent );
return titles;
}
searchByGoogle()では、まず画面遷移を管理する変数contextを用意します。
その後、検索ページを開くため、OpenAsync()メソッドを呼び出しています。
ページを開いたら、formタグのElementを取得し、フォームパラメータ"q"に値をセットしたうえでSubmitします。今回はformが一個しかないので"form"と指定していますが、複数ある場合は"form#login"など、idやclassを指定して目的のタグを取得することもできます。
検索のSubmitを行ったら、QuerySelectorAllで条件に一致するすべてのタグを取得します。取得した結果はLinqでコレクションに格納したのち、呼び元に結果を返します。
実行結果の画面
このプログラムを実行してみると、以下のようになります。
ブラウザでの実行結果と見比べてみると、たしかにgoogle検索の結果をプログラムでスクレイピングできたことが確認できます。
One thought on “[C#]AngleSharpで、フォームに値を入力してページ遷移する”