« Highslide JSを自宅サーバにインストールしてみる | メイン | PHPにdomxmlモジュールをインストールしてみる »

Yahoo! デベロッパーネットワークで遊んでみる



検索サービスで順位を調べる仕組みができないかと思いYahoo! デベロッパーネットワークで遊んでみる。あるようで無かったなぁって感じの仕組みが作れるかも。

Yahoo!デベロッパーネットワークは、開発者がXMLやRSSなどの技術を利用して、自分のサイトやアプリケーション(skills)をYahoo!検索(ingredients)と融合するお手伝いをします。
とのこと。とりあえず、
WEBアプリにクエリーを送る
 ↓
検索結果がXMLで送られてくる
 ↓
phpで解析して表にする
これを目標に。

Yahoo! デベロッパーネットワークへ行き、

Yahoo!デベロッパーネットワーク→アプリケーションIDの登録
でアプリケーションIDを登録。
Yahoo!デベロッパーネットワーク→Yahoo!検索→ウェブ検索
によると、
http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch
に指定されたクエリーを送ると検索結果が送られてくるとのこと。
まだ日本語処理は後にして適当な検索語(とりあえず「wii」で)でクエリーを送ってみる。

http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?appid=あなたのID&query=wii
おぉ。xml形式で検索結果が出るじゃありませんか。すばらしい。 でも問題はここから...。私xmlにあたるの初めて。

さて、phpでxmlを解析するにはどうすれば?
ここ(http://www.it-top.biz/yjws/doc/yjws3/)を参考にしてみるがウチの環境では「xmldom」が入っていないので使えない?!phpを再コンパイルするはめに?めんどくせぇなぁ。何か簡単な方法ないかなぁ...。

なのでxmlをphpで解析することのみを調べてみる。すると「xml_parse_into_struct()」って便利な関数があるじゃないですか。ここ(http://www.phpoo.net/index.php?p=function.xml-parse-into-struct.html)を参考に見様見まねでスクリプトを組んでみる。

$url = "http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?
appid=$id&results=10&query=".$query;//実際は改行なし
//xmlを取得
if(!($content = file_get_contents($url))){
print "失敗";exit;
}
// XMLデータを配列に格納
$xml_parser=xml_parser_create();
xml_parse_into_struct($xml_parser,$content,$vals,$index);
xml_parser_free($xml_parser);
print_r($index);
print_r($vals);

結果の抜粋。

$indexの値

Array
(
[TITLE] => Array
(
[0] => 2
[1] => 18
[2] => 34
)
)

$valsの値

Array
(
[2] => Array
(
[tag] => TITLE
[type] => complete
[level] => 3
[value] => Wii [ウィー]
)
※3-18番目の要素は省略
[18] => Array
(
[tag] => TITLE
[type] => complete
[level] => 3
[value] => Wii.com
)
※19-34番目の要素は省略
[34] => Array
(
[tag] => TITLE
[type] => complete
[level] => 3
[value] => 任天堂「Wii」のニュース、ソフト発売予定、本体スペック・機能紹介など ~ N-Wii.net ~
)
※最後の要素まで
)

なるほど、配列$index[$index['TITLE']]の0番目の値が「2」だから配列$valsの2番目の配列が検索結果の2番目を指すということか。
$vals[$index['TITLE'][0]]['value']]が「Wii [ウィー]」、$vals[$index['TITLE'][1]]['value']]が「Wii.com」、$vals[$index['TITLE'][2]]['value']]が「任天堂「Wii」のニュース、ソフト発売予定、本体スペック・機能紹介など ~ N-Wii.net ~」ということですね。配列$indexから配列$valsを参照して何とか値がとれそうだ。
さしあたって欲しい値は検索結果のタイトルとURLでいいや。

foreach ($index as $key=>$val) {
if($key == 'TITLE' || $key == 'URL'){
foreach ($val as $tmpkey=>$tmpval) {
$result[$tmpkey][$key]=$vals[$tmpval]['value'];
}
}
}

として、$resultに格納する。
おかしい。URLがずれている...。1個飛びにずれている。

<Result>
<Title>Wii.com</Title>
<Summary>
任天堂 , 製品とサービス任天堂 , Nintendo (以下省略)
</Summary>
<Url>http://wii.com/</Url>
<ClickUrl>
http://wrs.search.yahoo.co.jp/l=WS1/R=2/IPC=jp/SHE=0/H=1/;_ylt=A8vY(以下省略)
</ClickUrl>
<ModificationDate>1168527600</ModificationDate>
<MimeType>text/html</MimeType>
<Cache>
<Url>
http://wrs.search.yahoo.co.jp/l=WS5/R=2/;_ylt=A8vY5mfA1L(以下省略)
</Url>

<Size>1875</Size>
</Cache>
</Result>
xmlのソースを見ると<Url>が2ヶ所ある。xml_parse_into_struct()で取得した配列を見ると$index['TITLE']は10個なのに$index['URL']は倍の20個になっている。1個飛ばしで取得したい値が入っているようだ。
$j=0;
for($i=0;$i<count($index['URL']);$i+=2){
	$index['TMPURL'][$j]=$index['URL'][$i];
	$vals['TMPURL'][$j]=$vals[$index['URL'][$i]]['value'];
	$j++;
}
うん。美しくないなぁ。もっといい方法があると思うんだけどとりあえず値は取れたんでいいや。

参考URL:
http://kosugi-houseidori.net/log/eid172.html
http://www.ip-network.org/2005/12/yahoo.html
http://netcal.blog7.fc2.com/blog-entry-270.html
http://buzei.blog33.fc2.com/blog-entry-4.html
http://d.hatena.ne.jp/rytich/20061012/1160659088
http://www.nnistar.com/archives/200512180135.php
Ogawa::Memoranda
深追い.com
一語で検索


トラックバック

このエントリーのトラックバックURL:
http://www.duelsisters.com/cgi-bin/mt/mt-tb.cgi/18

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2007年01月26日 03:37に投稿されたエントリーのページです。

ひとつ前の投稿は「Highslide JSを自宅サーバにインストールしてみる」です。

次の投稿は「PHPにdomxmlモジュールをインストールしてみる」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

スポンサードリンク

人気blogランキングへ