Yahoo Japanのウェブ検索API

昨今、Web2.0がもてはやされている中、Yahoo Japanも昨年末からウェブサービスを始めた。Yahooにクエリを投げるとXMLでデータを返してくれる。
利用方法は以下の手順を踏む。

(1) Yahoo IDを取得する
http://edit.yahoo.co.jp/config/eval_register
(2) アプリケーションIDを取得する
http://developer.yahoo.co.jp/
(3) 上記アプリケーションIDを使用してアプリを作成する。

これで作成可能。ご親切にもプログラムのサンプルも用意してくれているから基本的にそれを使えばOK。でも、何度も使うものなので、クラス化してみた。



<?php
class YahooWebSearch
{
var $reqURL=’http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch';
var $appID;
var $phrase;
var $dom;
var $format =’html';
var $start =’1′;
var $results=’5′;
var $similar=’0′;

function YahooWebSearch($appID){
$this->appID=$appID;
return true;
}

function setPhrase($phrase){
$this->phrase=mb_convert_encoding($phrase,’UTF-8′,’EUC-JP’);
return true;
}

function setFormat($format=’html’){
$this->format=$format;
return true;
}

function setStart($start=’0′){
$this->start=$start;
return true;
}

function setResults($results=’10’){
$this->results=$results;
return true;
}

function setSimilar($similar){
$this->similar=$similar;
return true;
}

function getResults(){
if(strlen($this->appID)==0 || strlen($this->phrase)==0){
return false;
}else{
$query=$this->buildQuery($this->phrase,$this->appID,$this->format,$this->start,$this->results,$this->similar);
$xml=file_get_contents($this->reqURL.$query);

if(!$dom=domxml_open_mem($xml,DOMXML_LOAD_PARSING,$error)){
return false;
}else{
$res=$this->xml2result($dom);
$yahooArray=array();
for($i=0;$i<(int)$this->results;$i++){
if(!isset($res[$i])){
break;
}else{
$yahooLines=$res[$i];
$lineArray[‘Title’]=$yahooLines[‘Title’];
$lineArray[‘Summary’]=$yahooLines[‘Summary’];
$lineArray[‘Url’]=$yahooLines[‘Url’];
$yahooArray[]=$lineArray;
}
}
return $yahooArray;
}
}
}

function buildQuery($phrase,$appID,$format,$start,$results,$similar){
$q=’?query=’ . $phrase;
$q.=’&appid=’ . $appID;
$q.=’&format=’ . $format;
$q.=’&start=’ . $start;
$q.=’&results=’ . $results;
$q.=’&similar_ok=’. $similar;
return $q;
}

function xml2result($dom) {
$root = $dom->document_element();
$res[‘totalResultsAvailable’] = $root->get_attribute(‘totalResultsAvailable’);
$res[‘totalResultsReturned’] = $root->get_attribute(‘totalResultsReturned’);
$res[‘firstResultPosition’] = $root->get_attribute(‘firstResultPosition’);
$node = $root->first_child();
$i = 0;
while($node) {
switch($node->tagname) {
case ‘Result':
$subnode = $node->first_child();
while($subnode) {
$subnodes = $subnode->child_nodes();
if(!empty($subnodes)) foreach($subnodes as $k=>$n) {
if(empty($n->tagname)) $res[$i][$subnode->tagname] = mb_convert_encoding(trim($n->get_content()),’EUC-JP’,’UTF-8′);
else $res[$i][$subnode->tagname][$n->tagname]=mb_convert_encoding(trim($n->get_content()),’EUC-JP’,’UTF-8′);
}
$subnode = $subnode->next_sibling();
}
break;
default:
$res[$node->tagname] = trim($node->get_content());
$i–;
break;
}
$i++;
$node = $node->next_sibling();
}
return $res;
}
}
?>

で、これを以下のようにして動かす。
<?php
require_once(‘YahooWebSearch.class.php’);
$obj=new YahooWebSearch(‘fishup’);
$obj->setPhrase(‘釣り’);
$result=$obj->getResults();
var_dump($result);
?>
超簡単。ただしレスポンス取得に時間がかかるのが難点なので、取得したデータはキャッシュしておく必要があるだろう。
何はともあれこれは使える!。他のサービスもクラス化してみることにする。

1件のコメント

  1. 双数姉妹HPリリースノート :

    PHPにdomxmlモジュールをインストールしてみる

    Yahoo! デベロッパーネットワークでサンプルを作ろうとしていたのだが、「xm…

コメントを残す


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net