第4回 Webサービスって実はこんなに簡単作って学ぶ、今どきのWebサービス(2/2 ページ)

» 2007年03月02日 08時00分 公開
[はてな 伊藤直也,ITmedia]
前のページへ 1|2       

LWPとXML::SimpleでYahoo! Search Web Servicesを料理する

 それでは具体的にPerlで検索のアプリケーションを書いてみましょう。任意の検索語句を渡すと、その検索結果のタイトルを10件出力するという(実行例1)、簡単なコマンドラインアプリケーションです。コードはリスト3のようになります。


$ perl yahoosearch.pl はてな
はてな
はてなダイアリー- キーワードでつながる面白ブログ
はてなアンテナ
はてなへの住所登録の義務化撤回について
はてな義援金窓口
「日本人にはBlogより日記」、はてなの人気に迫る- CNET Japan
はてなグループ
はてな- Wikipedia
はてな?
はてな検索

実行例1 検索結果のタイトルを10件ほど出力するアプリケーション

#!/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"; }
リスト3 Yahoo! Search Web Servicesを利用するアプリケーション

 今回利用するモジュールは、

  • Jcode
  • LWP::Simple
  • URI::Escape
  • XML::Simple

の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アプリケーションとして検索ページが作れます(このあたりは今後解説したいと思います)。

Yahoo::Searchでよりお手軽に

 さて、リスト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"; }
リスト4 Yahoo::Searchを使った場合

SOAPとREST

 ところで、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サービスを題材にしたいと思います。

このページで出てきた専門用語

Jcodeは文字コードを変換するために利用します

Perl 5.8ではこれまでEncodeモジュールを利用するのが一般的だったがEncodeのラッパーモジュールとしてJcode 2.xも利用可能だ。こちらの方が使いやすいので、今後は日本語の変換にはJcodeを使っても良いだろう。

このモジュールを使うと

コンストラクタに渡しているそれぞれのパラメータの説明は、Yahoo::Searchのperldocかsearch.cpan.orgのドキュメントを参照してほしい。


本記事は、オープンソースマガジン2005年8月号「作って学ぶ、今どきのWebサービス 第2回」を再構成したものです。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