PHPからBing Search APIを使って画像を収集する

More than 1 year has passed since last update.

(2016/11/18追記)

Bing Search APIの無料利用は2016年12月をもって終了するようです。そのため本記事の方法は利用できなくなる見込みです。


無料の検索API

検索と言えば「ぐぐる」のGoogleが有名ですが、検索結果を使って何かしたいときに使えるGoogle Custom Search APIは無料では100リクエスト/日で若干使いづらいところがあります。

そんなときには、5,000リクエスト/月のMicrosoftのBing Search APIの方がちょこっと多めに使えます。


Bing Search APIを使う準備


  1. Microsoftアカウントを作る



  2. Azure Marketplaceで無料の「5000トランザクション/月」のプランにサインアップする




  3. Azure Marketplaceのマイアカウントのアカウントキーでキーの値を取得する




Bing Search APIをPHPから使ってみる

まずは下のサービスエクスプローラで検索条件を検討します。

ここでは「修造」というキーワードの画像を収集してみます。「Image」タブを開いてパラメータをこうしてみます。


  • Query: 修造

  • Options: (空のまま)

  • Market: ja-JP

  • Adult: Strict

  • Latitude: (空のまま)

  • Longitude: (空のまま)

  • ImageFilters: Size:Medium

そして「適用」ボタンを押すと、「現在表示されているクエリの URL:」のURLが更新されるのでコピーしときます。

https://api.datamarket.azure.com/Bing/Search/v1/Image?Query=%27%E4%BF%AE%E9%80%A0%27&Market=%27ja-JP%27&Adult=%27Strict%27&ImageFilters=%27Size%3AMedium%27

Bing Search APIではこのURLに対してBasic認証でGETでアクセスすると結果を取得できます。デフォルトだとXMLなので↑のURLに「&$format=json」を追加します。

<?php

$url = 'https://api.datamarket.azure.com/Bing/Search/v1/Image?Query=%27%E4%BF%AE%E9%80%A0%27&Market=%27ja-JP%27&Adult=%27Strict%27&ImageFilters=%27Size%3AMedium%27&$format=json';
$username = '';
$password = 'アカウントキー';

$option = array(
'http' => array(
'method' => 'GET',
'header' => 'Authorization: Basic ' . base64_encode($username . ':' . $password),
),
);
$context = stream_context_create($option);
$result = file_get_contents($url, false, $context);
var_dump(json_decode($result, true));

これの実行結果がこんな感じになります。

array(1) {

["d"]=>
array(2) {
["results"]=>
array(50) {
[0]=>
array(11) {
["__metadata"]=>
array(2) {
["uri"]=>
string(150) "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Image?Query='修造'&Market='ja-JP'&Adult='Strict'&ImageFilters='Size:Medium'&$skip=0&$top=1"
["type"]=>
string(11) "ImageResult"
}
["ID"]=>
string(36) "bab2ccce-3a35-41fb-8af0-58510888c74c"
["Title"]=>
string(12) "松岡修造"
["MediaUrl"]=>
string(79) "http://www.officiallyjd.com/wp-content/uploads/2013/01/20130112_ichihara_15.jpg"
["SourceUrl"]=>
string(65) "http://www.officiallyjd.com/archives/209179/20130112_ichihara_15/"
["DisplayUrl"]=>
string(57) "www.officiallyjd.com/archives/209179/20130112_ichihara_15"
["Width"]=>
string(3) "480"
["Height"]=>
string(3) "345"
["FileSize"]=>
string(5) "23667"
["ContentType"]=>
string(10) "image/jpeg"
["Thumbnail"]=>
array(6) {
["__metadata"]=>
array(1) {
["type"]=>
string(14) "Bing.Thumbnail"
}
["MediaUrl"]=>
string(77) "http://ts1.mm.bing.net/th?id=OIP.M38c05c8bf108c9a9978bf09f6d2f4010o0&pid=15.1"
["ContentType"]=>
string(9) "image/jpg"
["Width"]=>
string(3) "300"
["Height"]=>
string(3) "215"
["FileSize"]=>
string(4) "9142"
}
}
[1]=>
(中略)
}
["__next"]=>
string(156) "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Image?Query='%E4%BF%AE%E9%80%A0'&Market='ja-JP'&Adult='Strict'&ImageFilters='Size:Medium'&$skip=50"
}
}

一度に得られる結果は最大50件になります。次の結果を得たい場合は__nextのURLにアクセスします。