[[ともっくす alloc] init]

ともっくすの雑多な日記と技術的なメモ

Bing Search API を使いたいと思ったのでPythonでラッパーを作ってみた

Yahoo API が使えないので,Bing Search APIを使いたい.

5000トランザクション/月までなら無料で使えるのは素晴らしい.

登録

Bing Search APIのページに行き,右下の5000トランザクション/月のサインアップをクリック.

Microsoft アカウントがあるならそれでサインインし,持っていないなら登録する.

「購入手続き」とか出るが,怖がらずに進める.

キーを確認

Yahoo API とかだと,URLのクエリパラメータにアプリケーションキーを入れたりするわけだが,Bing Search API の場合は,キーをBasic認証に使う.

Basic認証のユーザとパスワードの両方にキーを入力することで,無事にアクセスできる.

キーはここにプライマリアカウントキーとして載っているので,コピー等しておく.

f:id:o_tomox:20130921211103p:plain

使ってみる

https://api.datamarket.azure.com/Bing/Search/Web?Query='京都'にアクセスすると,ユーザとパスワードが聞かれるので,両方にコピーしたキーを入力する.

feedタグを使って記述されているので,RSSリーダーに登録する画面が現れるかもしれないが,ソースを見てみたら,それっぽいのが返ってきてることがわかる.
つまり,デフォルトではXML形式で返ってくる.

https://api.datamarket.azure.com/Bing/Search/Web?Query='京都'&$format=jsonにアクセスすると,今度はjson形式で返ってくる.

他にも$skip=nを指定すればn+1件目から取得でき,$top=nを指定すれば全部でn件取得できる.*1

詳しい使い方はBing API Schema Guideに書かれている.

ラッパー

色々面倒なので,Pythonのラッパーを作った.

調べたら,pybing - PyBing is a Python wrapper for the Bing Search API - Google Project Hostingがあったが,APIの仕様変更で今は使えないので,自作することに.

Gistに載せた.*2 こんな感じ.

追記:
関連クエリも取得できるように更新


Bing Search API のラッパー


使い方は簡単で,キーを指定してBingクラスのインスタンスを生成して,Bing.web_searchメソッドにクエリや取得件数や取得内容を指定するだけで,リストで返ってくる.

APIを叩くときにrequestsモジュールを使ってるので,インストールしていない場合は,インストールが必要.


試しに使ってみると,こんな感じ.

>>> import json
>>> from bing_api import Bing
>>> bing = Bing('<キー>')
>>> results = bing.web_search('京都', 3, ["Title", "Url"])
>>> print json.dumps(results, indent=2)
[
  {
    "Url": "http://www.pref.kyoto.jp/",
    "Title": "\u4eac\u90fd\u5e9c\u30db\u30fc\u30e0\u30da\u30fc\u30b8"
  },
  {
    "Url": "http://ja.wikipedia.org/wiki/%E4%BA%AC%E9%83%BD",
    "Title": "\u4eac\u90fd - Wikipedia"
  },
  {
    "Url": "http://kanko.city.kyoto.lg.jp/",
    "Title": "\u4eac\u90fd\u89b3\u5149\u30aa\u30d5\u30a3\u30b7\u30e3\u30eb\u30b5\u30a4\u30c8 \u4eac\u90fd\u89b3\u5149Navi"
  }
]

上のやつは,"京都"というクエリの検索結果上位3件のタイトルとURLを取得するというもの.

jsonは出力形式をわかりやすくするために使ってるだけで,必ずしも必要なわけではない.


自由に使って下さい.
何かあればコメントにでも.

*1:$topのデフォルトは50で,最大値も50

*2:ブログで載せられるように新たにGitHubアカウントを作った