博客迁移之从CSDN导出markdown格式文章

【2020/08/02更新】CSDN更新了接口API,之前的方法已经失效

写在前面

最近沉迷于个人网站开发,买了长期服务器和域名,一直在搞事情。

这篇文章的主要任务是将个人CSDN博客导出为Markdown格式保存,便于后续使用Hexo或Jekyll等框架。

主要步骤

  • Step1 抓包分析

从CSDN的写博客页面(https://mp.csdn.net/mdeditor)抓包分析。

因为写博客时使用的Markdown格式,则再重新编辑某一篇文章时,浏览器将从CSDN服务器上请求Markdown格式博文。

直接使用浏览器F12功能,刷新写作页面,分析数据,如下图:
在这里插入图片描述
可以发现,https://mp.csdn.net/mdeditor/getArticle?id=80699321 是向服务器请求的文章,服务器返回json格式数据,具体如下图:

在这里插入图片描述
可以发现,其中包含多种类型格式的文章,而 markdowncontent则是markdown格式的博文。

  • Step2 模拟请求
    这一步比较简单,主要就是模拟发包,向服务器请求数据。
    代码如下:
def request_md(blog_id):
    """获取博客包含markdown文本的json数据"""
    url = f"https://mp.csdn.net/mdeditor/getArticle?id={blog_id}"
    headers = {
        "cookie": "",
        "user-agent": ""
    }
    data = {"id": blog_id}
    reply = requests.get(url, headers=headers, data=data)
    markdowncontent = reply.json()["data"]["markdowncontent"]

其中,blog_id 是博客的唯一id,直接从 url 中可以获取;而 cookie 是用户凭证,从抓的包中复制过来即可(cookie有一定的使用时间,但是对于短时间内爬取所有文章而言绰绰有余,不要担心cookie过期);user-agent 同理复制。

  • Step3 获取博客列表
    这一步,主要是从用户的博客首页获取所有博客的 id 和发表日期。如我的博客首页是 https://blog.csdn.net/qq_36962569

分析网页源码,然后使用 BeautifulSoup 库解析即可
在这里插入图片描述
而对于很多页的博客,同样通过抓包分析,可以发现实际请求的 url 是 https://blog.csdn.net/qq_36962569/article/list/page
可以通过这个 url,遍历获取所有的博文
代码如下:

def request_blog_list(page=1):
    """获取博客列表
    主要包括博客的id以及发表时间等
    """
    url = f'https://blog.csdn.net/qq_36962569/article/list/{page}'
    reply = requests.get(url)
    parse = BeautifulSoup(reply.content, "lxml")
    spans = parse.find_all('div', attrs={'class':'article-item-box csdn-tracking-statistics'})
    blogs = []
    for span in spans[:3]:
        try:
            href = span.find('a', attrs={'target':'_blank'})['href']
            read_num = span.find('span', attrs={'class':'num'}).get_text()
            date = span.find('span', attrs={'class':'date'}).get_text()
            blog_id = href.split("/")[-1]
            blogs.append([blog_id, date, read_num])
        except:
            print('Wrong, ' + href)
    return blogs
    
def main(total_pages=3):
    """
    获取博客列表,包括id,时间
    获取博客markdown数据
    保存hexo格式markdown
    """
    blogs = []
    for page in range(1, total_pages + 1):
        blogs.extend(request_blog_list(page))
    for blog in blogs:
        blog_id = blog[0]
        date = blog[1].split(" ")[0].split("-")
        request_md(blog_id, date)
        time.sleep(1)

最终下载文件
在这里插入图片描述

最终迁移结果 blog.khay.site
在这里插入图片描述

完整代码 GitHub 获取

相关问题

There is a syntax error in the ‘for’ loop on line 25 of _posts/2019-04-07-【Python技能】 QtWebView + Jinja2 + JavaScript + MySQL.md. Valid syntax is 'for in ', and the variable may not contain hyphens or quotation marks. For more information, see https://help.github.com/en/articles/page-build-failed-syntax-error-in-for-loop.

发生这个原因,导致github 上的jekyll框架无法解析部署,主要原因参考官网说明
在这里插入图片描述
此时,再看出错的博客文章,是关于python中使用Jinja2的文件,其中这样一段代码:
在这里插入图片描述
初步分析,此段代码与jekyll中的代码发生了混淆,导致解析失败。将这段代码删除,则问题解决。

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值