前回はひとつのキーワードでしか検索結果を取得することができませんでした。今回は複数行入力することで複数の検索ワードを調べることができるようにします。また検索結果をテキストファイルに保存します。

やっていることは前回とほとんど変わりません。ただWebBrowserコントロールがページを読み込まないと処理がはじまらない、どうしてもページにアクセスするためのメソッドと読み込みが完了したときに実行されるメソッドが異なるという事情でわかりにくくなるためにクラスとして独立させました。処理が完了したら自分で定義したイベント(GotSearchResult)で結果をForm1に知らせます。

追加した機能としてはヒット件数も取得できるようにしています。

それから実際に動作させてみると時間がかかります。そこでプログレスバーを表示させます。プログレスバーは2種類、ひとつは全検索ワードのうちどれだけ完了したか、もうひとつはひとつの検索ワードの調査のうち、どれだけ完了したかです。

それから前回のアプリでは処理中はアプリケーションがフリーズしたようになってしまう(思った以上に時間がかかるときでも終了させることができない)ので、そうはならないように対策をします。

WebBrowserTempクラスのコンストラクタを示します。引数で表示させるプログレスバーを渡しています。

検索してページを解析して結果を取得するためのメソッドを示します。前回とほとんど同じです。

上記メソッド内でつかわれているSiteInfoクラスは前回のものと同じです。

ページの読み込みが完了したときのイベントハンドラを示します。処理が進行するにしたがってプログレスバーのバーを進めています。

非同期処理をしているので「コントロールが作成されたスレッド以外のスレッドからコントロール ‘_progressBar2’ がアクセスされました」という例外が出ないようにInvoke((Action)(() => { }));を使用しています。

Form1側での処理を示します。

調査したい検索ワードをRichTextBoxに入力して[開始]のボタンをクリックすると結果を保存するフォルダを選択するダイアログが表示され、OKが選択されると処理がはじまります。

処理は空白行がないかチェックして、あとは一行ずつ検索しています。検索するときはWebBrowserTempオブジェクトを生成して処理がおわったときに発生するGotSearchResultイベントを処理できるようにしています。そしてSearchメソッドで実際に検索の処理をおこなっています。

またサーバーに負荷をかけないようにリクエストは5秒おきにしています。

検索結果を取得するSaveFilesSearchResultメソッドを示します。

GotSearchResultイベントが発生したらテキストファイルに保存する文字列を取得できたということなので、これをファイルに保存します。