見出し画像

25分で使ってみるGoogleから検索結果をもらってくるAPI

こんにちは!しばらく論文執筆が忙しく引きこもっていたドリーです。
ちょうど研究もひと段落してきたところで、開発に使ったAPIのひとつを簡単にご紹介しようかと思います!

ご紹介するのは Custom Search JSON API というものです。
これを使ってAPIからGoogleの検索結果を持ってくるデモをやってみたいと思います。

プログラム書くのに何かネタを探している方やAPIを探している方のお役に立てれば嬉しいです。


Custom Search JSON API とはなにか

Googleの検索結果を持ってくるAPIです。

ちょっと何か調べ物をしたいとき、google.comの検索バーに単語を入力して検索すればいろいろ検索結果が出てきますよね。

でも、例えばこの調べる対象が100個も200個もあったらどうでしょうか?

先輩から検索する対象が100個並べられたExcelファイルを渡されました。
「この100個の検索でそれぞれ一番上に出てくるページをまとめてほしいんだ。」

入力して、検索結果を見て、コピペ、入力して、検索結果を見て、コピペ、入力して、検索結果を、、、

こんなこともあるかもしれません?
これ、全部プログラムでできたら便利だと思いませんか?


というわけで Custom Search JSON API の登場です!
Googleの検索結果の情報をJSON形式で返してくれるAPIです。

残念ながらこの執筆時点では日本語では準備されていないようですが、ドキュメントは以下になります。
詳しく知りたい方はご自身で読んでみてください。

大事なのが利用制限の話。
Pricing のセクションに書いてあるんですが、
・無料で使い続けるためには1日に100クエリまで
・APIコンソールで支払い方法を追加すると100クエリ制限は解除できる
・が1日100クエリを超えると1,000クエリごとに5ドルかかる
・有料であっても最大受付数は10,000クエリまで
という限度が設定してあります。

ちょっと触ってみる程度であれば大した問題はないですが、何かのサービスに組み込むとか、ほんとに大量のクエリで実行したい場合は容易じゃないかもしれません。


それを踏まえた上で、どうやって使うのか?

このAPIを使うのに必要な手続きをまとめると、大きく以下の4つになります。
準備1. Programmable Search で自分でカスタム検索エンジンを作成する
準備2. Google Developer Console で APIを有効化する
準備3. Google Developer Console で APIキーを取得する
準備4. API Client Library のインストール

以上の準備と、検索結果を取得するまでのプログラム、
全部以下でご紹介します!

概要を掴めたところで、早速こいつから検索結果をもらってくる準備をしましょう!


準備1. 検索エンジンを作る

(所要時間: 4.5分)

下のページを開いてください。

このサービスのトップページになります。

右上かページ真ん中に「Get Started」というボタンがありますので、クリックしてみましょう。Programmable Search というページに出ると思います。

ここで自分のプログラムからアクセスする検索エンジンの作成を行います。

画像8

入力する内容ですが、
Sites to search: 検索結果を取得する時に取得対象とするドメインです。結果を現物のGoogleみたくウェブ全体から取得したい場合は特に必要ありませんが、エンジンを作るのに何かしら入力しないと進めませんので、適当に何かしら入力して後で削除しましょう。作る段階ではとりあえずなんでもOKです。今回は一旦「note.com」とでも入力しておきます。2つ目以降も入力欄が出てきますが、とりあえず作るには1つ入力すればOKです。
Language: 検索ボックスなんかのユーザーインターフェースの表示に使われる言語です。パーツをWebサイトに貼り付けた時なんかに英語だと「Google Custom Search」って表示されるのが日本語だと「Googleカスタム検索」みたいになるんでしょうか?これもAPIとして使用するのにはあんまり影響ないと思いますが、一応日本語を選択しましょうか。取得する検索結果の言語には関係ないそうです。
Name of the search engine: お好きな名前をどうぞ。迷っちゃう方は「Googleちゃん」とでも入力してください。

全部入力できたら「Create」ボタンを押しましょう。
下の画像っぽいのが表示されたら作成できてますね。

画像8

それでは「Control Panel」のボタンをクリックしましょう。
すると

画像3

こんなページに移動するかと思います。
Googleちゃん、ちゃんとできてますね。
(画像のSearch engine ID と Public URL の一部はホワイトで隠しました)
ここでちょっとだけ操作します。

