首页 > 其他分享 >博客园博客批量备份/转移到个人网站

博客园博客批量备份/转移到个人网站

时间:2024-03-20 10:46:35浏览次数:21  
标签:blog 批量 format 博客园 replace write re 备份

鉴于有些小伙伴在寻找博客园迁移到个人博客的方案,本人针对博客园实现了一个自动备份脚本,可以快速将博客园中自己的文章备份成Markdown格式的独立文件,备份后的md文件可以直接放入到hexo博客中,快速生成自己的站点,而不需要自己逐篇文章迁移,提高了备份文章的效率。

首先第一步将博客园主题替换为codinglife默认主题,第二步登录到自己的博客园后台,然后选择博客备份,备份所有的随笔文章,如下所示:

 

备份出来以后将其命名为backup.xml,然后新建一个main.py脚本,以及一个blog目录,代码实现的原理是,解析xml格式并依次提取出文档内容,然后分别保存为markdown文件。

 

转存文章到MD: 写入备份脚本,代码如下所示,运行后即可自动转存文件到blog目录下,当运行结束后备份也就结束了。

# powerby: LyShark
# blog: www.cnblogs.com/lyshark
from bs4 import BeautifulSoup
import requests, os,re
 
header = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) By LyShark CnblogsBlog Backup Script"}
 
# 获取文章,并转成markdown
# blog: www.lyshark.com
def GetMarkDown(xml_file):
    con = open(xml_file, 'r', encoding='utf8').read()
    # 每篇文章都在 <item> 标签里
    items = re.findall("<item>.*?</item>", con, re.I | re.M | re.S)
    ele2 = ['<title>(.+?)</title>', '<link>(.+?)</link>', '<description>(.+?)</description>']
    # md_name = xml_file.split('.xml')[0] + '.md'
    for item in items:
        try:
            title = re.findall(ele2[0], item, re.I | re.S | re.M)[0]
            link = re.findall(ele2[1], item, re.I | re.S | re.M)[0]
            des = re.findall(ele2[2], item, re.I | re.S | re.M)[0]
            des = re.findall('<!\[CDATA\[(.+?)\]\]>', des, re.I | re.S | re.M)[0]  # CDATA 里面放的是文章的内容
            des = des.replace('~~~', "```")
            lines = des.split('\n')
            with open("./blog/" + title.replace("/","") + ".md", mode='w+', encoding='utf8') as f:
                f.write("---\n")
                f.write("title: '{}'\n".format(title.replace("##","").replace("###","").replace("-","").replace("*","").replace("<br>","").replace(":","").replace(":","").replace(" ","").replace(" ","").replace("`","")))
                f.write("copyright: true\n")
 
                setdate = "2018-12-27 00:00:00"
                try:
                    # 读取时间
                    response = requests.get(url=link, headers=header)
                    print("读取状态: {}".format(response.status_code))
 
                    if response.status_code == 200:
                        bs = BeautifulSoup(response.text, "html.parser")
                        ret = bs.select('span[id="post-date"]')[0]
                        setdate = str(ret.text)
                        pass
                    else:
                        f.write("date: '2018-12-27 00:00:00'\n")
                except Exception:
                    f.write("date: '2018-12-27 00:00:00'\n")
                    pass
 
                f.write("date: '{}'\n".format(setdate))
 
                # description检测
                description_check = lines[0].replace("##","").replace("###","").replace("-","").replace("*","").replace("<br>","").replace(":","").replace(":","").replace(" ","").replace(" ","")
                if description_check == "":
                    f.write("description: '{}'\n".format("该文章暂无概述"))
                elif description_check == "```C":
                    f.write("description: '{}'\n".format("该文章暂无概述"))
                elif description_check == "```Python":
                    f.write("description: '{}'\n".format("该文章暂无概述"))
                else:
                    f.write("description: '{}'\n".format(description_check))
 
                print("[*] 时间: {} --> 标题: {}".format(setdate, title))
                f.write("tags: '{}'\n".format("tags10245"))
                f.write("categories: '{}'\n".format("categories10245"))
                f.write("---\n\n")
                f.write('%s' %des)
                f.close()
        except Exception:
            pass
 
if __name__ == "__main__":
    GetMarkDown("backup.xml")

 

备份后的效果如下所示:

 

打开Markdown格式看一下,此处的标签和分类使用了一个别名,在备份下来以后,你可以逐个区域进行替换,将其替换成自己需要的分类类型即可。

 

转存图片到本地: 接着就是继续循环将博客中所有图片备份下来,同样新建一个image文件夹,并运行如下代码实现备份。

# powerby: LyShark
# blog: www.cnblogs.com/lyshark
from bs4 import BeautifulSoup
import requests, os,re
 
header = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) By LyShark CnblogsBlog Backup Script"}
 
# 从备份XML中找到URL
# blog: www.cnblogs.com/lyshark
def GetURL(xml_file):
    blog_url = []
    con = open(xml_file, 'r', encoding='utf8').read()
    items = re.findall("<item>.*?</item>", con, re.I | re.M | re.S)
    ele2 = ['<title>(.+?)</title>', '<link>(.+?)</link>', '<description>(.+?)</description>']
    for item in items:
        title = re.findall(ele2[0], item, re.I | re.S | re.M)[0]
        link = re.findall(ele2[1], item, re.I | re.S | re.M)[0]
        print("标题: {} --> URL: {} ".format(title,link))
        blog_url.append(link)
    return blog_url
 
