使用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. 參考鏈接

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