PythonとBing Search APIで画像検索、あと画像ファイルのダウンロード

Pythonで画像検索をしたかったので、Bing Search APIを使ってみました。GoogleよりもBingの検索用APIの方が使いやすいみたいですね。BingのAPIは無料で月5,000回までリクエストできます。Googleは良くわからん。

無料で使える画像検索APIとリクエスト数制限まとめ – Qiita

Bing Search API | Microsoft Azure Marketplace

Bing Search APIのドキュメントは探しにくかったので、色々なブログの記事を参考にさせていただきました。

Bing Search APIを使ってWeb検索を行うには(Json編) | garicchi.com

PythonでBing Search APIを使って画像を検索する | BTY備忘録

Using Bing Search API in Python | A Blog for Life

Bing Search APIのアカウントキーの入手

bing search api

Bing Search APIを使うために、Microsoftから発行されるキーが必要になるので作ります。Azure Marketplaceにアクセスして、アカウントが無い場合はアカウントの作成、アカウントが有ればログインします。

Azure Marketplace | Microsoft Azure

bing search api

ログイン後、アカウント情報の画面を開きます。Bing Search APIを叩く時、ここに表示されている「プライマリアカウントキー」が必要になるので、どこかにメモしておきます。

bing search api

5,000トランザクション/月の月額0円のやつにサインアップします。5,000トランザクションを超えても勝手に課金されずに動かなくなるだけ…だと思いますが確認してません。

これで取得したプライマリアカウントキーが有効になりました。このキーを使ってBing Search APIを叩いていきます。

PythonでBing Search APIを叩く

Pythonを使ってBing Search APIを叩いていきます。スクリプト全体はGitHubに公開したので、とりあえずポイントだけ。

リクエスト用のURLを作って、Authオブジェクトと共にrequests.get()に渡してあげれば検索結果が返ってきます。

いろいろ検索オプションがあるんですが、Marketでは言語、Adultではエロコンテンツのフィルタリングを設定できます。topは結果の件数を指定できます。最大50件までです。下位の結果を得るためには、skipを使うのだと思います(ドキュメントを探して読んでください)。

requests.auth.HTTPBasicAuth()に先ほど作成したプライマリアカウントキーを渡してあげると認証されます。あらかじめ、BING_API_KEY=”hogehoge”みたいな感じで変数を作っておきましょう。

#リクエストURL手作り
search_url = 
    BING_API_URL + search_type + 
    '?Query=%27' + urllib2.quote(search_query) + 
    '%27&Market=%27' + urllib2.quote(search_market) + 
    '%27&Adult=%27' + urllib2.quote(search_adult) + 
    '%27&$top=' + str(search_top) + 
    '&$format=json'≈

#Authオブジェクト作成
auth = requests.auth.HTTPBasicAuth('', BING_API_KEY)

#検索実行
search_response = requests.get(search_url, auth=auth)#リクエストURL手作り
search_url = \
    BING_API_URL + search_type + \
    '?Query=%27' + urllib2.quote(search_query) + \
    '%27&Market=%27' + urllib2.quote(search_market) + \
    '%27&Adult=%27' + urllib2.quote(search_adult) + \
    '%27&$top=' + str(search_top) + \
    '&$format=json'

検索結果をJson形式にデコードします。jsonモジュールをインポートしておけば一発ですね。

search_response_json = search_response.json()

ちなみに、PythonでJsonを使う方法はここに書きました。

PythonでJSON形式のデータを読み込む | Androidアプリ開発@つくばの日記

次に、検索結果から画像URLを抽出します。リストの[‘d’][‘results’]の中に各々のデータがあるので、MediaUrlという要素を一件一件探していきます。

#画像URLをひとつずつ抽出
image_url_list = []
for item in json_data['d']['results']:
    image_url_list.append(item['MediaUrl'])

最後に、抽出した画像URLを使って画像ファイルをダウンロードします。requests.get()で画像をとってきて、名前をつけて保存する作業をファイルの数だけ繰り返し。

os.path.splitext()のところは、拡張子を切り分けてます。これだけだと.jpg?w=600みたいになっているファイルに対応できないので、本当はもう少し工夫した方がいいですね。

#画像ファイルのダウンロード
image_file = requests.get(image_url)
#ファイル名の作成
root, ext = os.path.splitext(image_url)
image_file_name = str(counter) + ext
#ファイルの保存
f = open(image_file_name, 'wb')
f.write(image_file.content)
f.close()

これで、Pythonを使ってBing Search APIを叩けるようになったと思います。

PythonでBing Search APIを叩くスクリプト

完成したPythonのスクリプトはGitHubに公開しておきました。cloneしたりpull requestしたりstarをつけたりしていただけるととても嬉しいです。よろしくお願いします。

python bing_image_search.py oppai

こんな感じで実行します。引数にクエリを与えてあげます。複数のクエリ、日本語にも対応しています(たぶん)。

Downloading http://a-hadaka.jp/wp/wp-content/uploads/2011/12/1888.jpg (1/50)
Downloading http://sukkolo.cocolog-nifty.com/photos/uncategorized/2009/03/27/oppai.jpg (2/50)
(中略)
Downloading http://blog-imgs-40.fc2.com/z/a/h/zahnarzt/image42.gif (50/50)
Done.

実行すると、こんな感じで画像ファイルをダウンロードします。

Downloading http://a-hadaka.jp/wp/wp-content/uploads/2011/12/1888.jpg (1/50)
Downloading http://sukkolo.cocolog-nifty.com/photos/uncategorized/2009/03/27/oppai.jpg (2/50)
(中略)
Downloading http://blog-imgs-40.fc2.com/z/a/h/zahnarzt/image42.gif (50/50)
Done.

時々SSLエラーを吐いて止まることがありますが、ご愛嬌ということでひとつ。

シェアしてもらえるとうれしいです。゚(´っωc`)゚。