.NET Tools
Googleをプログラムから呼び出す

1.まずは動作確認をしてみる

(株)ピーデー
川俣 晶
2002/06/18
Page1 Page2 Page3

 まず、軽く動作確認するために最低限のコードを書いてみよう。フォームをダブル・クリックしてフォームのLoadイベントのハンドラを追加し、その内部に以下のようにコードを書き込んでみよう。

  1: private void Form1_Load(object sender, System.EventArgs e)
  2: {
  3:     GoogleSearchService google = new GoogleSearchService();
  4:     GoogleSearchResult r = google.doGoogleSearch(
  5:         "ここはあなたのライセンス・キーに書き換える",
  6:         "Web Service", 0, 5, true, "", false, "",
  7:         "UTF-8", "UTF-8");
  8:     foreach( ResultElement elem in r.resultElements )
  9:     {
 10:         Console.WriteLine( elem.URL );
 11:     }
 12: }
Google Webサービスの動作確認のためのコード
フォームをダブル・クリックすると自動作成されるForm1_Loadメソッドを、このコードのように書き換える。

 これを実行するとVS.NETの出力ウィンドウに以下のような文字列が表示されるだろう。もちろん、検索を実行する時期によって、結果が変化するのは正常な動作である。

http://www.w3.org/TR/wsdl
http://cain.ulst.ac.uk/
http://www.xml.com/pub/a/2002/03/20/endpoints.html
http://www.sws-wis.com/
http://www.rapidhost.net/
上記のコードを実行するとVS.NETの出力ウィンドウに表示される実行結果

 では、ソース・コードを説明しよう。

 上記ソース・リストで、3行目に出現するGoogleSearchServiceというクラス名は、GoogleSearchService.csで定義されているもので、Webサービスのインターフェイスを用いてGoogleにアクセスする機能を持つ。このクラスには、いくつものメソッドが含まれているが、単に使うだけなら中身を気にしなくてもよい。重要なことは、このクラスの特定のメソッドを呼び出すと、はるか遠くにあるGoogleサーバと通信してくれる、という機能を把握することである。

 具体的にGoogleにより提供される機能は主に3つある。

  • 1つ目は、検索そのものを行う機能である。これはdoGoogleSearchメソッドを呼び出すことで実現される。

  • 2つ目は、Googleがキャッシュしているページ情報にアクセスする機能である。これはdoGetCachedPageメソッドを呼び出すことで実現される。

  • 3つ目は、単語のスペル・チェックを行い、より適切な単語を推理する機能である。これはdoSpellingSuggestionメソッドを呼び出すことで実現される。

 このうち、最も使う頻度がありそうなものは、最初のdoGoogleSearchメソッドだろう。キャッシュの取得機能は、万一アクセスできないページがあったときに、Googleのキャッシュ情報で表示するようなWebブラウザを作成するのに有益かもしれないが、簡単なプログラムで試すには向かない用途だ。そして、スペル・チェックの方は、日本語向きの機能とはいいにくい。そのため、ここではdoGoogleSearchメソッドを中心に説明を進めたいと思う。

 では、doGoogleSearchメソッドのそれぞれの引数は、どんな意味を持っているのだろうか。第1引数には、Googleのライセンス・キーの文字列を指定する。第2引数には、問い合わせる検索文字列を指定する。第3引数には、何番目の項目から結果を返すかを指定する。第4引数には、何個の結果を返すかを指定する。

GoogleSearchResult r = google.doGoogleSearch(
    "ここはあなたのライセンス・キーに書き換える",
    "Web Service",
    0, 5,
    true,
    "",
    false,
    "",
    "UTF-8",
    "UTF-8");

 いうまでもなく、Googleは膨大な情報を持っていて、指定条件によっては、数万件規模でヒットする場合も珍しくない。しかし、1回のメソッド呼び出しで数万件分の情報を取得することに、ほとんど実用性はあり得ない。すべての情報が必要とされることはめったにないからだ。このような場合、通常は、最初の呼び出しで1番目から10番目の結果を取得し、2回目の呼び出しでは11番目から20番目というふうに、少しずつ結果を取得する。ここでは、第3引数と第4引数の組み合わせでそれを実現する。最初の結果から10個の結果を取得するなら、第3引数が0で、第4引数が10になる。ただし、筆者が試したときには、第4引数を10にするとエラーになるケースがあったので、サンプル・ソースは第4引数を5としている。

 第5引数には、似たような結果を取り除くフィルタを使うかどうかをbool型の値で指定する。第6引数には、制限情報を記述する。国名や、そのほかのキーワードを指定する。詳しくはGoogle Web APIs(beta)に含まれている「Google Web APIs Reference」を見ていただきたい。

 第7引数には、安全な検索(アダルト・サイトを排除)を行うかどうかをbool値で指定する。第8引数には、言語情報を指定する。Googleを普通に使うと、「ウェブ全体から検索」「日本語のページを検索」という選択肢があるが、これに相当するものである。詳しくはGoogle Web APIs(beta)に含まれている「Google Web APIs Reference」を見ていただきたい。第9引数と第10引数には、それぞれ、入力と出力に用いられる文字エンコーディング名を指定する。.NET Framework環境なら、どちらもUTF-8にしておけば、まず問題はないだろう。無指定だと日本語が通らないことになる。

 さて、引数が分かっただけでは不十分である。結果の意味が分からなければ、呼び出す意味がない。doGoogleSearchメソッドの戻り値はGoogleSearchResultクラス型である。このクラスはresultElementsというプロパティを持っており、これがResultElementクラス型の配列を値として持つ。この配列は検索された結果の数と同じだけの要素を持つ。つまり、ResultElementクラス型のインスタンス1個が、発見されたサイトの情報を1個持つ。この数は第4引数で指定した数と一致するとは限らない。第4引数が10であっても、該当するサイトが5件しか見つからなければ、配列の要素数は5となる。

 ResultElementクラス型に含まれる主要なメンバーは以下のとおりである。“summary”は要約を含む(現バージョンでは中身が何もないようである)。“URL”は発見したページのURLを含む。“snippet”は、発見したページの中で、指定した単語が使用されている前後を抜き出したHTML文書の断片である。“title”はページのタイトルである。

 さて、これだけの情報があれば、Googleを利用する簡単なプログラムを作ることができるだろう。

日本語を通すために

 実はこのままでは、英語の検索はできるのだが、日本語が通らない(日本語のキーワードで検索できない)ことが知られている。HTTPプロトコルでSOAPメッセージを送信する場合、.NET Frameworkのデフォルトでは、コンテンツ・タイプとして“text/xml; charset=utf8”が使用されるが、GoogleのWebサービスで日本語の検索文字列を使用する場合には、なぜかこれを“text/xml”に変更してやる必要があるようだ(まだサービスがベータ版であるが故の問題と考えられる)。

 この問題への対応策は、@ITにあるInsider.NET会議室などから得ることができるので参考にしていただきたい(次で紹介しているサンプル・プログラムでも、この会議室にあるコードを利用させていただいている)。具体的には、「GoogleSearchService.cs」ファイルに少々手を加える必要がある。


 INDEX
  [.NET Tools]
  Googleをプログラムから呼び出す
   1.まずは動作確認をしてみる
     2.Google監視ツールを作ってみた
 
インデックス・ページヘ  「.NET Tools」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間