2009年10月07日

rubyでgoogle APIを使った検索

googleのAPIを使って、rubyでweb検索をするプログラムを作ってみた。
rubyの勉強を兼ねているので、けして美しいコードではないが、(自分にとっての)わかりやすさを心がけている。
基本的な考え方は、以下のGoogle AJAX Search APIのデベロッパーガイド「Flash やその他 JavaScript を使用しない環境」にしたがっている。
AJAX Search APIを使う際は、AJAX API KEYをここから取得して、http headerに埋め込まないといけない。
javascriptからの呼び出しでも、埋め込むことが推奨されているが、
省略してもいいようだ。今回は埋め込んでいない。

AJAX APIにHTTPで検索queryを出すと、JSON形式で検索結果のテキストデータが返されてくる。
そこで、JSON形式のデータを簡単に扱えるように、JSON parse libraryとしてsimple-json.rbを使わせてもらった。

googlesearch.rb
require 'simple-json.rb'
require 'kconv'
require 'open-uri'

# 検索URLの作成
search_word = ARGV[0].to_s
for i in 1..ARGV.length-1 do
search_word = search_word + "%20" + ARGV[i]
end
targetUrl="http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q="+search_word

# 検索結果の取得
response=open(targetUrl)
src=response.read
src = NKF.nkf('-wxm0', src)

# 検索結果の解析
result = JsonParser.new
j=result.parse(src)

# タイトルとURLの表示
loop=j["responseData"]["results"].length
printf("Top %d results\n",loop)
printf("-----\n")
for i in 0..loop-1 do
printf("Title: %s\n",j["responseData"]["results"][i]["titleNoFormatting"] )
printf("URL: %s\n",j["responseData"]["results"][i]["url"] )
printf("- - - -\n")
end

# 検索結果件数の表示
printf("estimatedResultCount:%s\n", j["responseData"]["cursor"]["estimatedResultCount"])

使い方は、このプログラムを起動するときに、引数に検索したい文字列を指定する。(複数可)
引数のbase64 encodeなどの考慮をしていないので、2 byteコードは検索ワードに指定できない。

% ruby googlesearch.rb keyword1 keyword2

JSONをparseした際、ハッシュと配列が組み合わさった形でruby objectに収納されるので、ハッシュにハッシュが入っているものにどうやってアクセスするのか、記述方法がわからずに苦労してしまった。
[ ]でくくった添字をつなげていけばいいのだった。
わかってみれば、なんてことない。
出力結果は、以下のとおり。検索ワードにCanonとEOSを指定している。

% ruby googles.rb canon eos
Top 4 results
-----
Title: Canon EOS SLR
URL: http://www.canoneos.com/
- - - -
Title: EOS (SLR) Camera Systems - EOS Digit
al SLR Cameras - EOS 35mm SLR ...
URL: http://www.usa.canon.com/consumer/controller%3Fact%3DModelInfoAct%26fcategoryid%3D139%26modelid%3D10464
- - - -
Title: EOS DIGITAL
URL: http://www.canon.com/eos-d/
- - - -
Title: Canon EOS Beginners' FAQ
URL: http://photonotes.org/articles/beginner-faq/
- - - -
estimatedResultCount:64900000

最後に出るestimatedResultCountは、おおよその検索結果件数であるはずなのだが、webで普通に検索したときの数とは大きな開きがある。
クラスリファレンスの「google.search.Search-プロパティ」に、この値の説明があるが、まぁ、そういうものらしい。
上記と同じ検索ワードcanon eosで、googleのホームページから検索すると、68,300,000件とでる。この程度の差なら問題ないが、webの値に比べてAPIの値が1割ほどの時もあった。
この違いは、なんなんでしょうねぇ。


sylphide_ffr31mr at 20:25コメント(0)トラックバック(0)技術 | programing 

トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
プロフィール

やすき

月別アーカイブ
  • ライブドアブログ