こんにちは。
前回はTwitter search APIを使ってTwitterから画像データを自動収集する方法をまとめました。
blog.wackwack.net
今回はGoogleCustomSearch APIを使った画像自動収集プログラムを作成しましたので、必要な手順を紹介します。
カスタム検索エンジンの作成とAPIキーの発行
GoogleCustomSearch APIを使うには「カスタム検索エンジンの作成」と「APIキーの発行」が必要となります。
GoogleCustomSearch APIではAPIキーを使って認証を行い、作成したカスタムエンジンに対して検索リクエストを投げる仕組みになっています。
カスタム検索エンジンの作成
まずはGoogleカスタム検索にログインしましょう。
ログイン後に「Add」をクリックします。
必要項目を入力して「作成」をクリックします。
- 検索するサイト:任意のURLを入力します。(この後の手順で設定は削除するので何でもOK)
- 言語:日本語
- 検索エンジンの名前:任意の名前を入力します。
作成完了後の画面左側から、作成したカスタム検索エンジンを選択して「設定」をクリックします。
設定画面で以下のとおり設定を行います。(この画面では「保存」ボタン等をクリックする必要はありません。)
- 画像検索:「オン」に設定
- 検索するサイト:「追加したサイトを重視して、ウェブ全体を検索する」を選択
- サイト:表示されているサイトをチェックして「削除」する
ここまで完了したら設定画面の「検索エンジンID」をクリックして、表示されるIDを確認します。この値をプログラム上で利用します。
APIキーの発行
続いてAPIキーを発行します。APIの利用状況(1日のクエリ発行数など)はこのキーで管理されます。
Custom Search JSON/Atom APIにアクセスし、画面中央の「GET A KEY」をクリックします。
表示されたダイアログで「Create My Project」を選択します。これから発行するAPIキーはこの「プロジェクト」の中で管理されます。
適当な名前を入力して「NEXT」をクリックします。
作成が完了すると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キーを設定します。
パラメータ
- 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を使うしかありませんな。

- 作者: 佐々木拓郎
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/11/29
- メディア: Kindle版
- この商品を含むブログを見る