python Flickr APIの使用

前提として、yahoo.comのアカウント作成とFlickr APIのページでKeyとSecretを生成し、FlickrAPIを使用するのに必要なモジュール(flickrapiモジュール)をインストールした状態で始める。あと、imageディレクトリも作成しておく。

f:id:hanamichi_sukusuku:20210224203115p:plain

実行結果

f:id:hanamichi_sukusuku:20210224205124p:plain

imageディレクトリ以下にそれぞれの料理名のディレクトリが作成され、300枚ずつの画像がダウンロードされる。

 

Flickrとは写真共有サイトで、ここで提供する写真を写真検索APIを利用して、様々な種類の写真を集めることができる。

 

APIキーとシークレットの定義

key = "a880b66929d40bdc255e3cb6b28eaa56"
secret = "885f6135fc82a8e5"
wait_time = 1 # 待機秒数(1以上を推奨)

このキーとシークレットがないとAPIを使用できない。

wait_timeは一度に大量の画像をダウンロードしようとすると、Flickrのサーバーに負荷をかけてしまうので、写真を1枚ダウンロードするごとに1秒のウエイトをおくために定義している。

 

main()関数の呼び出し

if __name__ == '__main__':
  main()

 

main()関数、キーワードとディレクトリ名を指定してファイルをダウンロード

def main():
go_download('マグロ 寿司', 'sushi')
go_download('サラダ', 'salad')
go_download('麻婆豆腐', 'tofu')

go_download()関数にキーワードとディレクトリ名を渡す。

今回は3種類だが、他のキーワードを入力すればそのキーワードの写真もダウンロードできる。

 

go_download()関数、Flickr APIで写真を検索しダウンロード

f:id:hanamichi_sukusuku:20210224205008p:plain

この関数によってFlickr APIを使用して写真をダウンロードする。

 

flickr = FlickrAPI(key, secret, format='parsed-json')

この部分でFlickr APIにアクセス。(キー、シークレット、受け取るフォーマットの指定(今回はjson))。

生成されたオブジェクトからphotos.search()でキーワードで写真を検索。

・text = keyword(変数) 検索語

・per_page = 300 取得件数

・media = photos 写真の検索を指定、videosと指定すると動画のみになる。

・sort = 'relevance' 検索語の関連順に並べる、relevanceは最新のものからの取得を指定。

・safe_search = 1 不適切な画像を除外してくれる、1~3があり1が最も安全。

・extras = 'url_q, license' 余分に取得するデータの種類を指定、複数の場合は,で区切る。url_qは150✖️150の画像ファイルURLの取得を指定。licenseはライセンス情報の取得を指定。

このflickr.photos.search()で取得した変数resの中身は

f:id:hanamichi_sukusuku:20210224211956p:plain

このようになっている。寿司、マグロのキーワードで検索したときの中身。

キーワードに関連した写真データが取得できていることがわかる。extrasに指定したurl_q,licenseもちゃんと取得できている。これらのデータはphotosという名前のキーに格納されているため

photos = res['photos']
pprint(photos)

 

res['photos']で変数photosにphotosの値を格納。

pprintモジュールではリストや辞書型のデータを綺麗に整形して出力してくれる。

pprint(photos)で辞書型のデータを整形し出力。

 

ここまでで、Flickr APIにアクセスし、辞書型で300枚の画像に関するデータは取得できた。これ以降で画像データをダウンロードしていく。

f:id:hanamichi_sukusuku:20210224213346p:plain

try-exceptを使用し、tryの後に例外が発生するかもしれないが実行したい処理を、exceptの後に例外が発生した時の処理を記述する。

 

enumerate(photos['photo'])では先ほど、変数resの中身を見てわかる通り、一枚ずつの写真データは文字列photoをキーとして格納されているので、そのデータを取得し、ループ処理をしている。

変数filepathで保存先のパスを作成。

urlretrieve()はネット上からファイルをダウンロードするために使用。

urlretrieve(ダウンロードしたいファイルのURL, 保存先のパス)

timeモジュールでは時刻に関する様々な関数を使用することができる。sleep()関数を実行することで処理を一時停止させる。これは一度に大量の画像をダウンロードしようとすると、Flickrのサーバーに負荷をかけてしまうので、写真を1枚ダウンロードするごとに1秒のウエイトをおくため。

 

exceptの処理では標準ライブラリのtracebackを使用することで発生した例外がどんな原因なのかを出力するようにしている。