このページでやることリスト
1. Search engine ID をコピーしておく(メモ帳とかに貼っときましょう)
2. (任意: 日本向けの検索結果のみ表示にしたいとき) もし検索結果をローカライズしたい場合は Region のセクションの選択「All Regions」を「Japan」にしておく&その下に出現する「Restrict search results to region」のスイッチをONにする
3. Sites to search のセクションでさっき適当に入れたドメイン(今回の場合は「note.com」)にチェックを入れて「Delete」ボタンをクリック
4. その下のセクション、「Search the entire web」のスイッチを「On」にする
そのほか、「Image search」のスイッチをオンにすると検索結果に別タブで画像検索の結果がついてきたり(API上では試していません)、「SafeSearch」のスイッチをオンにすると検索結果から性的なコンテンツを除外してくれたりします。気になれば試してみてください。

まとめると、こんな設定になっていれば問題ないでしょう。

画像8

これで一旦検索エンジンの作成は終わりです!
よくわからないところがあっても、後からいつでも設定変更することは可能なので先に進みましょう。
次はこれにAPIを通してアクセスできるようにします。


準備2. Custom Search API の有効化

(所要時間: 3分)

まず、このリンクか、あるいは「Google Developer Console」を検索して、Google Developer Console のページに遷移してください。

下の画像のようなページが表示されるかと思います。
初めてアクセスした人は、利用規約の同意を求めるモーダルが表示されるかと思いますので、内容を確認した上で「同意して続行」を選択してください。

画像10

すでにプロジェクトをお持ちの方は「プロジェクトの選択」から適当なのを選択するか新規作成してください。

まだ何もプロジェクトがない方はページが表示されないので、「プロジェクトを作成」をクリックして下の画像みたく適当な名前でプロジェクトを作成してください。ぼくは「Operation Google-chan」とでも入力してみます(日本語入力はダメみたいですね)。

画像11

「作成」ボタンをクリックすると、ダッシュボードの表示がさっきと変わっているかと思います。

さて、ダッシュボードが表示されたら、ページ上中央の「APIとサービスの有効化」をクリックしてみましょうか。

画像12

クリックすると

画像13

APIライブラリのトップページが表示されるかと思います。
この検索で「Custom Search API」を検索するか、ページの一番下までスクロールしたところにある「その他」のリストにあるのを見つけるかして、以下のCustom Search API のページに移動してください。

画像14

移動したら、「有効にする」をクリック。
最初のダッシュボード画面に戻るかと思います。

画像15

ページ一番下にCustom Search APIの名前がリストされていればOKですね!
次はこのAPIをプログラム中で使えるようにAPIキーを取得していきます。


準備3. APIキーの取得

(所要時間: 1.5分)

さて、APIで検索結果にアクセスするにはもうひとつ、このAPIキーというのが必要となっています。取得してみましょう。
(すでにAPIキーを生成している方は準備4のセクションに進んでもらっても結構です)

さて、まずはDeveloper Console の左側のタブの「認証情報」を選択します。

画像13

でた画面の「認証情報を作成」から「APIキー」を選択してください。

画像9

すると「APIキーを作成しました」というモーダルが出るはずです。

画像9

任意ですが念のため、このキーを使ってアクセスできるAPIを制限しておいた方が安全だそうです。
上のモーダルの「キーを制限」から「APIキーの制限と名前変更」ページへ移動し、ページ下部の「キーを制限」で「Custom Search API」にチェックを入れましょう。

画像14

「保存」を押したら完璧です。

最後に、ダッシュボードに戻ったら作ったAPIキーをコピーしてこれもまたメモ帳かどこかに貼り付けておきましょう。

画像15

準備完了までもう少し!
次はプログラムからAPIにアクセスするためのライブラリをインストールします。


準備4. API Client Library のインストール

(所要時間: 2分)

すでにインストールされている方は、このセクションは飛ばしてもらって問題ありません。

先ほど有効化したAPIにプログラムからアクセスするには、API Client Library というものが要るようです。

このライブラリはJava, Python, PHP, JS, Go... あらかたの言語について準備されていますので、以下のページからアクセスしてください。

ここでは、ぼくがPythonで色々作っていたのでPythonでのやり方をご紹介します。
とはいえ、GitHubのREADMEに書いてある以外のことは何もありません。

1. 上のリンクのページから「Python」を選択すると、GitHubレポジトリに移動します。

2. READMEのInstallationの欄に書いてある通りにコマンド入力。
Mac/Linuxの場合:

pip install virtualenv
virtualenv <your-env>
source <your-env>/bin/activate
<your-env>/bin/pip install google-api-python-client

Windowsの場合:

