Pythonで実装!Custom Search APIを使ったGoogle検索結果の自動収集

データ活用ことはじめ

プログラミング言語のPythonは、データ分析や機械学習の領域で使われるイメージがありますが、様々なサービスのAPIを利用することも簡単にできます。

今回は、Pythonを使ってGoogleのCustom Search APIを利用し、Google検索結果を取得するプログラムを作成してみようと思います。

1.Google Custom Search APIとは

Google Custom Search APIは、Googleの検索結果の情報をJSON形式で返してくれるAPIです。
Custom Search JSON API

なお、Google検索結果を取得する方法として、Pythonでスクレイピングという手段も考えられますが、Googleは許可なく検索結果をスクレイピングすることを禁止しているようです。
そのため、スクレイピングではなく、Googleが提供しているAPIを使って検索結果を取得しましょう。

kotohajime15_01.png

2.API利用のための事前準備

まず、Google Cloud Platform(以下、GCP)でCustom Search APIを使うために必要な手続きを行います。

①GCPでプロジェクト作成

kotohajime15_02.png

<参考サイト>
プロジェクトの作成と管理 

Googleアカウントを持っていれば無料で作成できます。
アカウントの取得がまだであれば、Googleアカウントのログインページにアクセスし、作成しておきます。

※GCPには、プロジェクトという概念があります。
GCP上で動くシステムは、プロジェクト単位で管理されます。
GCPで利用するリソースやAPIはすべてプロジェクトと紐づけられ、プロジェクトごとにユーザー管理や課金が行えます。
プロジェクトは複数作成することができ、アカウントを複数作成しなくてもシステムやアプリケーションの分離ができます。

【手順】

1. GCPのCloud Consoleにログインし、ヘッダの「▼」アイコンをクリックします。

kotohajime15_03.png

2.「新しいプロジェクト」をクリックします。

kotohajime15_04.png

3. プロジェクト名と場所を入力し、「作成」をクリックします。

kotohajime15_05.png

4. プロジェクトが作成されました。

kotohajime15_06.png

②APIの有効化とAPIキーの取得

プロジェクトの作成ができたら、次に今回使用したいCustom Search APIを有効化します。

kotohajime15_07.png

【手順】

1.「APIとサービス」>「ライブラリ」を開きます。

kotohajime15_08.png

2. Custom Search APIを検索します。

kotohajime15_09.png

3.「有効にする」をクリックします。

kotohajime15_10.png

4. ダッシュボード画面でCustom Search APIがリストされていることを確認します。

kotohajime15_11.png

5. APIを有効化したら、次にAPIをプログラムから利用するためのAPIキーを作成します。
「認証情報」リンクをクリックし、画面上部の「認証情報を作成」>「APIキー」をクリックします。

kotohajime15_12.png

6. APIキーが作成されました。
表示されたAPIキーをメモしておきます。
次に、セキュリティの強化のため、「キーを制限」を設定します。

kotohajime15_13.png

7. キーを利用するAPIに適したキーの制限を行います。

kotohajime15_14.png

APIが不正利用された場合、無制限に課金されてしまう可能性があるので、必ず利用制限の設定を行うようにしましょう。

③CSEの作成とID取得

APIが利用するGoogleカスタム検索エンジン(以下、CSE)を作成し、検索エンジンIDを取得します。

kotohajime15_15.png

CSEは、Googleが提供するアプリケーションに検索機能を含めることができる検索サービスです。
API経由でGoogle検索を行う場合、CSEを作成する必要があります。

【手順】

1. Programmable Searchにアクセスし、「追加」ボタンをクリックします。

kotohajime15_16.png

2.「検索するサイト」のボックスに、検索結果に含めるサイトを入力し、「作成」ボタンをクリックします。
なお、「検索するサイト」は必須入力ですが、後で削除できます。
今回はGoogleウェブ検索と同様にウェブ全体を検索した結果を表示するCSEの作成が目的なので、適当なサイトを入力して作成し、後で削除します。

kotohajime15_17.png

3. 作成した検索エンジンIDをコピーしておきます。
(API側で言う「CX」キーになります。)

kotohajime15_18.png

4. 前述したとおり、「検索するサイト」に入力したサイトを削除します。

kotohajime15_19.png

5.「ウェブ全体を検索」を「オン」にします。
デフォルトは「オフ」ですが、ここを「オン」にすると、通常のGoogleウェブ検索のようにインターネット全体の検索結果が表示されるようになります。

kotohajime15_20.png

APIで取得する検索結果は、このCSEに設定した検索結果になります。
CSEをAPIから呼び出す際、ここで作成したCSEの検索エンジンIDを指定します。

これでCustom Search APIを利用するための一連の手続きは終了となります。

3.Google検索結果をAPIで取得する

実際にPythonでAPIを呼び出し、Google検索結果を取得してみます。

kotohajime15_21.png

<参考サイト>
Custom Search JSON API > REST Reference
google-api-python-client

Pythonを実行する前に、Google API Clientライブラリをインストールします。

pip install --upgrade google-api-python-client

次に、Pythonファイルの作成と実行を行います。
コード例:

custom_search_api_sample.py
  1. AWS Systems Managerのパラメータストアに保存したAPIキーと検索エンジンID(CXキー)を取り出す
  2. 任意のキーワードでGoogle検索結果を取得する
  3. 検索結果(JSON形式)から必要な情報を抽出し、CSVファイルに出力する
#!/usr/bin/env python				
# coding: utf-8				
from datetime import datetime, timedelta, timezone				
				
import pandas as pd				
import boto3				
from googleapiclient.discovery import build				
				
