python+shell 备份 csdn 博客文章3 备份图片

柔光的暖阳◎ 2022-05-21 04:35 372阅读 0赞

python+shell 备份 csdn 博客文章3 备份图片

前面,我们将所有的博客文章全部备份下来了。但是,博客当中的那些图片,还是散落在各处。有的在第三方的网站上,有的在 CSDN 的服务器上,有的直接引用的其他地方的图片。

前几天,我写了一篇博文《利用 github 和 python3 以及 MWeb 打造自己的博文图床》,搞了一个自己的本地图床服务,然后将所有图片推送到 github 服务上,利用 githubraw 地址,就搞到了一个不限量的好图床。

依然如此,那就折腾一下,将我所有博文中的图片,全部上传到那里去,并且将文章中的所有的图片地址,全部换成 github 的地址。

说干就干,首先想思路:

备份图片的整体思路

  1. 通过循环每一个博客文章文档的每一行内容,查找所有的图片路径,并保存为字典。
  2. shell 循环这个字典下载所有的图片文件
  3. 再写一个脚本,循环所有的图片文件,全部 post 到我的图床服务
    并且,将图片文件名,和返回的文件名,生成字典,用于下一步的操作。
  4. 再一次循环博客文章的每一行内容,通过上一步匹配的字典,将原有的图片路径替换为更新后的路径。

任何一个复杂的问题,我们认真分析后都能够解决。

查找所有图片路径脚本

  1. #!/usr/bin/env python3
  2. # -*- coding: UTF-8 -*-
  3. import linecache
  4. import requests as req
  5. from io import BytesIO
  6. import json
  7. import os
  8. def saveImg (mdFile):
  9. print(mdFile)
  10. with open(mdFile, 'r', encoding="utf-8") as mdTxt:
  11. for line in mdTxt:
  12. if '![' in line and '](' in line:
  13. imgUrl = line.split('(')[1].split(')')[0]
  14. print('\t' + imgUrl)
  15. os.system('echo "' + imgUrl + '" >> imgUrl.txt')
  16. def findMdFile ():
  17. sdir = './markdown/'
  18. res = []
  19. for f in os.listdir(sdir):
  20. fp = os.path.join(sdir, f)
  21. if '.md' in fp:
  22. res.append(fp)
  23. for i in res:
  24. saveImg(i)
  25. findMdFile()

好,通过这个脚本,我们就把所有的图片路径,全部保存在了 imgUrl.txt 这个文本文件里面了。

下载所有的图片

本来尝试用 python 下载的,但是总是403,遂作罢。

建立一个专门存放图片的 img 文件夹,然后新建一个脚本文件,输入以下内容:

  1. for i in $(cat ../imgUrl.txt); do
  2. curl -O $i;
  3. sleep 1;
  4. done

运行,经过十几分钟的等待,所有的图片都已经下载好了。

具体多长时间,要看你博文的图片数量。

将图片上传到我的图床服务

这里我是用我自己的解决方案,如果你是使用第三方的图床,可以简单修改下面的脚本就可以实现你的需要。

  1. #!/usr/bin/env python3
  2. # -*- coding: UTF-8 -*-
  3. import os
  4. import imghdr
  5. import requests as req
  6. import json
  7. # 在源目录中找到所有图片并输出为数组
  8. def findImg(sdir):
  9. res = []
  10. for f in os.listdir(sdir):
  11. fp = os.path.join(sdir, f)
  12. if not os.path.isdir(fp):
  13. if imghdr.what(fp):
  14. res.append(fp)
  15. return res
  16. def upImg ():
  17. imgs = findImg('./img/')
  18. for i in imgs:
  19. files = {
  20. 'file': ('imgName', open(i, 'rb'), 'image/jpeg')}
  21. r = req.post('http://localhost:7000/upimg', files=files)
  22. rJson = json.loads(r.text)
  23. if rJson['status'] == 0:
  24. rPath = rJson['data']['path']
  25. os.system('echo "' + i + '\t' + rPath + '" >> imgDict.txt')
  26. print('Succ: ' + i + ' | ' + rPath)
  27. else:
  28. os.system('echo "' + i + '" >> imgErr.txt')
  29. print('upErr: ' + i)
  30. print(i)
  31. upImg()

通过这个脚本,我们将所有的图片,全部上传到了我的图床服务里面了。并且,返回了一个 imgDict.txt 的字典文件,里面对比新老图片地址。

替换所有博文中的老图片地址为新图片地址

写上面的脚本的时候,输出的字典是一个用制表符分割的字典。为了方便使用,我批量改成了数组包含元组的格式。然后重命名为 imgDict.py 方便在下面的脚本使用。

字典格式为 DICT = [('oldName', 'newPath'), ('oldName', 'newPath')]

748c0a09b7487ee3947e62da3c886b.jpg

  1. #!/usr/bin/env python3
  2. # -*- coding: UTF-8 -*-
  3. import linecache
  4. import requests as req
  5. from io import BytesIO
  6. import json
  7. import os
  8. import imgDict
  9. imgFix = 'https://raw.githubusercontent.com/fengcms/articles/master/image'
  10. DICT = imgDict.DICT
  11. def writeFile (i, line, tarFile):
  12. if i == 0:
  13. with open(tarFile, 'w+') as f:
  14. f.write(line)
  15. f.close()
  16. else:
  17. with open(tarFile, 'a') as f:
  18. f.write(line)
  19. f.close()
  20. def reImg (line):
  21. if '![' in line and '](' in line:
  22. for i in DICT:
  23. if i[0] in line:
  24. return '![](' + imgFix + i[1] + ')'
  25. return line
  26. def saveImg (mdFile):
  27. mdName = mdFile.replace('markdown/', '').replace('/', ':')
  28. print(mdName)
  29. souFile = open('markdown/' + mdName, 'r', encoding="utf-8")
  30. tarFile = './calcMarkdown/' + mdName
  31. with souFile as mdTxt:
  32. i = 0
  33. for line in mdTxt:
  34. writeFile(i, reImg(line), tarFile)
  35. i += 1
  36. def findMdFile ():
  37. sdir = 'markdown/'
  38. res = []
  39. for f in os.listdir(sdir):
  40. fp = os.path.join(sdir, f)
  41. if '.md' in fp:
  42. res.append(fp)
  43. for i in res:
  44. saveImg(i)
  45. findMdFile()

好,通过上面的脚本,我顺利的将所有博客文章中的图片路径全部替换为新的图片路径,并保存到了 calcMarkdown 目录下面。

e141832c15be2a22a06431ae7c4343.jpg

shell 学得不好,不过我感觉,最后一步用 python 还是代码量太多了,换成 shell 可能三两行就好了。不过目的已经达到,懒得接着研究了。

其实对于看官来说,重点不在于我做了写什么,而是这些代码都是比较基础的 python 代码,希望对于看官能有所帮助。

本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。

发表评论

表情:
评论列表 (有 0 条评论,372人围观)

还没有评论,来说两句吧...

相关阅读