pip install virtualenv
virtualenv <your-env>
<your-env>\Scripts\activate
<your-env>\Scripts\pip.exe install google-api-python-client

詳しくは直接ご覧ください。

3. pipでインストールできてるか確認

(google-chan) bash-3.2$ pip list | grep google-api-python-client
google-api-python-client 1.12.8
(google-chan) bash-3.2$

うん、インストールできてますね。

ついに準備完了です!
プログラム本体の作成に移りましょう。


実装1. 検索結果を取得する最小限のプログラム

それではAPIの使い方についてです。
Pythonでプログラムを書いていきます。

最低限必要なライブラリは以下の2つになります。
json: APIから返却されるjson形式の検索結果データを解析する(標準ライブラリなのでインストールは不要)
・googleapiclient: APIへの接続に使う(準備4の操作で用意されてる)

そして、プログラムを書く前に必要なものの確認です。
上の準備セクションでコピーしておいたものが2つあると思います。
接続先カスタム検索エンジンID: 準備1 の やることリスト1 で Programmable Search の Control Panel でコピーしといたやつ
APIキー: 準備3の最後に Developer Console からコピーしといたやつ

どれも動作に必要なものなので準備してくださいね。

その上で、以下が結果を取得する最低限のプログラムです。

import json                                 # 返却された検索結果の読み取りにつかう
from googleapiclient.discovery import build # APIへのアクセスにつかう

# カスタム検索エンジンID
CUSTOM_SEARCH_ENGINE_ID = "XXXXX(接続先カスタム検索エンジンIDを入力)"
# API キー
API_KEY = "XXXXX(APIキーを入力)"

if __name__ == '__main__':

   # 検索するキーワード
   query = "Note"
   
   # APIでやりとりするためのリソースを構築
   # 詳細: https://googleapis.github.io/google-api-python-client/docs/epy/googleapiclient.discovery-pysrc.html#build
   search = build(
       "customsearch", 
       "v1", 
       developerKey = API_KEY
   )
   
   # Google Custom Search から結果を取得
   # 詳細: https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list
   result = search.cse().list(
                   q = query,
                   cx = CUSTOM_SEARCH_ENGINE_ID,
                   lr = 'lang_ja',
                   num = 10,
                   start = 1
               ).execute()

   # json形式の結果を整形
   organized_result = json.dumps(result, ensure_ascii = False, indent = 4)

   # コマンドラインに取得したjsonレスポンスを出力
   print(organized_result)

上部の カスタム検索エンジンID と APIキー の部分にはコピーしておいた自分のやつを入力してくださいね。
さもないと400エラーで「API key not valid」って言われちゃいますよ。

結果を取得するときのsearch.cse().list()のパラメタについてですが、簡単にご紹介すると
q: 検索するクエリ(キーワード); 今回は"Note"を検索しています.
cx: カスタム検索エンジンのID; 上に入力したのをそのまま送ります.
lr: (任意)取得する検索結果の言語指定; 'lang_ja'で日本語のサイトだけ取得し’lang_en'で英語のサイトだけ取得します.
num: (任意)取得する検索結果の数; Google検索のデフォルトは10です.
start: (任意)何番目の検索結果から返却するか; 例えばnumを10で指定して11番目から20番目の結果(i.e. 2ページ目の結果)が欲しいときは11を指定すればいいですね.

qとcxのパラメタ以外は、特に指定する必要がなければ無くしてしまってOKです。
詳細を知りたい方ははこちらのドキュメントを参照してください。

これを適当なファイル名で保存します。
ぼくは google_api_sample.py って名前で保存します。

そしたら、コマンドラインで早速実行してみましょう。

