• Python 博客园快速备份脚本


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

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

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

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

    1. # powerby: LyShark
    2. # blog: www.cnblogs.com/lyshark
    3. from bs4 import BeautifulSoup
    4. import requests, os,re
    5. header = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) By LyShark CnblogsBlog Backup Script"}
    6. # 获取文章,并转成markdown
    7. # blog: www.lyshark.com
    8. def GetMarkDown(xml_file):
    9. con = open(xml_file, 'r', encoding='utf8').read()
    10. # 每篇文章都在 标签里
    11. items = re.findall(".*?", con, re.I | re.M | re.S)
    12. ele2 = ['(.+?)', '(.+?)', '(.+?)']
    13. # md_name = xml_file.split('.xml')[0] + '.md'
    14. for item in items:
    15. try:
    16. title = re.findall(ele2[0], item, re.I | re.S | re.M)[0]
    17. link = re.findall(ele2[1], item, re.I | re.S | re.M)[0]
    18. des = re.findall(ele2[2], item, re.I | re.S | re.M)[0]
    19. des = re.findall('', des, re.I | re.S | re.M)[0] # CDATA 里面放的是文章的内容
    20. des = des.replace('~~~', "```")
    21. lines = des.split('\n')
    22. with open("./blog/" + title.replace("/","") + ".md", mode='w+', encoding='utf8') as f:
    23. f.write("---\n")
    24. f.write("title: '{}'\n".format(title.replace("##","").replace("###","").replace("-","").replace("*","").replace("
      "
      ,"").replace(":","").replace(":","").replace(" ","").replace(" ","").replace("`","")))
    25. f.write("copyright: true\n")
    26. setdate = "2018-12-27 00:00:00"
    27. try:
    28. # 读取时间
    29. response = requests.get(url=link, headers=header)
    30. print("读取状态: {}".format(response.status_code))
    31. if response.status_code == 200:
    32. bs = BeautifulSoup(response.text, "html.parser")
    33. ret = bs.select('span[id="post-date"]')[0]
    34. setdate = str(ret.text)
    35. pass
    36. else:
    37. f.write("date: '2018-12-27 00:00:00'\n")
    38. except Exception:
    39. f.write("date: '2018-12-27 00:00:00'\n")
    40. pass
    41. f.write("date: '{}'\n".format(setdate))
    42. # description检测
    43. description_check = lines[0].replace("##","").replace("###","").replace("-","").replace("*","").replace("
      "
      ,"").replace(":","").replace(":","").replace(" ","").replace(" ","")
    44. if description_check == "":
    45. f.write("description: '{}'\n".format("该文章暂无概述"))
    46. elif description_check == "```C":
    47. f.write("description: '{}'\n".format("该文章暂无概述"))
    48. elif description_check == "```Python":
    49. f.write("description: '{}'\n".format("该文章暂无概述"))
    50. else:
    51. f.write("description: '{}'\n".format(description_check))
    52. print("[*] 时间: {} --> 标题: {}".format(setdate, title))
    53. f.write("tags: '{}'\n".format("tags10245"))
    54. f.write("categories: '{}'\n".format("categories10245"))
    55. f.write("---\n\n")
    56. f.write('%s' %des)
    57. f.close()
    58. except Exception:
    59. pass
    60. if __name__ == "__main__":
    61. GetMarkDown("backup.xml")

    备份后的效果如下所示:

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

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

    1. # powerby: LyShark
    2. # blog: www.cnblogs.com/lyshark
    3. from bs4 import BeautifulSoup
    4. import requests, os,re
    5. header = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) By LyShark CnblogsBlog Backup Script"}
    6. # 从备份XML中找到URL
    7. # blog: www.cnblogs.com/lyshark
    8. def GetURL(xml_file):
    9. blog_url = []
    10. con = open(xml_file, 'r', encoding='utf8').read()
    11. items = re.findall(".*?", con, re.I | re.M | re.S)
    12. ele2 = ['(.+?)', '(.+?)', '(.+?)']
    13. for item in items:
    14. title = re.findall(ele2[0], item, re.I | re.S | re.M)[0]
    15. link = re.findall(ele2[1], item, re.I | re.S | re.M)[0]
    16. print("标题: {} --> URL: {} ".format(title,link))
    17. blog_url.append(link)
    18. return blog_url
    19. # 下载所有图片
    20. # blog: www.lyshark.com
    21. def DownloadURLPicture(url):
    22. params = {"encode": "utf-8"}
    23. response = requests.get(url=url, params=params, headers=header)
    24. # print("网页编码方式: {} -> {}".format(response.encoding,response.apparent_encoding))
    25. context = response.text.encode(response.encoding).decode(response.apparent_encoding, "ignore")
    26. try:
    27. bs = BeautifulSoup(context, "html.parser")
    28. ret = bs.select('div[id="cnblogs_post_body"] p img')
    29. for item in ret:
    30. try:
    31. img_src_path = item.get("src")
    32. img_src_name = img_src_path.split("/")[-1]
    33. print("[+] 下载图片: {} ".format(img_src_name))
    34. img_download = requests.get(url=img_src_path, headers=header, stream=True)
    35. with open("./image/" + img_src_name, "wb") as fp:
    36. for chunk in img_download.iter_content(chunk_size=1024):
    37. fp.write(chunk)
    38. except Exception:
    39. print("下载图片失败: {}".format(img_src_name))
    40. pass
    41. except Exception:
    42. pass
    43. if __name__ == "__main__":
    44. url = GetURL("backup.xml")
    45. for u in url:
    46. DownloadURLPicture(u)

    备份后的效果如下:

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

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

  • 相关阅读:
    踏入骑行新纪元: VELO Angel Glide坐垫,舒适与环保并驾齐驱!
    使用弹簧启动和 JPA 测试乐观锁定处理
    ChatGPT Prompting开发实战(三)
    Spring Boot(二)
    PHP内存马技术研究与查杀方法总结
    牛客-TOP101-BM43
    提权方法:利用环境变量路径劫持提权
    计算机网络:3数据链路层
    NOIP2023模拟4联测25 B. 多边形
    GBase 8c 存储技术---列存储引擎(二)
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/126678063