tetsunosukeのnotebook

tetsunosukeのメモです

Web検索系のAPIって結構死んでるんだ・・・(BingWeb検索APIを試してみたよ)

RESTとかで使えるAPIを探せ

特定のキーワードで検索して上位3件のデータを取りたい!

みたいなことを思ってWeb検索系のAPIを探してみました。

Yahoo!


そういえばYahoo!の検索が有料になったんだっけとか思ったら、もう終了する予定の模様。

http://developer.yahoo.co.jp/webapi/search/

□提供終了日:
・2013年8月14日
※新規利用の申請については既に終了させていただいております。
※現在ご利用いただいているみなさまは、更新いただくことなく提供終了日までご利用いただけます。

Google

Googleさんは?

https://developers.google.com/web-search/?hl=ja

Note: The Google Web Search API has been officially deprecated as of November 1, 2010. It will continue to work as per our deprecation policy, but the number of requests you may make per day will be limited. Therefore, we encourage you to move to the new Custom Search API.

なんかもうCustomSearchAPI使って世界みたいね。両方共(まあ中身同じだから?)

それではCustomSearchAPIは?

Important: The Google Custom Search API requires the use of an API key, which you can get from the Google APIs console. The API provides 100 search queries per day for free. If you need more, you may sign up for billing in the console.

無料だと1日100回までなのかー。詰んだ。

そもそも自サイト内検索とかが主な目的みたいだしなんか違う気がする。

Bing

最初思いつかなかったけどこんなエンジンもありましたね

http://datamarket.azure.com/dataset/bing/search

ふむ。Windows Azure Marketplaceとやらに登録して利用することができるらしい。こっちは月に5000リクエストまでOKのようだ。Googleよりちょっとだけ多いレベル。

すんごいわかりにくいんだけどページ右側に Bing API Quick Start & Code というのがある。

これを見てみると、.NETとかPHPのサンプルコードが載っていた。

あと、これもまたわかりにくいのだけど、(つかこのテキストリンクなのかよ)

このデータセットの参照
DataMarket サービス エクスプローラーを起動して、データセットを対話形式で参照できます。

を参照すると、実際にどういうURLを叩くとどういう結果が返ってくるか試せる。(トランザクション数がカウントされて減らされるので注意)

例えば

Query: 検索
Markter:ja-JP

を入れると、

こんなかんじのURLになるそうだ。
https://api.datamarket.azure.com/Bing/Search/v1/Web?Query=%27%E6%A4%9C%E7%B4%A2%27&Market=%27ja-JP%27

だが、このURLを直接叩くとベーシック認証を要求される。

このURLはベーシック認証で叩くものらしい。そのキーはといえば、

https://datamarket.azure.com/account/keys アカウントキーというところで取得できる。アカウントキーのくせに、ベーシック認証のID/パスワード両方ともこれらしい。なんだそら。

踏まえてプログラム

サンプルはそのまま動かなかったのでcurlバージョン。

<?php
// 検索したい文字列
$query = "検索";
// アカウントキー
$accountKey = '<key>';
// とりあえずWeb検索に限定。結果はJSONにする。「$format」なので注意。
$ServiceRootURL = 'https://api.datamarket.azure.com/Bing/Search/v1/Web?$format=json';
// ここはとりあえず検索キーワードだけ
// それぞれのパラメータをシングルクォートでくくる仕様
$queryParameters = array(
    'Query' => "'" . $query . "'",
);
$url = $ServiceRootURL. "&" . http_build_query($queryParameters);
$result = curl_get($url, $accountKey);

// 先頭の1件を出力
var_dump($result[0]);

function curl_get($url, $key) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // ID/PWともにアカウントキーなので
    curl_setopt($ch, CURLOPT_USERPWD, $key. ":" . $key);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    $buf = curl_exec($ch);
    curl_close($ch);
    $json = json_decode($buf);
    return $json->d->results;
}
結果
object(stdClass)#3 (6) {
  ["__metadata"]=>
  object(stdClass)#4 (2) {
    ["uri"]=>
    string(91) "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Web?Query='検索'&$skip=0&$top=1"
    ["type"]=>
    string(9) "WebResult"
  }
  ["ID"]=>
  string(36) "b8d565a7-0757-4603-8981-bc139c88e4b8"
  ["Title"]=>
  string(33) "郵便番号検索 - 日本郵便"
  ["Description"]=>
  string(270) "郵便番号検索はこちらから。地図、住所、郵便番号から郵便番号を検索できます。 English サイトマップ よくあるご質問・お問い合わせ ここからサイト内検索です 検索したい文字列を入力してください"
  ["DisplayUrl"]=>
  string(29) "www.post.japanpost.jp/zipcode"
  ["Url"]=>
  string(37) "http://www.post.japanpost.jp/zipcode/"
}