Google Custom Search APIを使って画像の自動収集

こんにちは。

前回はTwitter search APIを使ってTwitterから画像データを自動収集する方法をまとめました。
blog.wackwack.net

今回はGoogleCustomSearch APIを使った画像自動収集プログラムを作成しましたので、必要な手順を紹介します。

カスタム検索エンジンの作成とAPIキーの発行

GoogleCustomSearch APIを使うには「カスタム検索エンジンの作成」APIキーの発行」が必要となります。

GoogleCustomSearch APIではAPIキーを使って認証を行い、作成したカスタムエンジンに対して検索リクエストを投げる仕組みになっています。

カスタム検索エンジンの作成

まずはGoogleカスタム検索にログインしましょう。

ログイン後に「Add」をクリックします。 Googleカスタム検索

必要項目を入力して「作成」をクリックします。

  • 検索するサイト:任意のURLを入力します。(この後の手順で設定は削除するので何でもOK)
  • 言語:日本語
  • 検索エンジンの名前:任意の名前を入力します。

Googleカスタム検索

作成完了後の画面左側から、作成したカスタム検索エンジンを選択して「設定」をクリックします。
Googleカスタム検索

設定画面で以下のとおり設定を行います。(この画面では「保存」ボタン等をクリックする必要はありません。)

  • 画像検索:「オン」に設定
  • 検索するサイト:「追加したサイトを重視して、ウェブ全体を検索する」を選択
  • サイト:表示されているサイトをチェックして「削除」する

Googleカスタム検索

ここまで完了したら設定画面の検索エンジンID」をクリックして、表示されるIDを確認します。この値をプログラム上で利用します。
Googleカスタム検索

Googleカスタム検索

APIキーの発行

続いてAPIキーを発行します。APIの利用状況(1日のクエリ発行数など)はこのキーで管理されます。

Custom Search JSON/Atom APIにアクセスし、画面中央の「GET A KEY」をクリックします。
APIキーの発行

表示されたダイアログで「Create My Project」を選択します。これから発行するAPIキーはこの「プロジェクト」の中で管理されます。
プロジェクトの作成

適当な名前を入力して「NEXT」をクリックします。
プロジェクトの作成

作成が完了するとAPIキーが表示されます。この値をプログラム上で利用します。
APIキー


なおこの手順で作成した「プロジェクト」と「APIキー」は、Google Cloud プラットフォームより確認できます。

ダッシュボード

ダッシュボード

画像自動収集プログラム

私が作成した実装例を示します。実装はPython 3.6.1(Anaconda 4.4.0)で行っています。
imagecrawler/google_image_crawler.py at master · quotto/imagecrawler · GitHub

# -*- coding:utf-8 -*-
import httplib2
import imgutil
from googleapiclient.discovery import build

# image save path
path = "/path/to/save"

# parameters
api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"   # APIキー
cse_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 検索エンジンID
query = "キーワード"
service = build("customsearch","v1",developerKey=api_key)

imgutil.mkdir(path)

page_limit = 10 # 検索ページ数
startIndex = 1
response = []
img_list = []

for page in range(0,page_limit):
    try:
        response.append(service.cse().list(
            q=query,            # 検索ワード
            cx=cse_key,         # 検索エンジンID
            lr="lang_ja",       # 言語
            num=10,             # 1回あたりの取得件数(max10)
            start=startIndex,   # 取得開始インデックス
            searchType="image"  # 検索タイプ
        ).execute())
        startIndex = response[page].get("queries").get("nextPage")[0].get("startIndex")
    except Exception as e:
        print(e)

for i in range(len(response)):
    if len(response[i]['items']) > 0:
        for j in range(len(response[i]['items'])):
            img_list.append(response[i]['items'][j]['link'])

for i in range(len(img_list)):
    http = httplib2.Http(".cache")
    url = img_list[i]
    try:
        imgutil.download_img(path,url)
    except Exception as e:
        print("failed to download image at {}".format(url))
        print(e)
        continue

imgutil.download_imgの実装内容は以下を参照。
imagecrawler/imgutil.py at master · quotto/imagecrawler · GitHub

ポイント

かいつまんでポイントを示します。

google-api-python-client

このプログラムではgoogle-api-python-clientという、超便利なライブラリを利用しています。このライブラリを使うことでGoogle Custom Search APIの利用に関わる煩雑な処理を隠蔽することができます。

パラメータを指定しgoogle-api-python-clientのbuildメソッドでserviceインスタンスを作成します。「api_key」には先程取得したAPIキーを設定します。

パラメータ

Googleへのリクエスト部分のパラメータは以下のとおり。

  • q:検索キーワード
  • cs:取得した検索エンジンID
  • lr:言語
  • num:取得結果数(最大10)
  • start:取得対象の開始インデックス
  • searchType:画像を取得するためには”image”を指定

ループ処理

Google Custom Search APIでは1回のリクエストで取得できる件数は最大10件です。11件目以降を取得するにはパラメータ「start」に開始インデックスを指定します。次のインデックスは返却結果内の「startIndex」に格納されています。

画像URLの取得

リクエスト結果には画像のURLが格納されています。「items」要素からURLを取得し、httpリクエストを発行します。

100件以上は取得できない

最後に、Google Custom Search APIには注意点があります。

それはひとつのキーワードで取得可能な画像数は最大100件ということです。


つまり、

「num=10で100回ループ回せば1,000件の画像が取れるよね?」

に対する答えはNoです。


startIndexが100枚目以降になった場合、Google Custom Search APIはHTTPエラーを返します。

num=10の指定で10回リクエストを投げようが、100回リクエストを投げようが、取得できる画像データは100件までです。


もっとたくさんの画像が欲しい場合はBingやTwitterを使うしかありませんな。

データを集める技術 (Informatics &IDEA)

データを集める技術 (Informatics &IDEA)