Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

Google イメージ検索をもっと便利に、見やすくしたい

CPAN新着リストを眺めてたら、WWW::Google::Images なるモジュールを見つけたので、これはおもろげ! ってんでちとごにょってみる。

Google イメージ検索は大変に便利なのですが、数回クリックしないと元画像にたどり着けず(最初は Google がキャッシュしているサムネイル画像が一覧表示される)、また、数十件ごとにページを切り替えて表示してくれるのはたいていの場合において便利ではあるものの、ある言葉について素早くかつざっくりとイメージによって印象を得たいという場合は、一覧で元画像が表示される方がいいかもしれません。そこで、以下に示す通りのスクリプトを書いて、上記の要求に沿って、Google イメージ検索をもっと便利に、また、見やすくしてみるべく試みました。

WWW::Google::Images のソースをざっとみた感じ、内部で WWW::Mechanize モジュールを使って検索結果表示ページをごっそりとってるっぽぃ? んでもって、クエリとして検索語しか送信されないため、日本語を検索すると文字化けしちゃう。ので、以下な感じでクエリをてけとに書き足し(もっとちゃんとしたやり方があると思うけど、 面倒なので決め打ち)。

--- Images.pm.orig   2004-07-23 21:57:34.000000000 +0900
+++ Images.pm    2004-07-30 00:32:18.000000000 +0900
@@ -110,6 +110,8 @@
     $self->{_agent}->submit_form(
         form_number => 1,
         fields      => {
+             ie => "UTF-8",
+             hl => "ja",
             q => $query
         }
     );

というか、単に画像の URI を取ってきてずらずら表示するだけなら特になにもすることはないのですが、まぁそこは Perl 練習中なので…ってんで、以下、CGI スクリプト。

googleimages.cgi

#!/usr/bin/perl

use strict;
use CGI;
use HTML::Template;
use WWW::Google::Images;

# タイトル
my $title = "Google Images";
# 表示する画像の最大数
my $max = 500;

my $query = CGI->new;
my $keyword = $query->param("keyword");
my $limit = $query->param("limit") <= $max ? $query->param("limit") : $max;
my $count;
my @images;

if ($keyword) {
  my $agent = WWW::Google::Images->new(
    server => "images.google.co.jp",
  );
  my $result = $agent->search($keyword, limit => $limit);

  while (my $image = $result->next()) {
    push(@images, {
      URI => $image->content_url(),
    });
    $count++;
  }
}

my $template = HTML::Template->new(filename => 'googleimages.tmpl');
   $template->param(
     TITLE       => $title,
     SCRIPT_NAME => $ENV{SCRIPT_NAME},
     KEYWORD     => $keyword,
     COUNT       => $count,
     IMAGES      => \@images,
   );

print $query->header(-type => "text/html; charset=utf-8"),
      $template->output;

んでもってテンプレ。

googleimages.tmpl

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" media="screen, tv, projection" href="googleimages.css" />
<title><TMPL_VAR NAME="TITLE" DEFAULT="Google Images"></title>
</head>
<body>
<h1><a href="<TMPL_VAR NAME="SCRIPT_NAME">"><TMPL_VAR NAME="TITLE" DEFAULT="Google Images"></a></h1>
<form method="get" action="<TMPL_VAR NAME="SCRIPT_NAME">">
Keyword: <input type="text" name="keyword" value="<TMPL_VAR NAME="KEYWORD" ESCAPE=HTML>" />
limit: <select name="limit">
<option>50</option>
<option>100</option>
<option>200</option>
<option>300</option>
<option>400</option>
<option>500</option>
</select>
<input type="submit" value="送信" />
</form>
<TMPL_IF NAME="KEYWORD">
<p><span class="keyword"><TMPL_VAR NAME="KEYWORD" ESCAPE="HTML"></span>の検索結果: <TMPL_VAR NAME="COUNT" DEFAULT="0"> 件</p>
</TMPL_IF>
<TMPL_IF NAME="IMAGES">
<ul>
<TMPL_LOOP NAME="IMAGES">
<li><a href="<TMPL_VAR NAME="URI">"><img src="<TMPL_VAR NAME="URI">" alt="" /></a></li>
</TMPL_LOOP>
</ul>
</TMPL_IF>
<address>
Google Images<br />
Powered by <a href="http://images.google.co.jp/imghp">Google イメージ検索</a> & <a href="http://search.cpan.org/search?query=WWW%3A%3AGoogle%3A%3AImages&mode=all">WWW::Google::Images</a>
</address>
</body>
</html>

以上を UTF-8 で保存して、必要なモジュールをインストール(例:# sudo perl -MCPAN -e 'install WWW::Google::Images')した後ブラウザで googleimages.cgi にアクセスすると、うまくいけば、以下の通りのページが表示されます(スクリーンショットは、CSS によってデザインを調整済み)。

Google Images スクリーンショット

で、てけとな検索語を入れて送信すると、画像がずらずら表示されたりされなかったりします。

ここで注意を喚起したいのが、ここまで長々と解説しといてなんですが、このスクリプトを個人的に利用すること、ましてや一般に公開するサービスとして提供することは、多分かなりと絶対に、規約的・著作権法的にヤバいと思われるので、あくまでもこゆのもあるんだなぁという、純粋に学術的な実験あるいは観賞用の文章として、このエントリを読んでいただきたく存じますよ。