それでは具体的にPerlで検索のアプリケーションを書いてみましょう。任意の検索語句を渡すと、その検索結果のタイトルを10件出力するという(実行例1)、簡単なコマンドラインアプリケーションです。コードはリスト3のようになります。
$ perl yahoosearch.pl はてな
はてな
はてなダイアリー- キーワードでつながる面白ブログ
はてなアンテナ
はてなへの住所登録の義務化撤回について
はてな義援金窓口
「日本人にはBlogより日記」、はてなの人気に迫る- CNET Japan
はてなグループ
はてな- Wikipedia
はてな?
はてな検索
#!/usr/local/bin/perl
use strict;
use Jcode;
use LWP::Simple;
use URI::Escape;
use XML::Simple;
my $query = shift or die "usage: $0 ";
$query = Jcode->new($query, 'euc')->utf8;
$query = uri_escape($query);
my $url = "http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=********&query=$query&type=all&results=10&start=1&format=any&language=ja";
my $document = LWP::Simple::get($url)
or die "cannot get content from $url";
my $parser = XML::Simple->new;
my $data = $parser->XMLin($document);
for (@{$data->{Result}}) {
print Jcode->new($_->{Title}, 'utf8')->euc , "\n";
}
今回利用するモジュールは、
の4つです。LWPとXML::Simpleは前回解説したとおり。Yahoo! Search Web Servicesでは入力も出力もマルチバイト文字をUTF-8で扱うことになっているので、Jcodeは文字コードを変換するために利用します*。また、URI::EscapeはクエリパラメータをURLエンコードするために利用しています。
特に難しいところはないですね。大枠は前回解説したコードとほとんど一緒です。クエリパラメータ付きのURLを先に組み立てておいて、LWP::SimpleでそれをGET。取得したXML文書をXML::Simpleでパースしてタイトルに当たる個所だけを出力、ということを行っています。
具体例を見て、Webサービスとは何かをつかんでいただけたでしょうか。Webサービスを利用することで、Webを介してXMLをやり取りして、任意のアプリケーションにWebサイトの機能(ここではYahoo!の検索)を取り込むことができました。
ここでは入力をスクリプト実行時の引数、出力を標準出力にしていますが、この入力をWebから、出力をWebに書き換えれば、Webアプリケーションとして検索ページが作れます(このあたりは今後解説したいと思います)。
さて、リスト3ではLWP::SimpleとXML::Simpleを使っていますが、CPANを探すとYahoo::Searchというモジュールが見つかると思います。これはYahoo! Search Web Services専用のモジュールで、Yahoo!社員がCPANに登録しているものです。
LWPとXML::Simpleも良いですが、このモジュールを使うと*、もっとシンプルかつすっきりとしたコードで同じ機能のプログラムが書けます(リスト4)。
URLの組み立てや、XML::Simpleが作った生のデータ構造をたどったりする必要がなくなり、かなり分かりやすくなったと思いませんか? このように、CPANには特定のWebサービス専用のモジュールなどもあるという好例といえるでしょう。
#!/usr/local/bin/perl
use strict;
use Yahoo::Search;
my $query = shift or die "usage: $0 ";
my @Results = Yahoo::Search->Results(
Doc => $query,
AppId => '********',
Mode => 'all',
Start => 0,
Count => 10,
Type => 'any',
Language => 'ja',
);
for (@Results) {
print $_->Title, "\n";
}
ところで、Webサービスに関係する言葉で、SOAP(Simple Object Access Protocol)というものを聞いたことがあるかもしれません。SOAPとは、WebサービスにおけるXML文書交換用のプロトコルのことです。
ここで示したYahoo! Web Search APIではSOAPは利用していません。Yahoo! Web Searchのように、HTTPのGETでURLにアクセスしてシンプルにXML文書を取得するAPIは、REST API(あるいはXML over HTTP)などと呼ばれます。
Google Web APIsはSOAPを採用しています。今回はSOAPによるWebサービスの解説は省略しますが、SOAPによるWebサービスはPerlならSOAP::Liteを使ってHackすると良いでしょう。
今回はGoogleとYahoo!の検索機能に関するWebサービスを題材に解説してきました。しかしながら、実用的なアプリケーションを作ると言いつつも、Web検索の機能をアプリケーションに統合するだけでは、いまいち面白みがありません。工夫次第でいろいろ面白いものが作れるとは思いますが、より実用的なデータをWebサービスで扱いたいところですね。
そこで次回は、Amazon.comが提供するAmazon Webサービスを題材にしたいと思います。
Perl 5.8ではこれまでEncodeモジュールを利用するのが一般的だったがEncodeのラッパーモジュールとしてJcode 2.xも利用可能だ。こちらの方が使いやすいので、今後は日本語の変換にはJcodeを使っても良いだろう。
コンストラクタに渡しているそれぞれのパラメータの説明は、Yahoo::Searchのperldocかsearch.cpan.orgのドキュメントを参照してほしい。
本記事は、オープンソースマガジン2005年8月号「作って学ぶ、今どきのWebサービス 第2回」を再構成したものです。
Copyright © ITmedia, Inc. All Rights Reserved.