python+shell 备份 CSDN 博客文章,CSDN博客备份工具

python+shell 备份 CSDN 博客文章,CSDN博客备份工具

在 csdn 写了几年的博客了。多少也积累了两三百篇博文,近日,想把自己的这些文章全部备份下来,于是开始寻找解决方案。

我找到了一个同为 CSDN 博主写的 python 脚本工具,尝试了一下,发现因为网站改版的原因,原先的脚本已经不能运行了。

其实,这是想要一揽子解决问题的脚本的通病,当一处变化,整个脚本就要作废。所以,我决定自己来解决这个问题,并且这个解决问题的方案,不会因为官方的改版就不能使用,只要稍微修改一下代码,即可。

分析备份文章的步骤

将一个大的问题,拆成若干个小的问题,即可轻松解决问题。

  1. csdn 的每篇博文都有独立的 ID 因此,我们需要把所有的 ID 都找出来。
  2. csdn 肯定有接口,展示我们的 markdown 格式的文本 因为我们每次打开编辑器的时候,文本都会被渲染出来,所以肯定有接口。 就算没有接口,我们通过浏览器能访问到我们的文章,我们就一定有办法保存下来。 不过 csdn 有,所以没有尝试了。呵呵。
  3. 通过 ID 和接口,把文本全部读取出来,并保存到本地。

好,大概就是这个流程。

搞到所有文章的ID

这个会有很多种方法,我直接通过爬取我的博客首页,来拿到所有的文章 ID。分析一下我的博客的首页列表,我们可以看到这样的 url 格式 https://blog.csdn.net/fungleo/article/list/2。而我的博文有 14 页,所以,很容易猜测到我的博客问的所有列表。

循环一个 14 的数字即可。你有多少,就循环多少咯。然后我们分析一下源码:

如上,我们的 ID 在一个名为 text-truncateh4 标签中的 a 链接的结尾。通过 BeautifulSoup 这个 python 爬虫工具,我们可以非常轻松的拿到这个值。

于是,我写出了下面的脚本:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import  urllib.request
from bs4 import BeautifulSoup
import os

def getid (x):
    url = r'https://blog.csdn.net/fungleo/article/list/' + str(x)
    res = urllib.request.urlopen(url)
    html = res.read().decode('utf-8')
    soup = BeautifulSoup(html,'html.parser')
    links = soup.find_all('h4', 'text-truncate')

    for i in links:
        os.system('echo ' + str(i.a['href']).replace('https://blog.csdn.net/fungleo/article/details/', '') + ' >> id.txt')

for i in range(14):
    getid(i)

好,现在,我们所有的博客文章的 ID 都已经存在了 id.txt 这个文件夹下面了。

这里,我用了 python 执行 shell 脚本的方式写入文件。确实,shell 实在太方便了。

下载博客文章的所有的 json 数据

我通过分析博客的编辑器,顺利找到了一个接口,其结果如下:

这个接口,实在是太完美了。下面,我就要把这些全部下载下来。

首先,我们先拿到 curl 的请求数据,在 chrome 浏览器中这样操作:

然后将复制到的内容,直接在终端内运行,果然能够拿到数据。这就好了,下面一个 shell 脚本循环,下载所有的 json 到本地。

首先,我们将浏览器用上面的操作复制出来的内容保存为一个 t.sh 的脚本文件,修改其中的 id$1

curl 'https://mp.csdn.net/mdeditor/getArticle?id=$1' -H 'Cookie: __这里的代码我删除掉了。__' --compressed

然后,我们在命令行输入以下命令直接运行:

for i in $(cat id.txt); do sh t.sh $i > $i.json; sleep 1; done

好,经过数分钟的运行之后,我们的所有 JSON 数据就都已经保存到本地了。

至于这里为什么要用 shell 是因为它是在是太方便了。简单一句代码,就搞定所有问题。

将 json 数据读取,并保存成 markdown 格式的博文

通过两步,我们就已经拿到了数据了,下面要进行的就是数据的处理,这个 shell 就不方便了,我们继续用 python 脚本来解决问题。

我刚刚下载的时候,把 json 文件和我们的脚本放在一起了。我要规整一下,执行下面的几条命令:

mkdir json markdown
mv *.json json

好,下面我们要把 json 文件夹中的所有数据读取,转换为 markdown 格式,并保存到 markdown 文件夹中。

脚本如下:

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

sourceDir = './json'

def readJson (filPath):
    f = open(filPath, encoding='utf-8')
    data = json.load(f)

    title = data['data']['title'].replace('/', ':')
    content = data['data']['markdowncontent']
    tags = data['data']['tags'].split(',')

    if content:
        mdFile = open('''./markdown/{title}.md'''.format(title=title), 'a+')
        mdFile.write('title: ' + title + '\n')
        mdFile.write('date: 2018-06-29 00:00:00 +0800\n')
        mdFile.write('update: 2018-06-29 00:00:00 +0800\n')
        mdFile.write('author: fungleo\n')
        mdFile.write('tags:\n')
        for tag in tags:
            mdFile.write('    -' + tag + '\n')

        mdFile.write('---\n\n')
        mdFile.write(content)

def findJson ():
    for fil in os.listdir(sourceDir):
        filPath = os.path.join(sourceDir, fil)
        readJson(filPath)

findJson()

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的知识天地

昨天2年python开发的同事,还在问我 if __name__ == '__main__' 是什么意思?

相信刚接触Python的你一定有过如此经历,把所有的代码都写在 if __name__ == '__main__'下,因为有人告诉你,这样比较符合 Python...

16870
来自专栏Python3爬虫100例教程

去面试Python工程师,这几个基础问题一定要能回答,Python面试题No4

元组无法复制。 因为元组是不可变的,所以运行tuple(tuple_name)将返回自己

11440
来自专栏程序员的知识天地

操作了一把Python,我能叫出所有猫的名字!

话说,当年我刚来地球的时候,小心翼翼地伪装了自己的身份。我在暗处偷偷观察人类,学习你们的语言。

13230
来自专栏深度学习计算机视觉

Detectron结构解析

科研人员除了科研能力,如果能具备优秀的工程能力,将是非常棒的。本文记录了detectron pytorch版本的代码结构笔记,一起来学习一下大神优美的工程架构。...

28220
来自专栏程序员的知识天地

学习Python,来点PEP吧!

或许你是一个初入门Python的小白,完全不知道PEP是什么。又或许你是个学会了Python的熟手,见过几个PEP,却不知道这玩意背后是什么。那正好,本文将系统...

16040
来自专栏程序员的知识天地

最详细的Python打包工具:Pyinstaller实战指南,如丝滑般体验

⚠️注意了:你要编译成exe,建议你省心点的在windows上用pyinstaller,如果你要mac app的,那就用mac编译。

23710
来自专栏weixuqin 的专栏

TCP socket 编程

14030
来自专栏程序员的知识天地

Python的 is 和 == ,你真的搞定对象了吗?

is 和 == 都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪?

8940
来自专栏程序员的知识天地

整理了19个pythonic的编程习惯,入门更优雅!

Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。

11840
来自专栏程序员的知识天地

介绍几款 Python 类型检查工具

微软在 Github 上开源了一个 Python 静态类型检查工具:pyright ,引起了社区内的多方关注。

11610

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励