PythonでFlickr APIを使って写真を検索する(その2)

前回では検索結果をJSON形式で取得できることがわかったので、写真をダウンロードしてみます。

実験環境

  • ThinkPad X200
  • Windows7 Professional 64bit
  • Python 2.7.3

写真をダウンロードする

検索結果から写真が保存されているURLを得るために、Photo Source URLsに仕様が書かれています。

これによると写真のURLは下記フォーマットで決定されることがわかります。

https://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}.jpg

前回エントリーで取得した結果と比べてみると、

      {
        "farm": 4,
        "id": "14676462357",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "107369966@N07",
        "secret": "de3d8c1e63",
        "server": "3882",
        "title": "Fruits Daifuku picture2"
      },

farm-idにfarmの値を、server-idにserverの値を、idにidの値を、secretにsecretの値をあてはめてURLを作れば、写真が保管されているURLになります。

前回エントリーのプログラムをベースにして、"daifuku"の写真を50枚ダウンロードするプログラムを書いてみました。

# -*- coding: utf-8 -*-

import requests

url = 'https://api.flickr.com/services/rest/'
API_KEY = 'YOUR API KEY'

payload = {
    'method': 'flickr.photos.search',
    'api_key': API_KEY,
    'text': 'daifuku',
    'per_page': '50',
    'format': 'json',
    'nojsoncallback': '1'
    }

r = requests.get(url, params=payload)

resp = r.json()
tpl_url = 'https://farm%s.staticflickr.com/%s/%s_%s.jpg'
count = 1
for i in resp['photos']['photo']:
    img_url = tpl_url % (i['farm'],i['server'],i['id'],i['secret'])
    print "#%04d" % count, img_url
    r = requests.get(img_url)
    fname = "%04d.jpg" % count
    f = open(fname, 'wb')
    f.write(r.content)
    f.close()
    count += 1

実行させると、おいしうな大福の写真がダウンロードできました。でもちょっと違う写真もちらほら見えます。検索APIにはパラメータが数多くあるので、いろいろと試してみるとおもしろそうです。

WS000054

Python

Posted by skw