諸事情で検索機能が必要になったので、検索系のAPIの中で一番手軽に扱えそうな(とは言ってもそれほど差はありませんが)Bing Search APIを使ってみました。

APIキーの取得

まずは以下のサイトにアクセスします。
http://datamarket.azure.com/dataset/bing/search
5000トランザクション/月までなり無料で利用できるので、適当に登録を済ませて「マイアカウント」→アカウント情報からプライマリアカウントキーを取得します。

実行してみる

https://datamarket.azure.com/dataset/bing/search
基本的に、ここから「このデータを参照」をクリックして飛べるエクスプローラーで適当に試してみて、いい感じのパラメータを適当に与えてやれば動きます。
とは言っても、それだけでは説明不足なので主なパラメータの一覧を挙げておきます:

名前
Query 検索文字列
Market 検索対象の言語(例: ja-JP)
Adult アダルトコンテンツを表示するか(Off, Moderate, Strict)
$top 表示件数(最大50)
$skip 何件飛ばすか
$format 結果の形式(json, xml)

基本的にこのあたりのパラメータを設定しておけば大丈夫ですが、いくつか注意点があります。

・名前の頭に$がつかず、値が文字列である場合、値をダブルクオートで囲わなければならない
すなわち、Queryが「hoge」で$formatが「json」、$topが「50」の場合、

Query='hoge'&$format=json&$top=50

としなければなりません。

・名前の頭についている"$"はURLエンコードしてはいけない
これがなかなかのハマり所です。通常、上のような値をGETパラメータにエンコードする場合、

Query=%27hoge%27&%24format=json&%24top=50

となるような実装になっていることが多いですが、この場合では「$format」と「$top」が指定されていないことになりBad Requestとなってしまいます。正しいパラメータの書き方は以下のようになります。

Query=%27hoge%27&$format=json&$top=50

・認証方法
認証方法はBasic認証ですが、ユーザー名とパスワードは共に先程入手したプライマリアカウントキーとなります。

実行例

# -*- coding: utf-8 -*-

import requests
import urllib.parse

class BingAPI(object):
    API_URL_BASE = 'https://api.datamarket.azure.com/Bing/Search/v1/'
    def __init__(self, key):
        self._key = key

    def search(self, query, source='Web', top=50, skip=0):
        params = {
            'Query': urllib.parse.quote("'%s'" % query),
            'Market': urllib.parse.quote("'ja-JP'"),
            '$top': top,
            '$skip': skip,
            '$format': 'json'
        }
        url = self.API_URL_BASE + source + '?' + \
              '&'.join([key + '=' + str(params[key]) for key in params.keys()])
        auth = (self._key, self._key)
        res = requests.get(url, auth=auth)
        return res.json()

def main():
    key = 'Primary Account Key'
    api = BingAPI(key)
    json = api.search('たけのこの里')
    for result in json['d']['results']:
        print('{Title}\t{Url}'.format(**result))

if __name__ == '__main__':
    main()

実行結果:

$ python bing.py
きのこの山たけのこの里|株式会社 明治	http://www.meiji.co.jp/sweets/chocolate/kinotake/きのこの山」と「たけのこの里」の対決 Amazonの企画で決着 ...	http://news.livedoor.com/article/detail/10802155/
40周年 きのこの山|株式会社 明治	http://www.meiji.co.jp/sweets/chocolate/kinotake/40th/
たけのこの里 - 青森県総合情報サイト	http://www.a-bbn.jp/ikarigaseki/takenoko.html
Amazon.co.jp: 明治 たけのこの里 77g×10個: 食品・飲料・お酒 通販	http://www.amazon.co.jp/%E6%98%8E%E6%B2%BB-%E3%81%9F%E3%81%91%E3%81%AE%E3%81%93%E3%81%AE%E9%87%8C-77g%C3%9710%E5%80%8B/dp/B001HZ4Z8A
道の駅いかりがせき碇ヶ関) 関の庄	http://ikarigaseki.com/takenoko
たけのこの里 - Wikipedia	https://ja.wikipedia.org/wiki/%E3%81%9F%E3%81%91%E3%81%AE%E3%81%93%E3%81%AE%E9%87%8C