本文是博客搭建系列文章第七篇,其他文章链接:
- 从零开始免费搭建自己的博客(一)——本地搭建 Hexo 框架
- 从零开始免费搭建自己的博客(二)——基于 GitHub pages 建站
- 从零开始免费搭建自己的博客(三)——基于 Gitee pages 建站
- 从零开始免费搭建自己的博客(四)——编写Markdown文章利器 Typora
- 从零开始免费搭建自己的博客(五)——Typora + PicGo + GitHub/Gitee图床
- 从零开始免费搭建自己的博客(六)——三个站点一键发布博客
- 从零开始免费搭建自己的博客(七)——迁移 CSDN 博客到个人博客站点
- 从零开始免费搭建自己的博客(八)——博客网站个性化设置及优化
前言
CSDN 没有提供文章导出功能,只有导入功能,我们想把自己以前写的文章迁移到其他平台或者自己的博客网站,还得自己想办法爬取下来。可是那是我写的文章啊,竟然不能想拿就拿回来。。。
我看到需多人的实现思路,是使用文章界面点击编辑按钮的接口,获取自己之前的文章 Markdown 源码。这样还得先登录自己的账号,而且前提是之前文章是用 Markdown 编辑器写的。其实不管是富文本编辑器还是 Markdown 编辑器写的,最终呈现的都是一个 html 网页,不需要登录就可以看到。之前介绍 Typora 时说过, Markdown 语法和 html 语法本来就类似,所以本文思路是直接下载 html 然后转化为 Markdown 格式。
在 CSDN 页面结构不发生改变的情况下,我们可以用这种方法下载 CSDN 上任意文章并保存成 Markdown 格式。只有写过博客的人才知道原创一篇文章要花费多少精力,所以希望大家如果下载别人的文章一定要标明原地址,这是基本节操。
工具选择
语言:Python3
。
第三方库:requests
、parsel
、tomd
。
当然可以使用上一篇用到的 pyppeteer,不多对于这个需求来说速度太慢。CSDN 目前没有设置很多反爬虫机制,所以用轻量的 requests 就够了。
parsel
是 Scrapy 框架内置的 html 解析库,后来独立出来。选择 parsel 也是因为够用,且比 BeautifulSoup 更轻。
html 转 Markdown 的库找到两个:tomd 和 html2text ,试了一下都挺好用的,美中不足的是两个库转换完的代码块都没有标识语言类别,导致代码无法高亮。我看了 html 源码是有是语言类别信息的,所以需要对库稍作改动才能达到完美的效果。tomd
的原理比较简单粗暴,直接是正则表达式查找替换,源码就一个文件,比较好改,改动点和源码在下面。
实现过程
- 获取自己主页文章列表,包括标题和文章地址。
- 根据上一步获取的文章地址,获取文章的标题、正文、标签、分类、发布时间。
- 根据上一步获取的文章正文,将 html 格式文本转为 md 格式。
- 新建
.md
文件,先添加标题、标签、分类、发布时间,再写入 md 正文。 - 使用上一篇文章中实现的一键发布脚本将本地保存的博客发布到自己的博客。
tomd修改
在使用tomd
的过程中遇到两个问题,好在源码只有一个文件,原理也很简单,稍微看一下代码逻辑就可以解决。
-
无序列表转化后没有换行,导致无序列表只有一行。需要修改
tomd.py
文件第103
行。elif self.tag == 'ul' and tag == 'li': self.content = re.sub(pattern, '\n- \g<1>', self.content)
-
代码块没有标识语言类别,无法代码高亮。需要修改
tomd.py
文件第19
行和第50
行。各加三行,根据实际用到的语言。