Tech:备份七牛存储

一个干练的脚本完整的 dump 七牛静态存储的资源。

需求阐述

把qiniu 存储的图片,dump 到本地

不再使用本地水印处理,而直接使用七牛提供的水印服务。

所以就想开启原图保护,然后以前的图片要处理怎么办,先 dump 下来再分析。

具体实现

其实很简单,就是分析一下远端 bucket 结构(特别是 prefix),然后本地处理。其实您稍微改改,或许用的着。

先要 pip3 install qiniu,然后可以运行了 python3 qiu_dump.py

运行截图大致如下:

dump过程

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# -*- coding: utf-8 -*-
from qiniu import Auth
from qiniu import BucketManager
import requests
import os

access_key = ''
secret_key = ''
bucket_name = ''
bucket_url = '' # 带上 `/` 尾巴
prefix = None # 默认是整个空间
limit = 720 # 最大数目限制(超过了没关系)

delimiter = None # 列举出除'/'的所有文件以及以'/'为分隔的所有前缀
marker = None # 标记
path = '/Users/ch-yk/TMP/blog_img/' # 本地存储目录(不存在会自动创建)
q = Auth(access_key, secret_key)
bucket = BucketManager(q)

ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)

counter = 1 # 以便在 console 上有一个进度显示

for i in ret['items']:
#print(i['key'])
base_url = bucket_url + i['key']
#print(base_url)
#如果空间有时间戳防盗链或是私有空间,可以调用该方法生成私有链接
#private_url = q.private_download_url(base_url, expires=100)
#print(private_url)
r = requests.get(base_url)
if r.content:
if not os.path.exists(path):
os.makedirs(path)
# key: blog/2017-12-03-Validate.jpg
sub_path = ''
file_name = ''
if not '/' in str(i['key']):
sub_path = ''
file_name = str(i['key'])
else:
sub_path = str(i['key']).split('/')[0] + '/'
if not os.path.exists(path + '/' + sub_path):
os.makedirs(path + '/' + sub_path)
file_name = str(i['key']).split('/')[1]
full_file = path + sub_path + file_name
print(full_file, ' ', counter)
counter += 1

if os.path.exists(full_file):
continue
file = open(full_file, "wb")
file.write(r.content)
file.flush()
file.close()

这是仓库 地址

可由您改进

下面这些并不是我的需求,但可能是称为需求的项:

中途被终止,或者异常了怎么办?

没关系,存在的文件它就不会往本地重复写。

此处可被优化,先查 key,在去真的 requests.get;我懒得写,有需求的朋友可以自己实现。

如果远端的某个 url 子路径需要被忽略怎么办?

那么就在检查 key 的前缀时判断一下,是它我就略过去。

limit 限制怎么改进

稍微看一下就知道,Bucket 得到的数量是真实数据,指定一下比较策略即可。


CH-YK 2019-04-05 先这样


文章目录
  1. 1. 需求阐述
  2. 2. 具体实现
  3. 3. 可由您改进
|