のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

FrickrのAPIで画像を探してダウンロードする

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

今日はFrickrのAPIの画像検索を紹介したいと思います。

Frickrのデータ取得方法

準備するもの

API Keyの獲得が必要です。
そのためには、Yahoo!への登録とAPIKeyの取得の申請が必要です。

コードをかくにあたって

肝心のコードですが、必要なのは

①検索結果の取得(XML or JSON)
②検索結果からurlを生成する

一応、APIは3600回/1時間の制約が存在するようです。
まず、①の検索結果の取得ですが・・・・

https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key={自分のAPIKey}&text={検索ワード}&format={フォーム}"

それに加えてpageやper_pageで表示ページと一回に表示する画像の数を調整することができます。

これらから得られる結果は以下のようなデータのリストが存在します。

<photo id="15598657457" owner="97499887@N06" secret="965b95f9a0" server="7561" farm="8" title="starr-141103-5249-plant-Malus_pumila-Red_Fuji_fruit-Maui_Lavender_Kula" ispublic="1" isfriend="0" isfamily="0"/>

画像のUrlですが、以下のような形式で取得することができます。

http://farm{farmNo}s.staticflickr.com/{Server No}/{ID}_{secret}.jpg

つまり、上記のようなことを踏まえてコードを考えれば良いということです。

因みにAPIのテストはこちらから実行することができます。

これらを纏めると、以下のようなコードを書くことで自動的に検索ワードからダウンロードできると思います。

ソースコード

#coding:utf-8
from BeautifulSoup import BeautifulSoup
import urllib2, urllib
import os
import cv2
import time

API_KEY = "YOUR_API_KEY"
SEACRET_KEY = "YOUR_SEACRET_KEY"
KEY_WORD = "SEARCH_YOUR_KEY_WORD"

API_URL = "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=%s&text=%s&format=rest" % (API_KEY,KEY_WORD)


class FrickrImage(object):
	def __init__(self,photo_tag=None):
		self.farm = photo_tag["farm"]
		self.server = photo_tag["server"]
		self.secret = photo_tag["secret"]
		self.frickr_id = photo_tag["id"]

	def geturl(self):
		return "http://farm%s.staticflickr.com/%s/%s_%s.jpg" % (self.farm,self.server,self.frickr_id,self.secret)

	def download(self,name=None):
		url = self.geturl()
		if name == None:
			name  = os.path.basename(url)
		img = urllib.urlopen(url)
		localfile = open(name,'wb')
		localfile.write(img.read())
		img.close()
		localfile.close()

def get_url_per_page(api_url):
	opener = urllib2.build_opener()
	html = opener.open(api_url).read()
	soup = BeautifulSoup(html)

	frickr_list = []
	for photo_tag in soup.findAll("photo"):
		fi = FrickrImage(photo_tag)
		frickr_list.append(fi)
	return frickr_list

def download_frickr_all():
        #全て取得するつもりで適当に番号を入れています。ページ制限をつけたい場合は自分で入れてください。
	for page in xrange(1,680):
		api_url = "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=%s&text=%s&format=rest&per_page=%d&page=%d" % (API_KEY,KEY_WORD,100,page)
		frickr_list = get_url_per_page(api_url)
		print len(frickr_list)
		for frickr in frickr_list:
			frickr.download()

if __name__ == '__main__':
	download_frickr_all()