Rubyのgoogle-api-clientでGoogle Custom Search APIを使う

Google Custom Search APIとは

Google検索の結果をJSONで取得できたら便利ですよね。
スクレイピングで頑張るという手も有りますが、ライセンスやサイトの仕様変更を気にする必要が有ります。
そんなときは Google Custom Search API を使いましょう。 手軽に検索結果のJSONを取得できます。

APIキーとCustom Searrch Engine IDの取得

このAPIを使うにはGoogleAPIのAPIキーとCustom Search EngineのIDが必要になります。

その手順については既にいくつか記事があるのでそれらを参照してください。

一点だけ注意事項が有ります、Custom Search Engineの Search the entire web は一先ずONにしておいてください。
OFFだと予め登録したドメインしか検索してくれません。
f:id:u10e10:20190201200848p:plain

動作確認

APIキーとCSE_IDの用意ができたら、curlで動作確認してみましょう。
API_KEYとCSE_IDを取得したキーとIDで置き換えて、QUERYを検索したいワードに置き換えて実行してください。

curl 'https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=CSE_ID&q=QUERY'

大量のJSONが出力されれば成功です。

google-api-client

RubyからこのAPIを使う場合はgoogle-api-ruby-clientを使うと少し手間が省けます。

gem install google-api-client

以下のコードは入力した文字列で検索して、結果のタイトルとURLを出力する例です。

#!/usr/bin/env ruby
require 'google/apis/customsearch_v1'

API_KEY = ''
CSE_ID = ''

searcher = Google::Apis::CustomsearchV1::CustomsearchService.new
searcher.key = API_KEY

print "QUERY> "
query = gets.chomp

results = searcher.list_cses(query, cx: CSE_ID)
items = results.items
pp items.map {|item| { title: item.title, link: item.link} }

指定できるパラメータはここに書いてあります。
developers.google.com

例えば特定のサイトのみ検索対象にしたいばあいは、site_searchを使います。

searcher.list_cses(query, cx: CSE_ID, site_search: 'example.com')

フリーエディションだと1日100件のリクエスト制限があるので検証のときは注意しましょう。
戻り値をいじくり回したいときは binding.pry がおすすめです。