获取Flickr图片URL地址
任务
网站首页图片动态更新
描述
Twitter首页每次刷新都会有一张不同的图片,Bing每天更新首页图片,并附有详细的介绍。想借鉴到自己的网站上。但我没有素材,只能从网上寻找资源自动更新。从网上找到一系列图片,再随机返回一张图片的URL,就可以实现动态更新。
一开始,我想用搜索特定关键词返回一系列图片,感觉这样比较费劲,一直没尝试。最好和热点新闻一样,找到一个热门图片之类的网站。正好Flickr中有探索发现的栏目,它的API也提供一个类似的功能:flickr.interestingness.getList 。官方说明如下
Returns the list of interesting photos for the most recent day or a user-specified date.
“有意思”的图片列表,正是我需要的!默认返回100个图片,只需要随机选择一个即可。返回列表如下:
[xml]
[/xml]
下面只需要从photo id得到图片的URL即可,Flickr api提供flickr.photos.getSizes返回照片所有尺寸和相应的URL。返回结果如下:
[xml]
工具
**flickrpy ** https://code.google.com/p/flickrpy/
flickr api的python sdk。
实现
利用flickrpy实现如下:
[python]
import random
import flickr
photos = flickr.interestingness()
photo_no = random.randint(0, len(photos) – 1)
photos_sizes = photos[photo_no].getSizes()
front_image[‘index’] = photo_no
front_image[‘url’] = photos_sizes[0][‘source’]
for a_size in photos_sizes:
if a_size[‘label’] == ‘Medium 640’:
front_image[‘source’] = a_size[‘source’]
front_image[‘url’] = a_size[‘url’]
[/python]
优化
国内访问Flickr速度太慢,每次开网页都运行上面程序会等待很长时间,尤其获取多个图片网址时多次调用API,速度更慢,无法再交互环境中使用。可以利用memcached等缓存机制,一次操作获取多个图片网址,保存在内存中,打开网页时从内存中随机选择一个网址即可。而获取多个网址的操作可以放到后台运行。
我从100个图片中选择10个图片获取网址放入内存中。
[python]
import pylibmc
import flickr
def updateFrontImage():
total_image_count = 10
front_image_list = []
photos = flickr.interestingness()
photos_select_no_list = random.sample(
range(0, len(photos) – 1), total_image_count)
for a_photo_no in photos_select_no_list:
a_front_image = {}
a_front_image[‘index’] = a_photo_no
a_front_image[‘title’] = photos[a_photo_no].title
a_front_image[‘description’] = photos[a_photo_no].description
# size
a_photo_sizes = photos[a_photo_no].getSizes()
a_front_image[‘url’] = a_photo_sizes[0][‘source’]
for a_size in a_photo_sizes:
if a_size[‘label’] == ‘Medium 640’:
a_front_image[‘source’] = a_size[‘source’]
a_front_image[‘url’] = a_size[‘url’]
front_image_list.append(a_front_image)
mc = pylibmc.Client()
mc.set(“front_image_list”, front_image_list)
return
[/python]
调用时,只需从内存中获取列表即可。我还对列表随机洗牌。
[python]
mc = pylibmc.Client()
front_image_list = mc.get(“front_image_list”)
random.shuffle(front_image_list)
[/python]
参考资料
Flickr api
Flickr的URL命名规范参见
<//www.flickr.com/services/api/misc.urls.html>
先用search搜索图片
//www.flickr.com/services/api/explore/flickr.photos.search
再用getSizes获取图片地址
//www.flickr.com/services/api/explore/flickr.photos.getSizes
其他方式
获取最近的图片
//www.flickr.com/services/api/flickr.photos.getRecent.html
获取有趣的图片
//www.flickr.com/services/api/flickr.interestingness.getList.html
参考文章 //luck-donkey.iteye.com/blog/423965
巴巴变API
//www.bababian.com/api/getRecommendPhoto.htm