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()