# 下载所有图片
# blog: www.lyshark.com
def DownloadURLPicture(url):
    params = {"encode": "utf-8"}
    response = requests.get(url=url, params=params, headers=header)
    # print("网页编码方式: {} -> {}".format(response.encoding,response.apparent_encoding))
    context = response.text.encode(response.encoding).decode(response.apparent_encoding, "ignore")
    try:
        bs = BeautifulSoup(context, "html.parser")
        ret = bs.select('div[id="cnblogs_post_body"] p img')
        for item in ret:
            try:
                img_src_path = item.get("src")
                img_src_name = img_src_path.split("/")[-1]
                print("[+] 下载图片: {} ".format(img_src_name))
                img_download = requests.get(url=img_src_path, headers=header, stream=True)
                with open("./image/" + img_src_name, "wb") as fp:
                    for chunk in img_download.iter_content(chunk_size=1024):
                        fp.write(chunk)
            except Exception:
                print("下载图片失败: {}".format(img_src_name))
                pass
    except Exception:
        pass
 
if __name__ == "__main__":
    url = GetURL("backup.xml")
    for u in url:
        DownloadURLPicture(u)

 

备份后的效果如下:

 

替换文章内的图片链接地址,可以使用编辑器,启用正则批量替换。

 

当把博客备份下来以后你就可以把这些文章拷贝到hexo博客_post目录下面,然后hexo命令快速渲染生成博客园的镜像站点,这样也算是增加双保险了。

 

标签:blog,批量,format,博客园,replace,write,re,备份
From: https://www.cnblogs.com/chentiao/p/18084722

相关文章

  • Elasticsearch-批量操作(bulk)
    bulk的基础概念bulk是es提供的一种批量增删改的操作API。bulk的语法bulk对JSON串的有着严格的要求。每个JSON串不能换行,只能放在同一行,同时,相邻的JSON串之间必须要有换行(Linux下是\n;Window下是\r\n)。bulk的每个操作必须要一对JSON串(delete语法除外)。PUT/_bulk{"action":......
  • 040_Windows下MySQL定时备份
    目录定时备份脚本计划任务定时执行定时备份脚本remauther:zhyqremdate:20220929rem******BackupMySQLStart******@echooff::设置时间变量set"Ymd=%date:~0,4%%date:~5,2%%date:~8,2%"::创建存储的文件夹ifnotexist"C:\mysql_backup"md"C:\mysql_backup"......
  • 常用命令--复制-备份--cp--mv--scp--rsync
    常用命令--复制-备份--cp--mv--scp--rsynccpcp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在......
  • 批量在多个文件夹里作成新的子文件夹
    在多个文件夹里作成新的子文件夹使用mkdir命令。例如:在3个目录下作成202403文件夹。mkdirD:\temp\test0319\00133088\202403mkdirD:\temp\test0319\00133033\202403mkdirD:\temp\test0319\00133066\202403同样,也可批量删除目录。或者用explorer检索出目录,直接删掉即可......
  • 【Python】使用selenium对Poe批量模拟注册脚本
    配置好接码api即可实现自动化注册登录试用一体。运行后会注册账号并绑定邮箱与手机号进行登录试用。测试结果30秒一个号importreimporttimeimportrequestsfrombs4importBeautifulSoupfromseleniumimportwebdriverfromselenium.webdriver.chrome.option......
  • MySQL——数据库备份上传到阿里云OSS存储
    前言基于阿里云的OSS存储对数据库进行备份,阿里云ossutil安装文档还是比较详细的,直街参考阿里云文档操作就好了ossutil:https://help.aliyun.com/zh/oss/developer-reference/overview-59内容根据ossutil安装配置好命令行工具,然后直接写相应的脚本就好了,如果存在大表建议单独导......
  • Excel批量生成表单,快速生成多个收款收据工作表
    按照指定的模板,批量生成多个工作表。超级处理器下载及安装以收款收据为例,模板表如下:生成结果表如下:操作步骤讲解如下:Excel批量生成表单,收款收据,鼠标点选就可以完成想了解更多应用,点击关注哦,主页有更多介绍,也可以私信留言。......
  • Google Earth Engine——如何实现裁剪后研究区影像的批量下载(以NDVI为例)
    简介GEE云平台(GoogleEarthEngine)是一个强大的云平台,提供了丰富的地理数据和计算资源,用于进行地理数据分析和处理。在GEE平台上,可以实现对研究区影像的单景影像(以NDVI为例)的批量下载。下面是具体的过程:1.登录GEE云平台并初始化首先,需要登录GEE云平台(https://earthengine.g......
  • EntityFrameWork Core 批量操作
    在EF7.0的更新中,新增了批量更新和批量删除的功能: 批量删除:ExecuteDelete 对 DbSet 调用 ExecuteDelete 或 ExecuteDeleteAsync 会立即从数据库中删除该 DbSet 的所有实体。例如,删除所有 Tag 实体:awaitcontext.Tags.ExecuteDeleteAsync();使用SQLServer时,......
  • [分享] Silence - 专注于阅读的博客园主题
    本篇效果即为本博客皮肤。(食用前请先开通JS权限)博客皮肤:Custom侧边公告:<script>window.$silence={avatar:'https://ts1.cn.mm.bing.net/th/id/R-C.bf673c3207334d32efe2fa24b3082dac?rik=YzLZMg%2fLizJrtQ&riu=http%3a%2f%2fimg.touxiangwu.com%2fuploads%2falli......