あまつぶ

5.15 【Google Web API】

 昨日は雨で中止。調子いいときの雨は、なんか悔しい感じ(笑)。

 予定どおりGoogle。
 今回は、Google Web APIsの話。これはGoogleの検索を自分で作ったアプリケーションに組み込めるというもので、現在はβ版ということで誰でも無料で使用できる。使用するためには、開発キットをダウンロードして、上記ページからアカウントを登録する。そうすると、APIを使うためのキーが送られてくるので、プログラムの中にそのキーを埋め込む。と、まあこんな感じ。
 βテスト中ということもあり(?)、利用にはいくつか制限がある。例えば、一度に検索できるのは10件までとか、1日に検索できる回数は1000回まで、利用は個人利用のみ、などなど。詳しくは上記ページに書いてあるので、興味のある方はどうぞ。

 Google Web APIは、Java、Perl、Visual Studio .NETから利用できるらしい。うちで使うならJavaかPerlだけど、とりあえず、すぐに結果が見れるということでPerlを試してみる。
 PerlでGoogle Web APIを使うには、先に準備がいる。SOAPと呼ばれる技術(って呼び名が正しいのかどうかよくわからないけど)を使っているので、これが使えるようにしてやらないといけないのだ。そのためには、Web services for Perlから「SOAP::Lite」というモジュールをインストールする必要がある。
 インストールは、上記ページの「INSTALLATION」にあるように、Terminalで「perl -MCPAN -e shell」とし、「install SOAP::Lite」を実行する。初めて実行するとファイルのダウンロード元などいろいろな質問をされるが、それは勘で答える(そんなんでいいのか(汗))。私が試したところでは、Perl 5.8なんかも一緒にインストールされた。と、ひとつ忘れていた。このままだと最後のインストールに失敗する時があるみたい(アクセス権の関係かな)なので、失敗した場合は、「~/.cpan/build/SOAP-Lite-x.xx」ディレクトリに移動して、「sudo make install」で管理者パスワードを入力してインストール。

 さて、ここまできたら準備完了……かと思うと、まだ少し準備がいる(たぶん)。Google Web APIで日本語を使用するためには、文字コードをUTF-8にしてやらないといけないのだ。そのために、「Jcode.pm」をインストールする。インストール方法は上の「SOAP::Lite」と同じで、「install Jcode.pm」とするだけだ。Perl 5.8以降ではEncodeモジュールでUTF-8を扱うことができるらしいけど、使い方がよくわからなかったので……。

 いよいよGoogle Web APIに挑戦。なにかおもしろそうなネタはないかな……と考えていたら、前に書いた「あ」で検索を思い出した。これを使えば、いちいちGoogleのフォームから手作業で検索しなくても「すべてのひらがなで検索!」を機械的に実行することが可能ではないか。
 そうとなれば、早速プログラムを書く。長いけど、久しぶりのソース掲載。

 grank.pl
#!/usr/local/bin/perl
# grank.pl

# Googleキー(取得したものを入れてください)
my $google_key='...';

# WSDLを指定する
my $google_wsdl = "./GoogleSearch.wsdl";

use strict;

# モジュールを読み込む
use SOAP::Lite;
use Jcode;

# Google Web APIを使うためのおまじない
my $google_search = SOAP::Lite->service("file:$google_wsdl");

# 標準入力から検索文字列を得る
my $query;
my $search_key;

# 文字列分だけ繰り返す
while ($query = <>)
{
  $search_key = jcode($query)->euc;
  chomp($search_key);
  
  # UTF-8にする
  $query = jcode($query)->utf8;
  
  # Query Google
  my $results = $google_search ->
    doGoogleSearch(
      $google_key, $query, 0, 1, "false", "", "false",
      "", "UTF-8", "UTF-8"
    );
  
  # なにも見つからなかった
  @{$results->{'resultElements'}} or print "$search_key\t0\t\n";
  
  # Loop through the results
  foreach my $result (@{$results->{'resultElements'}}) {
    # 見つかった数と、1件目のURLを出力
    print "$search_key\t$results->{'estimatedTotalResultsCount'}\t" .
      "$result->{'URL'}\n";
  }
}

 検索したいキーワードを改行(LF)で区切ったものを作成してテキストファイルとして保存しておき、Terminalで「perl grank.pl <作成したファイル>」とすればそれぞれのキーワードを検索して、見つかった件数と1件目に見つかったページのURLを表示してくれる。リダイレクトでファイルに保存したり、後ろに「 | sort -nr +1」として多い順にしたり、なんてこともできる。

 検索の結果は、前回と同じく、「の」が最も多くて6億5500万件。ずいぶん増えたなぁ。その後の順位も変わらず、下の方からも、「ゎ」「づ」……で、こちらもかわりなかった。
 かわりなし……ではおもしろくないので、他のものも試してみる。例えば、URLに含まれる文字列で、「.htm」と「.html」はどっちが多いか……とか。「inurl:.htm」「inurl:.html」と書いたファイルで試してみると、「.htm」は3億800万件で、「.html」は4億6700万件。URLの途中にこれらの文字が出てきている可能性もあるから正確ではないだろうけど、HTMLファイルの拡張子は「.html」が若干優勢なのかもしれない(他に、cgi、asp、txtも調べてみたら、それぞれ、1億1000万件、1億2100万件、3670万件であった)。
 検索対象はテキストファイルで好きに指定できるのでいろいろと試すことができそうだ。あるいは、定点観測的に、ある特定の言葉のヒット数がどう変化するかを調べるっていうこともできそう。またなにかネタを思いついたらいろいろいじってみようかな。

May 3, 2003 ↑ 2003 index → May 25, 2003