bash-3.2$ python3 google_api_sample.py 
{
   "kind": "customsearch#search",
   "url": {
       "type": "application/json",
       "template": "https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json"
   },
   "queries": {
       "request": [
           {
               "title": "Google Custom Search - Note",
               "totalResults": "6780000000",
               "searchTerms": "Note",

...(以下省略)

おお!jsonでちゃんと返ってきましたね!

このjsonに検索結果の情報が含まれています。
これで一番大事な部分は完了です。


実装2. 返ってくるレスポンスの中身を知る

ほとんど完成で、一応検索結果は持ってこれてるっぽいですが、これだけでは結果の情報はいまいち分かりませんね。
何が返ってきているの?どこが検索結果の部分?

レスポンスの全体像は、以下のページに綺麗にまとめてくれてますので参照してください。

返ってきているのは Search インスタンスというもので、json形式で出力されます。

で、結局結果を持ってくるにはどこをみたらいいの?
大事なのは、一番最後の

{
...
 "items": [
   {
     object (Result)
   }
 ]
}

この部分ですね。
実際のjsonのレスポンスだと

{
...(中略)
	"items": [
		{
			"kind": "customsearch#result",
			"title": "note ――つくる、つながる、とどける。",
			"htmlTitle": "<b>note</b> ――つくる、つながる、とどける。",
			"link": "https://note.com/",
			"displayLink": "note.com",
			"snippet": "クリエイターが文章やマンガ、写真、音声を投稿することができ、ユーザーは\nそのコンテンツを楽しんで応援できるメディアプラットフォームです。だれもが\n創作を楽しんで続けられるよう、安心できる雰囲気や、多様性を大切にしてい\nます。",
			"htmlSnippet": "クリエイターが文章やマンガ、写真、音声を投稿することができ、ユーザーは<br>\nそのコンテンツを楽しんで応援できるメディアプラットフォームです。だれもが<br>\n創作を楽しんで続けられるよう、安心できる雰囲気や、多様性を大切にしてい<br>\nます。",
			"formattedUrl": "https://note.com/",
			"htmlFormattedUrl": "https://<b>note</b>.com/",
			"pagemap": {
				"cse_thumbnail": [
					{
						"src": "https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcSHGrCCuA8d_BK7_6u2_Ym7Vcctkadb5fW6yNJwyDxmqfB9NTRODxEstapu",
						"width": "310",
						"height": "163"
					}
				],
				"metatags": [
					{
						"og:image": "https://d2l930y2yx77uc.cloudfront.net/assets/default/default_top_ogp-60a76fb035b232dea633f7bb98cc22661718c4613e345744d6bcec0c1e03deb8.png",
						"twitter:app:url:iphone": "note://",
						"twitter:app:id:googleplay": "mu.note",
						"og:type": "article",
						"twitter:card": "summary_large_image",
						"twitter:title": "note ――つくる、つながる、とどける。",
						"og:site_name": "note(ノート)",
						"twitter:url": "https://note.com",
						"og:title": "note ――つくる、つながる、とどける。",
						"twitter:app:name:googleplay": "note(ノート)",
						"twitter:app:id:iphone": "906581110",
						"og:description": "クリエイターが文章やマンガ、写真、音声を投稿することができ、ユーザーはそのコンテンツを楽しんで応援できるメディアプラットフォームです。だれもが創作を楽しんで続けられるよう、安心できる雰囲気や、多様性を大切にしています。",
						"twitter:app:url:googleplay": "note.mu://",
						"fb:app_id": "665869046808089",
						"twitter:site": "@note_PR",
						"viewport": "width=device-width,initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0",
						"twitter:description": "クリエイターが文章やマンガ、写真、音声を投稿することができ、ユーザーはそのコンテンツを楽しんで応援できるメディアプラットフォームです。だれもが創作を楽しんで続けられるよう、安心できる雰囲気や、多様性を大切にしています。",
						"og:url": "https://note.com",
						"twitter:app:name:iphone": "note(ノート)"
					}
				],
				"cse_image": [
					{
						"src": "https://d2l930y2yx77uc.cloudfront.net/assets/default/default_top_ogp-60a76fb035b232dea633f7bb98cc22661718c4613e345744d6bcec0c1e03deb8.png"
					}
				]
			}
		},
		{
			"kind": "customsearch#result",
			"title": "Completing a Master Promissory Note | Federal Student Aid",

            〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
            ...(中略)
            〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
            
			"formattedUrl": "https://www.icloud.com/notes",
			"htmlFormattedUrl": "https://www.icloud.com/<b>notes</b>",
			"pagemap": {
				"cse_thumbnail": [
					{
						"src": "https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQKaKXIAxhKiAy7OPLqATdPMrG9bPJGNmR3zsMj6HQ7B_taak04BpCnSfdA",
						"width": "224",
						"height": "224"
					}
				],
				"metatags": [
					{
						"og:image": "https://www.icloud.com/icloud_logo/icloud_logo.png",
						"apple-mobile-web-app-status-bar-style": "default",
						"viewport": "width=device-width, initial-scale=1, viewport-fit=cover",
						"apple-mobile-web-app-capable": "yes",
						"og:title": "iCloud.com",
						"google": "notranslate"
					}
				],
				"cse_image": [
					{
						"src": "https://www.icloud.com/icloud_logo/icloud_logo.png"
					}
				]
			}
		}
	]
}

こんな感じになっています。
ここが検索結果ひとつひとつの情報が格納されている部分ですね。

具体的にひとつひとつの結果にどんな情報が含まれてるかというと、それはこちらのページにまとめてくれていますのでご覧ください。

いくつか最も必要性の高そうなものをピックアップすると、
title: Webページのタイトル
link: WebページへのURL
snippet: 検索結果ページに出てくる内容の概略説明文みたいなやつ

あたりでしょうか。
綺麗に出力するために、取得できた結果からその3つ+検索結果内での順位を取り出すプログラムを書いてみましょう!


実装3. 必要な情報を抽出するプログラム

そしたら、とりあえず実装1で書いたプログラムに加えて、必要な情報を抽出するプロセスを書いてみましょう。

結論からいうと、以下のプログラムで完結できます。

import json                                 # 返却された検索結果の読み取りにつかう
from googleapiclient.discovery import build # APIへのアクセスにつかう

# カスタム検索エンジンID
CUSTOM_SEARCH_ENGINE_ID = "XXXXX(接続先カスタム検索エンジンIDを入力)"
# API キー
API_KEY = "XXXXX(APIキーを入力)"


# APIにアクセスして結果をもらってくるメソッド
def get_search_results(query):
   
   # APIでやりとりするためのリソースを構築
   # 詳細: https://googleapis.github.io/google-api-python-client/docs/epy/googleapiclient.discovery-pysrc.html#build
   search = build(
       "customsearch", 
       "v1", 
       developerKey = API_KEY
   )
   
   # Google Custom Search から結果を取得
   # 詳細: https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list
   result = search.cse().list(
       q = query,
       cx = CUSTOM_SEARCH_ENGINE_ID,
       lr = 'lang_ja',
       num = 10,
       start = 1
   ).execute()

   # 受け取ったjsonをそのまま返却
   return result


# 検索結果の情報をSearchResultに格納してリストで返す
def summarize_search_results(result):

   # 結果のjsonから検索結果の部分を取り出しておく
   result_items_part = result['items']

   # 抽出した検索結果の情報はこのリストにまとめる
   result_items = []
   
   # 今回は (start =) 1 個目の結果から (num =) 10 個の結果を取得した
   for i in range(0, 10):
       # i番目の検索結果の部分
       result_item = result_items_part[i]
       # i番目の検索結果からそれぞれの属性の情報をResultクラスに格納して
       # result_items リストに追加する
       result_items.append(
           SearchResult(
               title = result_item['title'],
               url = result_item['link'],
               snippet = result_item['snippet'],
               rank = i + 1
           )
       )

   # 結果を格納したリストを返却
   return result_items

       
# 検索結果の情報を格納するクラス
class SearchResult:
   def __init__(self, title, url, snippet, rank):
       self.title = title
       self.url = url
       self.snippet = snippet
       self.rank = rank

   def __str__(self):
       # コマンドライン上での表示形式はご自由にどうぞ
       return "[title] " + self.title + "\n\t[url] " + self.url + "\n\t[snippet] " + self.snippet + "\n\t[rank] " + str(self.rank)


# メインプロセス       
if __name__ == '__main__':

   # 検索キーワード
   query = "Note"

   # APIから検索結果を取得
   result = get_search_results(query) # result には 返却されたjsonが入る

   # 検索結果情報からタイトル, URL, スニペット, 検索結果の順位を抽出してまとめる
   result_items_list = summarize_search_results(result) # result_items_list には SearchResult のリストが入る

   # コマンドラインに検索結果の情報を出力
   for i in range(0, 10):
       print(result_items_list[i])

やっていることはメインプロセスのコメントに書いてある通りです。
部分ごとに説明します。

def get_search_results(query):
まずごちゃごちゃにならないように、実装1で作成したプログラムはget_search_results()のメソッドにまとめました。
引数でクエリを受け取り、APIに投げて、返ってきたSearch インスタンス(json)をそのまま返却します。

def summarize_search_results(result):
ここが新しく実装する、jsonから必要な情報を抽出するプロセスです。
上のget_search_resultsから返ってくるインスタンスは、jsonのフィールド名を[]で囲って参照する (e.g. result['title']) と対象の値を返却してくれるので、ここでやるのはjsonの上の階層からフィールドを絞って検索結果ごとの情報を参照することです。
言葉だとどうも簡潔に表せないですが、コードを見たらすぐわかるかと思います。
集めた title, link, snippet, そして 検索結果内で提示された順番を、下で定義されている SearchResult クラスのインスタンスに突っ込んで、リストに加えて返却しています。

class SearchResult:
データの中身がわかりやすいように、今回はこのクラスのインスタンスに検索結果ごとのデータを突っ込みます。
__init__ で 検索結果のタイトル、URL、スニペット、結果内の順番を受け取って保管し、__str__ でこの中身を出力するときの文字列を指定しています。出力方法が気に入らない場合は、returnする文字列を変更してください。

メインプロセス:
コメントアウト以上に解説することは何もないですね。。
1. queryを定義してget_search_results に渡す
2. get_search_results から返されたjson(Searchインスタンス)のデータをsummarize_search_results に渡す
3. さらにそこから得られた検索結果のリストをforループで回して中身をprintする
だけです。
ループが0から10なのは、get_search_results で指定したnum (検索結果数) が10だったからですね。

ね?簡単でしょ?


動かしてみよう

流れが掴めたところで、早速上のプログラムを実行してみましょう。
またカスタム検索エンジンIDとAPIキーを書き換えるのを忘れずに。
下はgoogle_api_sample.pyを上のコードで上書きして実行したものです。

bash-3.2$ python3 google_api_sample.py
[title] note ――つくる、つながる、とどける。
	[url] https://note.com/
	[snippet] クリエイターが文章やマンガ、写真、音声を投稿することができ、ユーザーは
そのコンテンツを楽しんで応援できるメディアプラットフォームです。だれもが
創作を楽しんで続けられるよう、安心できる雰囲気や、多様性を大切にしてい
ます。
	[rank] 1
[title] Death Note (2015 TV series) - Wikipedia
	[url] https://en.wikipedia.org/wiki/Death_Note_(2015_TV_series)
	[snippet] Death Note (Japanese: デスノート) is a Japanese television drama series based 
on the manga series of the same name by Tsugumi Ohba and Takeshi Obata. It 
was directed by Ryūichi Inomata, who directed the television drama Kaseifu no ...
	[rank] 2
[title] L's Theme - Death Note OST (Piano Cover)
	[url] https://www.youtube.com/watch?v=mwOig9vNEhY
	[snippet] Aug 5, 2020 ... #DeathNote #L #piano. L's Theme - Death Note OST (Piano Cover). 129,369 
views129K views. • Aug 5, 2020. 8.9K 41. Share Save. 8,904 / 41. F.B. Piano 
Anime. F.B. Piano Anime. 139K subscribers. Subscribe. L's theme on ...
	[rank] 3
[title] Note Grouping: Thurmond, James Morgan: 9780942782004 ...
	[url] https://www.amazon.com/Note-Grouping-James-Morgan-Thurmond/dp/0942782003
	[snippet] Note Grouping [Thurmond, James Morgan] on Amazon.com. *FREE* shipping on 
qualifying offers. Note Grouping.
	[rank] 4
[title] BMC Research Notes | Preparing your manuscript
	[url] https://bmcresnotes.biomedcentral.com/submission-guidelines/preparing-your-manuscript
	[snippet] Please note that it is the responsibility of the author(s) to obtain permission from 
the copyright holder to reproduce figures (or tables) that have previously been 
published elsewhere. In order for all figures to be open access, authors must 
have ...
	[rank] 5
...(以下略)

おー、出ました!

これでAPIから返ってきた検索結果の情報をまとめることができましたね。
やったね!これであなたも検索マスター!


まとめ

どうでした?簡単だったでしょ?

今回はタイトルとURLとスニペットと検索結果順位だけ適当に出力しましたが、賢い人ならうまい応用方法が思いつくかもしれません。

データの扱い方は何も難しいことはありませんし、ぜひ色々いじってみてください!

とはいえ僕も研究に手をつけるまでこのAPIの存在すら知りませんでした。
「ちょうど今切らしてた!」とはならないかもしれませんが、こんなAPIあるんだー、と知ってもらうきっかけになればと思います。

それでは良い1日を!


参考資料

この記事ではなるべく詳しく丁寧に解説しようと頑張りましたが、もし何言ってんのかわかんねえ、という方がいらしたら以下の記事もご覧ください。
ぼくが最初やったときに参考にさせていただいた記事です。

Custom Search APIを使ってGoogle検索結果を取得する - Qiita

Google Custom Search APIを利用した検索結果の取得方法

APIのリファレンスは以下になります(再掲です)。


この記事が気に入ったらサポートをしてみませんか?