はじめに
機械学習用に画像データが欲しかったので、画像共有サービスのFlickr APIを使って取得するスクリプトを作成しました。
動作環境
- macOS High Sierra Version 10.13
- python 3.6.3
- flickrapi 2.3
- retry 0.9.2
API Keyを取得する
まずは開発者サイトのCreate an appからアプリを登録します。

Request an API KeyからAPI Keyを取得していきます。

その際Yahoo.comのアカウントを求められるので、持っていない場合は新しく作成してログインします。
Yahoo JAPANのアカウントではログイン出来ないので注意して下さい。

ログインすると、作成するアプリが商用かどうか聞かれるので、非商用を選択します。
今回は学習用の画像を取得するだけなので非商用で問題ありません。

アプリ情報を入力します。
利用規約などにチェックを入れてSUBMITしましょう。

API KeyとSecret Keyが取得できます。

Python用のライブラリをインストール
Flickr APIを扱うPython用のライブラリはいくつかありましたが、使いやすそうな以下のライブラリを使うことにしました。
pipでインストールします。
$ pip install flickrapi
APIの使い方に関しては公式リファレンスを参照して下さい。
Flickr APIで画像を取得するスクリプト
キーワードを指定して、ヒットした画像を300枚ローカルフォルダに格納するスクリプトです。
import os
import time
import traceback
import flickrapi
from urllib.request import urlretrieve
import sys
from retry import retry
flickr_api_key = "XXXXXXXXXXXXXXXXXXX"
secret_key = "XXXXXXXXXXXXXXXXXXX"
keyword = sys.argv[1]
@retry()
def get_photos(url, filepath):
urlretrieve(url, filepath)
time.sleep(1)
if __name__ == '__main__':
flicker = flickrapi.FlickrAPI(flickr_api_key, secret_key, format='parsed-json')
response = flicker.photos.search(
text=keyword,
per_page=300,
media='photos',
sort='relevance',
safe_search=1,
extras='url_q,license'
)
photos = response['photos']
try:
if not os.path.exists('./image-data/' + keyword):
os.mkdir('./image-data/' + keyword)
for photo in photos['photo']:
url_q = photo['url_q']
filepath = './image-data/' + keyword + '/' + photo['id'] + '.jpg'
get_photos(url_q, filepath)
except Exception as e:
traceback.print_exc()
コマンドラインからキーワードを指定して実行します。
ポイントはflicker.photos.searchのオプションを指定していることです。
- text
検索キーワード。 - per_page
取得するデータ数。 - media
写真を指定します。 - sort
relevanceで関連順に取得します。 - safe_search
不適切な可能性のあるコンテンツを除外することができます。1が最も安全です。 - extras
取得するデータの種類を指定します。url_qは150×150の画像ファイルURLを、licenseはライセンスの種類を指定しています。
さらに実際に実行してみるとたまに接続に失敗するので、失敗時にリトライするライブラリを使いました。
Flickrから画像ファイルをダウンロードするスクリプトが出来ました。
機械学習する時の学習データ集めなどに使えると思います。