但是找了半天都找不到现成的工具和代码,无奈只能自己写一个了,感兴趣请看我的 github https://github.com/pzqu/pictureurlsto_oss
涉及Python知识点:
文件的写入写出
正则替换和查找
随机生成不重复的uuid
阿里云oss包
下载Url资源
简单知识点:
循环
对象存储?
想要建站最好把图片存储在对象存储里,然后开cdn加速,这样不仅可以减轻自己服务器的存储压力,同时阿里/腾讯会用他们的服务器和技术让你的图片加载的速度飞快,轻易不会产生数据丢失。
阿里云: https://www.aliyun.com/腾讯云:https://cloud.tencent.com/
找到对象存储,申请即可,拿到访问密码信息。
核心代码讲解
因为wordpress的博客文章是存储的mysql
数据库里的
- 只要导出sql脚本
- 找到文件里的所有匹配的
url
,把图片下载下来 - 再上传到
oss
- 最后替换sql文件,再导入回去就行了
获取匹配的url
读取文件,把匹配的url拿到
f_obj = open(file_name, 'r+', encoding="utf-8") contents = f_obj.read() reg = re.compile('\(https://cdn\.nlark\.com/yuque.*?\)') url_markdown = reg.findall(contents)
用字典存起来
把拿到的url
当作key
存到dict
里
for i in url_markdown: img_dic[i[1:-1]] = { "img": "", "oss": "" }
下载图片
def download_img(pic_url): name = get_random_pic_name(pic_url) r = requests.get(pic_url, stream=True) f = open(img_dic_path + "/" + name, "wb") for chunk in r.iter_content(chunk_size=512): if chunk: f.write(chunk) return img_dic_path + "/" + name
上传图片到对象存储
def oss_upload(upload_path, src_path): auth = oss2.Auth(AccessKeyID, AccessKeySecret) bucket = oss2.Bucket(auth, EndPoint, BucketName) bucket.put_object_from_file(upload_path, src_path)
替换文件中的老url
def alter(file, old_str, new_str): with open(file, "r", encoding="utf-8") as f1, open("%s.bak" % file, "w", encoding="utf-8") as f2: for line in f1: f2.write(re.sub(old_str, new_str, line)) os.remove(file) os.rename("%s.bak" % file, file)
比较蛋疼的是写完才发现,是手机端不支持webp格式的图片,明天再看吧。