前回記事に続き、Google Custom Search API を使って、もっと詳細に条件を指定する方法をメモ。
Google Custom Searchの公式ドキュメントによると、構造化データの情報を指定して、さらにフィルタリングができるみたい。
To filter by attribute, add a more:pagemap:TYPE-NAME:VALUE operator to a search query.
とあるので、検索キーワードに、
more:pagemap:属性名:属性値を追加すればOK。
APIの戻り値を見てみると、価格.comのレビューの評価数の属性値は、
review-ratingstarsでとれるので、例えば、評価数3のレビューのみ取得したい場合は、検索キーワード
more:pagemap:review-ratingstars:3.0とすることで、フィルタリングすることができる。また、値をカンマで区切る事でOR条件も指定できる。例えば、評価4と5も含めたい場合は
more:pagemap:review-ratingstars:3.0,4.0,5.0と書ける。前回のフォームに、評価数を指定するプルダウンを設置してみた。ソースはこんな感じ。
入力フォーム
<form class="form-horizontal" role="form" action="search" method="post">
<div class="form-group">
<label class="col-sm-2 control-label" for="keyword">キーワード</label>
<div class="col-sm-10">
<input type="text" id="keyword" name="keyword" class="form-control" >
</div>
</div>
<div class="form-group">
<label for="stars" class="col-sm-2 control-label">評価</label>
<div class="col-sm-10">
<select class="form-control" id="stars" name="stars">
<option value="">指定しない</option>
<option value="1.0">★☆☆☆☆</option>
<option value="2.0">★★☆☆☆</option>
<option value="3.0">★★★☆☆</option>
<option value="4.0">★★★★☆</option>
<option value="5.0">★★★★★</option>
</select>
</div>
</div>
<button type="submit" class="btn btn-primary">検索</button>
</form>
リクエストハンドラ
#!-*- coding:utf-8 -*-
#!/usr/bin/env python
import json
import logging
import urllib
from google.appengine.api import urlfetch
from lib.controller import *
class Top(Controller):
def get(self):
self.draw_template('front/cse/top.html')
class Search(Controller):
def post(self):
# キーワードを得る
keyword = self.request.get('keyword')
# 評価が指定されていればキーワードに追加
stars = self.request.get('stars')
if stars:
keyword += ' ' + 'more:pagemap:review-ratingstars:%s' % stars
# urlエンコード
keyword = urllib.quote(keyword.encode('utf-8'))
# リクエストパラメータ組み立て
url = 'https://www.googleapis.com/customsearch/v1'
url += '?key=%s' % 'YOUR_API_KEY'
url += '&cx=%s' % '000122034385005128488:etmrnaufuww'
url += '&q=%s' % keyword
# 検索
result = urlfetch.fetch(url)
logging.info(url)
items = list()
if not 200 <= result.status_code <= 299:
# エラー
logging.error('google custom search error: %s' % str(result.status_code))
logging.error(result.content)
else:
# 結果を得る
content_dict = json.loads(result.content)
items = content_dict.get('items', list())
self.set_template_value('items', items)
self.draw_template('front/cse/search.html')
url_map = [
('/cse/top', Top),
('/cse/search', Search),
]
application = webapp.WSGIApplication(url_map, debug=True)
ちなみにAPI越しじゃなくても、Custom Search の追加キーワードでも指定できるみたい。ただ、この属性名が
review-ratingstarsとなっているのが、Google独自の命名なのか、構造化ルールでの命名なのかが不明。。。このあたりはもう少し調べてみます。