用python调用七牛的fetch接口保存网络上的图片
2014-07-19 10:34
691 查看
需求说明
七牛是个好东西免费10G空间10G下载流量10w上传请求100w下载请求 自带CDN和图片处理 对于个人用户和创业公司来说是个很好的平台
本文主要是解决 服务器端请求七牛对网络某文件进行保存这一业务需求
这里是七牛文章中对Fetch API的说明。写的有点复杂,不过用Python sdk比较简单
SDK安装
一般安装
七牛的Python sdk支持 pip 和 easy_install 安装,包名是 qiniu 即:pip install qiniu esay_install qiniu
他们也把SDK托管在GitHub上
这里是SDK的下载
SAE环境安装
对于SAE用户,安装好sae python本地环境后在项目目录(就是有config.yaml 和 index.wsgi的目录)运行:saecloud install qiniu本地环境就会将七牛SDK下载到项目目录的site-packages文件夹中。
修改index.wsgi文件,添加如下代码到文件开头
import os import sys root = os.path.dirname(__file__) sys.path.insert(0, os.path.join(root, 'site-packages'))这样就安装完毕了
写Fetch函数
调用api需要用到七牛的access_key和secret_key。这两个key可以在七牛后台的账号设置中查到。将自己的key填到下面函数的相应位置就行了def qiniufetch(url,bucket,filename): """调用七牛的fetch API 将url的图片存储到七牛""" from base64 import urlsafe_b64encode as b64e from qiniu.auth import digest access_key = "****************************************" secret_key = "****************************************" encoded_url = b64e(url) dest_entry = "%s:%s" % (bucket, filename) encoded_entry = b64e(dest_entry.encode('utf-8')) api_host = "iovip.qbox.me" api_path = "/fetch/%s/to/%s" % (encoded_url, encoded_entry) mac = digest.Mac(access=access_key, secret=secret_key) client = digest.Client(host=api_host, mac=mac) ret, err = client.call(path=api_path) if err is not None: print "Fetch image file\"%s\" failed" % url print err return None else: print "Fetch \"%s\" to qiniu \"%s\" success!" % (url,dest_entry) return "http://%s.qiniudn.com/%s" % (bucket,urllib.quote(filename.encode('utf-8')))
参数说明:
url 要保存文件的url
bucket 要保存到的bucket
filename 要保存的文件名*(有时候也被称为key)
* 注意文件名可以包含反斜杠,因此可以实现伪目录结构
返回值:
保存失败会打印失败的url和相应的错误,并返回None
保存成功会返回在文件在七牛的URL(方便入数据库)
调用Fetch函数
你可以通过传进不同的值来实现保存到不同的地方,譬如我实现了保存到七牛和SAE Storage两个不同地方,通过get传入的值不同,保存到不同的地方。这里只是我在一个crawler中的示例,仅供参考if info['avatr_src']: if avatar_urlfactory: info['avatr_src'] = avatar_urlfactory(info['avatr_src']) if saveto == 'qiniu': filename = "%s/%s-%s.%s" % (prefix, info['name'], todaystr, info['avatr_src'].split('.')[-1]) info["avatar"] = qiniufetch(info['avatr_src'],'akb-member',filename) elif saveto == 'storage': filename = "%s/%s-%s.%s" % (prefix, info['name'], todaystr, info['avatr_src'].split('.')[-1]) info["avatar"] = retrieve(info['avatr_src'],'avatar',filename)
总结
其实是很简单的,不过是翻翻文档的事情而已,Fetch函数也是参考了SDK中的示例不过七牛真是个好东西。如果你没有七牛账号可以来这里注册
相关文章推荐
- python使用PIL缩放网络图片并保存的方法
- python如何获取网络上的图片并将其保存在本地
- Python配合BeautifulSoup读取网络图片并保存在本地
- 微博分享的时候是获取网络的图片需要在微博平台进行获取接口调用权限
- python 网页爬虫+保存图片+多线程+网络代理
- java调用微信sdk图片选择上传保存到七牛
- Linux下python调用C++接口实现图片及文件的AES加解密
- python 网页爬虫+保存图片+多线程+网络代理
- Python 调用摄像头并保存图片
- WPF 如何将软件的所有图片保存在DLL内供主程序调用
- 关于python保存图片的代码
- Python调用C/C++的接口(Boost)
- 新浪微博发布一条微博和图片的接口调用实例
- 将网络中的图片存为NSData并保存到sqlite的BLOB字段中
- 黄聪:python访问抓取网页常用命令(保存图片到本地、模拟POST、GET、中文编码问题)
- 如何从网络获取图片显示并保存到SD卡里
- iphone 从网络上获取图片并保存 详解iPhone应用开发中缓存文件
- 将网络中的图片存为NSData并保存到sqlite的BLOB字段中.
- Silverlight中通过调用WebService来显示数据库中以流形式保存的图片
- python下调用淘宝top接口例子