タイトルそのままです。PuppeteerSharpをつかって検索結果を取得します。また虫眼鏡ワードも同時に取得します。これによってどのようなキーワードが検索されているかもわかります。

もっともサジェスト汚染をする輩もいるので、これで本当に検索需要があるキーワードが取得できるかどうかはわかりませんが・・・。あとサーバーに過度の負荷をかけないようにほどほどに使うようにしてください。

なぜPuppeteerSharp?

webスクレーピングではSeleniumを使うことのほうが多いかもしれません。しかしSelenium.Chrome.WebDriverを使う場合、アプリを使用しようとしているパソコンにGoogle Chromeがインストールされていないと使うことができません。

またGoogle Chromeはバージョンアップされることがあります。Selenium.Chrome.WebDriverはインストールされているGoogle Chromeのバージョンがあっていないとうまく動きません。Google Chromeが自動的にバージョンアップされてしまい、これに対応したSelenium.Chrome.WebDriverはまだ存在しないとなれば完全にお手上げです。

そこでPuppeteerSharpを使います。これを使う場合、実行ファイルがあるフォルダにGoogle Chromeがダウンロードされます。そのためGoogle Chromeがインストールされていない環境であっても困ることはありません。WebDriverのバージョン問題も気にしなくていいのですが、実行ファイルがあるフォルダの容量が非常に大きくなります。約400MBくらいになりますが、使わないときはファイルを削除するとか、いまでは大容量ハードディスクも安価になっているので気にする必要はないと思います。

PuppeteerSharpを使ってみる

まずは基本的な操作から。

Yahoo!のトップページにアクセスする

これでYahoo!のトップページにアクセスすることができます。

キーワードを入力して検索ボタンを押す

次に検索したいキーワードを入力して検索ボタンを押すためにはHTMLのどの部分に検索窓と検索ボタンがあるかを知る必要があります。F12キーを押して要素を解析してみると、検索窓のXPathは/html/body/div/div/header/section[1]/div/form/fieldset/span/inputであり、ボタンは/html/body/div/div/header/section[1]/div/form/fieldset/span/buttonであることがわかります。

以下の方法で検索したい文字列を入力して検索ボタンを押すことができます。

検索結果を取得する

次に検索結果を表示しているページからページタイトルとurlを取得する方法を考えます。

まずクリックするとそのページへいけるリンクの取得ですが、一発でやろうとしてもうまくいかないので2回にわけます。

これで要素を取得して、このなかからページのタイトルとurlを取得します。

上記で得た配列をforeach文で回して、そのなかからa.sw-Card__titleInnerとh3.sw-Card__titleMain.sw-Card__titleMain–clamp.sw-Card__titleMain–cite.util-Clamps–2を取得します。これでurlとページタイトルは取得できます。

次のページへ移動する

10位まででなくそれ以降の結果も取得するのであれば次のページへのリンクを探してクリックしなければなりません。次のページのリンクは以下のコードで取得できますが、ない場合は例外が発生するので例外処理をしておきます。

次のページへのリンクが見つかったらクリックして、新しいページが読み込まれるまで待ちます。

虫眼鏡ワードを取得する

虫眼鏡ワードの取得方法ですが、ul.Unit__list li.Unit__listItem aで取得できます。もし虫眼鏡ワードがなければなにも取得できないのでmushimeganesのなかは空になっているはずです。空でない場合は重複(ページ上と下部の2箇所に表示されるので重複があるかもしれない)を取り除きます。

アプリをつくる

それでは実際にアプリをつくってみましょう。同時に複数のキーワードを調べられるように改行してキーワードを入力しておけば一気に調べられるものをつくります。

動いていることがわかるようにブラウザは表示させたままにしておきます。非表示にさせたほうが作業の邪魔にならないからよいというのであればHeadless = trueにします。

GetSearchResultメソッドが呼び出されたときの処理を示す前に取得したデータを保存するクラスを作成します。

では、GetSearchResultメソッドが呼び出されたときの処理を示します。https://www.yahoo.co.jp/にアクセスして検索したい文字列を入力して検索ボタンを押します。そして虫眼鏡ワードがあれば取得し、検索結果の総数と今回は30位までのページタイトルとurlを取得します。最後に取得したデータをExcelファイルとして保存します。

Excelファイルはアプリケーションの実行ファイルがあるフォルダの下にoutputというフォルダをつくり、そこに保存します。

検索したい文字列を入力して検索ボタンを押す処理を示します。

検索結果の総数を取得してSearchResultオブジェクト内に格納する処理を示します。

虫眼鏡ワードがあれば取得する処理を示します。

検索結果を表示しているページからページタイトルとurlを取得する処理を示します。実際に処理が進んでいるのか、フリーズしていないかがわかるようにブラウザをスクロールさせ視覚的に処理がおこなわれていることがわかるようにしています。

最後に取得したデータをExcelファイルとして保存する処理を示します。