专栏首页地方网络工作室的专栏python+shell 备份 csdn 博客文章

python+shell 备份 csdn 博客文章

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

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

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

备份图片的整体思路

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

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

查找所有图片路径脚本

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import linecache
import requests as req
from io import BytesIO
import json
import os

def saveImg (mdFile):
    print(mdFile)
    with open(mdFile, 'r', encoding="utf-8") as mdTxt:
        for line in mdTxt:
            if '![' in line and '](' in line:
                imgUrl = line.split('(')[1].split(')')[0]
                print('\t' + imgUrl)
                os.system('echo "' + imgUrl + '" >> imgUrl.txt')

def findMdFile ():
    sdir = './markdown/'
    res = []
    for f in os.listdir(sdir):
        fp = os.path.join(sdir, f)
        if '.md' in fp:
            res.append(fp)

    for i in res:
        saveImg(i)

findMdFile()

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

下载所有的图片

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

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

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

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

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

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

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

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import os
import imghdr
import requests as req
import json


# 在源目录中找到所有图片并输出为数组
def findImg(sdir):
    res = []
    for f in os.listdir(sdir):
        fp = os.path.join(sdir, f)
        if not os.path.isdir(fp):
            if imghdr.what(fp):
                res.append(fp)
    return res

def upImg ():
    imgs = findImg('./img/')
    for i in imgs:
        files = {'file': ('imgName', open(i, 'rb'), 'image/jpeg')}
        r = req.post('http://localhost:7000/upimg', files=files)
        rJson = json.loads(r.text)
        if rJson['status'] == 0:
            rPath = rJson['data']['path']
            os.system('echo "' + i + '\t' + rPath + '" >> imgDict.txt')
            print('Succ: ' + i + ' | ' + rPath)
        else:
            os.system('echo "' + i + '" >> imgErr.txt')
            print('upErr: ' + i)
        print(i)

upImg()

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

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

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

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

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import linecache
import requests as req
from io import BytesIO
import json
import os
import imgDict

imgFix = 'https://raw.githubusercontent.com/fengcms/articles/master/image'

DICT = imgDict.DICT


def writeFile (i, line, tarFile):
    if i == 0:
        with open(tarFile, 'w+') as f:
            f.write(line)
            f.close()
    else:
        with open(tarFile, 'a') as f:
            f.write(line)
            f.close()

def reImg (line):
    if '![' in line and '](' in line:
        for i in DICT:
            if i[0] in line:
                return '![](' + imgFix + i[1] + ')'
    return line

def saveImg (mdFile):
    mdName = mdFile.replace('markdown/', '').replace('/', ':')
    print(mdName)
    souFile = open('markdown/' + mdName, 'r', encoding="utf-8")
    tarFile = './calcMarkdown/' + mdName
    with souFile as mdTxt:
        i = 0
        for line in mdTxt:
            writeFile(i, reImg(line), tarFile)
            i += 1

def findMdFile ():
    sdir = 'markdown/'
    res = []
    for f in os.listdir(sdir):
        fp = os.path.join(sdir, f)
        if '.md' in fp:
            res.append(fp)

    for i in res:
        saveImg(i)

findMdFile()

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • React + webpack 开发单页面应用简明中文文档教程(一)一些基础概念

    版权声明:本文为 FengCms FungLeo 原创文章,允许转载,但转载必须注明出处并附带首发链接 ...

    FungLeo
  • React + webpack 开发单页面应用简明中文文档教程(十)在 jsx 和 scss 中使用图片

    版权声明:本文为 FengCms FungLeo 原创文章,允许转载,但转载必须注明出处并附带首发链接 ...

    FungLeo
  • Python3 初学实践案例(2)将源目录中的图片用MD5命名并可以设定目标目录

    Python3 初学实践案例(2)将源目录中的图片用MD5重命名后移动或复制到目标文件夹 尝试了一下用 python 实现了一个生成密码的程序。感觉还是比较好上...

    FungLeo
  • Python2运行时查看线程信息

    kongxx
  • 高质量代码-智慧城市GIS平台后端代码

    《高质量代码-智慧城市GIS平台数据表设计》一文介绍了项目中的数据库表设计。此文介绍优良合理的表设计给后端接口开发带来的便利性。

    MiaoGIS
  • C# 从1到Core--委托与事件

      委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变。本文温故一下这些改变,以及在NET Core中关于事件的一点改变。

    FlyLolo
  • 基于Opendaylight的packet-in flooding攻击的检测与防护

    作者简介:智智方,西安电子科技大学硕士研究生,主要研究方向为SDN与网络安全,邮箱:675520574@qq.com

    SDNLAB
  • Linux系统下移植busybox中mkfs.vfat命令

    为了延长磁盘寿命来存储音视频文件,打发在格式化磁盘过程中将簇的大小设置大点。因为存储的音视频文件现对较大,那么将簇大小设置得尽可能大,这样可以增强磁盘读取数据的...

    砸漏
  • Python如何使用bokeh包和geojson数据绘制地图

    最近要绘制伦敦区地图,查阅了很多资料后最终选择使用bokeh包以及伦敦区的geojson数据绘制。 bokeh是基于python的绘图工具,可以绘制各种类型的...

    砸漏
  • windows下python3 使用cx_Oracle,xlrd插件进行excel数据清洗录入

    我们在做数据分析,清洗的过程中,很多时候会面对各种各样的数据源,要针对不同的数据源进行清洗,入库的工作。当然python这个语言,我比较喜欢,开发效率高,基本上...

    流川疯

扫码关注云+社区

领取腾讯云代金券