使用python批量下载七牛云里的图片

使用python批量下载七牛云里的图片

最近我在整理我拍的照片,我的照片全都存在了七牛云里,数量比较多,如果我要一个个从网页上下载比较麻烦,所以我就学习了一下七牛云官方网站提供的SDK和api接口,发现用七牛SDK批量下载比较麻烦,所以我自己想出了一种好办法。
办法挺简单,就是先用七牛的python版sdk获取图片文件列表,之后再用requests库下载,同时优化了下载进度显示,改进了一位大哥的进度条显示代码,用以观察下载进度。

1. 七牛云SDK安装使用

安装挺简单,就是pip一下。

pip install qiniu

使用如官网文档所示,https://developer.qiniu.com/kodo/sdk/1242/python
用sdk获取完图片文件列表之后,先用json.dumps()格式化输出一遍获取的json串,再用JsonPath提取里面的图片文件名称。具体实例代码如下。

import sys
from urllib.parse import urlsplit

import requests
from qiniu import Auth, BucketManager
import qiniu.config
import json
import jsonpath

# 七牛的秘钥对
access_key = 'xxxxx-dddgffghdxxxxxxxx-dddd'
secret_key = 'xxxxxx-xxxxxxxxxxxxxxxxxxxxxxx'
# 存储空间的名称
bucket_name = 'xxxxxxx'

q = Auth(access_key, secret_key)
bucket = BucketManager(q)
# 前缀
prefix = ['blog']
# 列举条目
limit = 1000
# 列举出除'/'的所有文件以及以'/'为分隔的所有前缀
delimiter = None
# 标记
marker = None
ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)
# 格式化获取的Json文件列表
print(json.dumps(ret, sort_keys=True, indent=2))
# 使用JsonPath提取图片文件名称
images_keys = jsonpath.jsonpath(ret, '$..key')
# 显示图片数量
print(len(images_keys))

执行截图:
sdk执行截图

2. 显示下载图片进度

有了文件列表,剩下的就是拼接url下载图片了,在下载图片之前我们还得写个展示进度的方法,因为图片比较大,所以要显示出文件的大小,已经下载的大小,下载进度的百分比及进度条。
代码如下,我是改进了一个别人写好的现成的方法。

def download_progressbar(file_url, base_path):
    '''
    下载文件及进度显示
    :param file_url: 文件url
    :param base_path: 本地目录,用于保存文件
    :return: 
    '''
    response = requests.get(file_url, stream=True, verify=False)
    # 获取文件大小
    total_size = int(response.headers['Content-Length'])
    temp_size = 0
    with open(base_path + urlsplit(file_url).path, "wb") as f:
    	# 每次写入大小,文件较大时,防止内存不足,分次写入
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                temp_size += len(chunk)
                f.write(chunk)
                f.flush()
                done = int(50 * temp_size / total_size)
                # 显示 已下载大小,总大小,进度条,百分比
                sys.stdout.write("\r%d:%d [%s%s] %d%%" % (
                total_size, temp_size, '█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
                sys.stdout.flush()
    print()

执行下载代码

base_imageUrl = r'http://qn.xxxxxx.xxxxx/'
base_save = r'e:\\Qiniu'

for p in images_keys:
	image_ulr = base_imageUrl+p
	print(p)
	download_progressbar(image_ulr,base_save)

执行效果动态图
下载动态效果图
进度条效果截图
进度条截图

3. 参考链接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章