« | »

2008.04.28

Google Search REST API を Python から使う

Google Search REST API は,利用中止になっていた SOAP Search API を正式に置き換えるもので,外部のウェブアプリケーションから,Google の検索エンジンを利用するためのRESTインタフェースです.上に貼ったリンクの説明が詳しいですが,

  • ライセンスキー不要
  • クエリ数に関する制限がない
  • 以前よりも簡単に使える
  • Web検索,イメージ検索,ニュース検索,ビデオ検索,ローカル(地図)検索,ブログ検索,ブック検索が利用可能
  • 有効,かつ正確なHTTP Refererヘッダを送信する必要がある
  • 一つのAPI呼び出しで,最大8件までしか検索結果を得られない
  • 検索結果は最大でも32件までしか得られない.
  • 利用規約が厳しい

という特徴があります.サービスの基本的な使い方は,クエリを引数として埋め込んだ検索サービスのURLにアクセスし,返ってくるJSONオブジェクトを解析するというものです.私の名前(Naoaki Okazaki)で検索サービスを呼び出す例です.

面白そうなので,早速Pythonから呼び出すコードを書いてみました.動かすためには,jsonlibをインストールする必要があります.モジュールとしてはsearch関数のみをエクスポーズしています.コマンドラインから動かす場合は,引数をクエリとして,RESTのレスポンスのすべてを表示し,さらに,その中から検索ヒット件数を抜き出しています.

#!/bin/env python

import urllib
import urllib2
import jsonlib  # http://pypi.python.org/pypi/jsonlib/

# CHANGE the referer URL below FOR YOUR OWN.
REFERER = 'http://www.change-this.org/'

BASEURLS = {
    'web': 'http://ajax.googleapis.com/ajax/services/search/web',
    'local': 'http://ajax.googleapis.com/ajax/services/search/local',
    'video': 'http://ajax.googleapis.com/ajax/services/search/video',
    'blog': 'http://ajax.googleapis.com/ajax/services/search/blogs',
    'news': 'http://ajax.googleapis.com/ajax/services/search/news',
    'book': 'http://ajax.googleapis.com/ajax/services/search/books',
    'image': 'http://ajax.googleapis.com/ajax/services/search/images',
}

def search(query, referer=REFERER, type='web', **kwargs):
    # Find the URL for the specific type of Google AJAX Search API.
    baseurl = BASEURLS.get(type)
    if baseurl is None:
        raise TypeError

    # Add the necessary arguments.
    kwargs.update({
        'v': 1.0,
        'q': query,
    })

    # Build the URL.
    url = '?'.join((baseurl, urllib.urlencode(kwargs)))

    # Add a referer HTTP header to the request.
    req = urllib2.Request(url)
    req.add_header('Referer', referer)
    f = urllib2.urlopen(req)

    # Translate the JSON response to a Python object.
    return jsonlib.read(f.read())

if __name__ == '__main__':
    import sys
    query = sys.argv[1]

    res = search(query, hl='en')
    # Show the full response from the service.
    print res
    # Show the Google count for the query.
    print res['responseData']['cursor']['estimatedResultCount']

上のサンプルプログラムを使うときは,

  • REFERERのアドレスを自分のものに置き換えること
  • Googleが出している利用規約を守る

ことに注意してください.

search関数のオプショナル引数は,Googleのサービス側にパラメータとして素通りさせています.各サービスに対して,どのような引数が使えるのか(例えば言語を設定するhlなど)は,リファレンスマニュアルを参照してください.

    RESTインタフェースは,今回初めて使いましたが,SOAPと比べるとかなりお手軽ですね.JavaScriptで扱うのが簡単なのは当たり前ですが,Pythonから使う場合でも,JSONライブラリがあればすぐに出来ます.Pythonでは,すでにSOAPのライブラリよりもJSONライブラリの方が充実している感じになっています.やっぱりXMLはコンピュータが交換するフォーマットとして,まだシンプルさが欠けていたのかも知れませんね.

    Trackback URL

    Comment & Trackback

    No comments.

    Comment feed

    Comment





    XHTML: You can use these tags:
    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>