使用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))
執行截圖:
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)
執行效果動態圖
進度條效果截圖