pd.set_option('display.max_colwidth', 1000)				
				
# Systems Manager - Parameter Storeへのアクセス				
API_KEY = 'Google-API-Key'				
CSE_ID = 'Google-Custom-Search-Engine-Id'				
				
session = boto3.session.Session(profile_name='xxxxxx')				
ssm = session.client('ssm')				
params = {}				
res = ssm.get_parameters(				
    Names=(API_KEY, CSE_ID),				
    WithDecryption=True				
)				
for p in res['Parameters']:				
    params[p['Name']] = p['Value']				
				
# get the API KEY				
google_api_key = params[API_KEY]				
# get the Search Engine ID				
google_cse_id = params[CSE_ID]				
				
				
def get_search_results(query, start_index):				
    # Google Custom Search API				
    service = build("customsearch",				
                    "v1",				
                    cache_discovery=False,				
                    developerKey=google_api_key)				
    # CSEの検索結果を取得				
    result = service.cse().list(q=query,				
                                cx=google_cse_id,				
                                num=10,				
                                start=start_index).execute()				
    # 検索結果(JSON形式)				
    return result				
				
				
def main():				
    query = "いちご農家 HP"				
				
    # ExecDate				
    timezone_jst = timezone(timedelta(hours=+9), 'JST')				
    now = datetime.now(timezone_jst)				
				
    # Google検索 - Custom Search API				
    data = get_search_results(query, 1)				
    total_results = int(data['searchInformation']['totalResults'])				
    print('total_results', total_results)				
				
    # Google検索結果から任意の項目抽出 & rank付与				
    items = data['items']				
				
    result = []				
    num_items = len(items) if len(items) < 10 else 10				
    for i in range(num_items):				
        title = items[i]['title'] if 'title' in items[i] else ''				
        link = items[i]['link'] if 'link' in items[i] else ''				
        snippet = items[i]['snippet'] if 'snippet' in items[i] else ''				
        result.append(				
            't'.join([str(i+1), title, link, snippet])				
        )				
				
    # List->DataFrame				
    df_search_results = pd.DataFrame(result)[0].str.split('t', expand=True)				
    df_search_results.columns = ['rank', 'title', 'url', 'snippet']				
				
    # CSV出力				
    dt_csv = now.strftime('%Y%m%d%H%M')				
    output_csv = f'csv/{query}_{dt_csv}.csv'				
    df_search_results.to_csv(output_csv,				
                             sep=",",				
                             index=False,				
                             header=True,				
                             encoding="utf-8")				
    pd.read_csv(output_csv, index_col=0)				
				
				
if __name__ == '__main__':				
    main()				

プログラムの実行

python custom_search_api_sample.py

プログラムを実行すると、検索結果がCSVファイル形式で保存されます。
●ファイル名:{検索キーワード}_{YYYYMMDDHHMM}.csv

kotohajime15_22.png

4.API無料枠と課金について

<参考サイト>
Custom Search JSON API > Pricing
プログラム可能な検索エンジンのバージョン

Google Custom Search APIは有料サービスです。
無料枠を超えると課金が発生します。
上記参考サイトの「Pricing」に記載がありますが、Custom Search APIの利用制限に注意が必要です。

  • APIリクエストの利用制限(無料枠):100クエリ/日まで
    ※1日100クエリを超えると課金が発生します。
    ※APIコンソールで支払方法を追加すると、100クエリ制限は解除できます。
  • 料金:1,000クエリあたり$5
  • 1日のクエリ上限:10,000 クエリ/日
    ⇒有料であっても1日の最大受付数は10,000クエリまでです
  • API呼び出し1クエリあたりの検索結果は最大10件
    ⇒APIリクエスト1回につき10件までしか取得できないため、100件取得するためには10リクエスト使うことになります

<リセットタイミングについて>
「毎日の割り当ては、太平洋時間(PT)の午前0時にリセットされます」と記載があります。
日本標準時(JST)でいうと17時です(サマータイム期間は16時)。

割り当ての上限値や使用状況は、GCPのCloud Consoleの「IAMと管理」>「割り当て」画面で確認できます。

kotohajime15_23.png

5.通常のGoogleウェブ検索との違い

<参考サイト>
プログラム可能な検索エンジンとは

APIで取得した結果と通常のGoogleウェブ検索した結果は微妙に異なります。
実際、検索順位に微妙に差異があったり、取得件数が通常のウェブ検索結果の方が多かったりしました。

また、APIではGoogleの「もしかして」機能が含まれないなど、Googleウェブ検索の一部機能が含まれません。
※「もしかして」機能とは、ユーザーから受け取ったキーワードについて「もしかしてこれを入力したかったんじゃないかな?」と、Googleのコンピュータが判断した場合、簡単に訂正できるようにするためのものです。

6.おわりに

PythonでGoogleのCustom Search APIを使って、キーワード検索した結果を取得し、結果データを操作するところまで行いました。
コードを数行書くだけで自動で情報収集ができるので、データ活用の前提となるデータ収集に一役買えるのではないでしょうか。

例えば、以下のような活用方法が考えられます。

  • APIから返ってきた検索結果情報を簡単にまとめる(営業開拓先リストの収集など)
  • 特定のキーワードでヒットするWEBサイトのデータを活用。検索結果のURLごとにスクレイピング処理を実施して自動でWEBから情報収集する
  • 自サイトがどのキーワードで検索順位が何位だったかを追跡する

まずは「どこからデータを取得したいのか」を決めるのに、Custom Search APIは有用なツールとして使えそうです。

BI_banner01.png