python&FlickrAPIを使ってwebサイトの画像を収集する方法

スポンサードリンク



こんにちは。sinyです。

この記事では、Flickerという画像検索WEBサイトからPythonを使って画像データを自動収集する方法をご紹介します。

Flickerとは?

Flickerとは個人の写真や画像を共有できるサイトです。

日本語で検索してもちゃんと検索結果が表示されるので機械学習、ディープラーニングの画像素材としても利用できると思います。

今回は、Frickrサイトに対応したAPI「flickrapi」を使って指定したキーワードの画像を自動収集するプログラム例を紹介します。

 

まずはAPIキーとSecretキーを取得しよう

flickrapiを利用するには、以下のステップが必要です。

  • Yahoo.comのIDを取得(yahoo.co.jpのユーザは不可で.comのユーザが必要
  • APIキーとSecretキーの取得

以下の手順に従ってAPIキーを発行しましょう。

Flickrにアクセスして、画面右上の「Sign up」ボタンを押します。

以下のようにyahoo.comのユーザ登録画面が表示されるのでユーザ登録をしましょう。

 yahoo.co.jpのユーザIDではログオンできないので注意!

ユーザ登録が完了したら改めてFlickrにアクセスして、画面したの「Developers」をクリック。

下記画面の「API」をクリック。

下記画面の「Request an API key」をクリック。

下記画面の「Request an API Key」をクリック。

Flickrへのログオン画面が表示されるので、Emailアドレスを入力してログオンしましょう。

Non-Commercial」の「APPLY FOR A NON-COMMERCIAL KEY」をクリック。

アプリの名前(任意)と、アプリの説明を適当に入力して「SUBMIT」を押しましょう。

KEYとSecretが発行されるので、テキストなどにコピペしておきましょう。

FlickerAPIでデータ取得

APIキーの取得ができたら、いよいよAPIを使って画像データを自動取得してみます。

今回は、インタラクティブに動作確認するためJupterNotebook上でプログラムを実行してみます。

まずは、必要なモジュールをインストールします。

pip install flickrapi
pip install jupyter

 

jupyter notebookコマンドでNotebookを起動して新しいノートを作ったら以下のコードを記載していきましょう。

from flickrapi import FlickrAPI
from urllib.request import urlretrieve    #画像をダウンロードする際に利用
import os, time, sys

key ="<APIキーを指定>"
secret = "<Secretキーを措定>"
wait_time = 1 #検索のWait時間を指定(1秒間隔で取得)
keyword = "ねこ"   #検索したいキーワードを指定
savedir = "./" + keyword   #画像を保存するディレクトリを指定
flickr = FlickrAPI(key, secret, format='parsed-json')   #FlickrAPIクラスからインスタンスを生成
keyword = "ねこ"   #検索したいキーワードを指定

 

FlickrAPIクラスにAPIキー、Secret情報とフォーマットを指定してflickrインスタンスを作成します。
検索キーワードは「ねこ」とします。

続いて、flickr.photos.searchメソッドを使ってAPI経由で「ねこ」画像の情報を取得します。

result = flickr.photos.search(
    text = keyword,   #検索キーワードを指定
    per_page = 100,   #取得枚数を指定
    media = 'photos',   #データの種類を指定
    sort = 'relevance', #最新から取得
    safe_search = 1,  #暴力的な画像は対象外にする
    extras = 'url_q, license' #URLとライセンス情報を取得する。
    )

 

flickr.photos.searchメソッドの詳細パラメータについて知りたい方は以下を参照してみてください。

 

今回は、「ねこ」の画像情報を100枚取得してみます。
上記コードを実行すると、result変数には長さ2のdict型のデータ(result['photos']とresult['stat']の2つ)が格納されます。

写真に関するデータはキーが「photos」の方に複数個格納されています。(下記参照)

{'photos': {'page': 1, 'pages': 585644, 'perpage': 2, 'total': '1171287', 'photo': [{'id': '5306800458', 'owner': '54021464@N03', 'secret': '3c6d555650', 'server': '5130', 'farm': 6, 'title': 'Motorbike', 'ispublic': 1, 'isfriend': 0, 'isfamily': 0, 'license': '4', 'url_q': 'https://live.staticflickr.com/5130/5306800458_3c6d555650_q.jpg', 'height_q': '150', 'width_q': '150'}, {'id': '3434982322', 'owner': '58616528@N00', 'secret': '37a55ac118', 'server': '3584', 'farm': 4, 'title': 'Motorbike', 'ispublic': 1, 'isfriend': 0, 'isfamily': 0, 'license': '0', 'url_q': 'https://live.staticflickr.com/3584/3434982322_37a55ac118_q.jpg', 'height_q': '150', 'width_q': '150'}]}, 'stat': 'ok'}

では実際にAPI経由でねこの写真データをダウンロードしてみます。

photos = result['photos'] #写真データ部分を取り出す。
download_path = os.path.join(current_dir, keyword)   #検索ワードのフォルダパス

for i, photo in enumerate(photos['photo']):
    url = photo['url_q']
    filepath = savedir + '/' + photo['id'] + '.jpg'
    if not os.path.exists(download_path): #検索ワードのフォルダがなければ生成
        current_dir = os.path.dirname(os.path.abspath("__file__")) 
        os.mkdir(os.path.join(current_dir, keyword))
    urlretrieve(url, filepath)   #写真データをダウンロード
    time.sleep(wait_time)   #1秒待機

 

photos['photo']に写真情報が格納されているので、enumerateでループ処理を回して画像のURL情報photo['url_q']を取得した後、urlretrieveメソッドを使って指定したURLの画像をローカルPC上にダウンロードします。

こんな感じでファイルがダウンロード出来ればOKです。

以上、Flickerを利用した画像データの自動収集方法でした。

とっても簡単に大量画像を自動収集できるので、ぜひ試してみてください。

 

おすすめの記事