Python备份CSDN完整博客

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_44613063/article/details/87093504

在CSDN论坛发现了一个求助帖,帮忙修改一个备份CSDN博客的Python代码,应该是运行不了的代码。因为是很久以前的代码,而且是用python2写的,所以我并没有尝试运行就直接用Python3来进行改写。当然真正引发我兴趣的,是代码用了一个我以前没有见过的 chilkat 库,可以说有海量的功能,但网上对于它的描述比较少,所以我只能看官方文档,配合Google翻译和我蹩脚的英语水平,大致把需要用到的函数搞懂了,不得不说它的功能太强大了,我用到的不过是冰山一角。不过chilkat并不能随随便便就使用,有些功能需要证书认证,还好其中需要用的 CkSpider() 是免费的,而 CkMht() 虽然需要许可证,但我的代码里面已经添加了许可,只要完整复制就可以正常运行。

在文章最后面,我给出了放在Github中源码的链接,可自行下载。


准备环境

因为chilkat并不存在于Python的PyPI软件库,所以无法通过pip进行下载,点击链接:
https://www.chilkatsoft.com/python.asp
,选择与自己Python版本相匹配的版本,下载并解压,在解压后的文件夹里面用Python进行下载,输入:

python installChilkat.py -g

即可安装成功。

提取链接

本来可以用 requests 或者其它库来提取的,不过既然用到了chilkat,那么就来体验一下它的爬虫功能,即 chilkat.CkSpider()。它的逻辑就是先初始化组件,再进行加载,然后提取自己需要的内容:

import chilkat

url = "https://me.csdn.net/" + account_id + '/'
spider = chilkat.CkSpider()
# 初始化组件
spider.Initialize(url)
spider.AddUnspidered(url)
# 是否加载完成
success = spider.CrawlNext()

这里我采用的链接不是指向博客主页的 https://blog.csdn.net/…,而是指向个人主页的 htttps://me.csdn.net/…,因为前者我无法提取到每篇文章的地址,但后者可以。只不过只能提取一页,要提取到后面的页就在链接后面加上 ‘article/list/2?’ 即可,最后的数字是页数。上面代码里面的 account_id 就是账号ID,即文章链接中包含的表示身份的部分。

下面是个人主页的样子:
在这里插入图片描述
然后提取是用的 getOutboundLink() 方法,找到主页下面文章的链接:

for i in range(0, spider.get_NumOutboundLinks()):
	# 打印出每个文章链接
    print(spider.getOutboundLink(i))

如果是采用平时经常用的 requests 等库来提取的话,就需要自己找出每个链接,会有点麻烦,但是我也花了很长时间来在官方文档中找到这个方法,不过最后能成功还是很高兴的。

下载博客

为了备份完整的博客,仅仅是把一个HTML文件保存下来当然是远远不够的,还需要把相应的图片、css、js等信息保存下来。如果要我自己写一个把每个资源保存下来的脚本还是有点麻烦的,要考虑的方面比较多,还好 chilkat 有专门的 CkMht() 方法。

但这并不是一个免费功能,需要认证一下,不过我们不用担心,按照下面的来就行了:

mht = chilkat.CkMht()
# 解锁组件,使用完整功能
success = mht.UnlockComponent("Anything for 30-day trial")
if (success != True):
	print(mht.lastErrorText())
	sys.exit()

这样就可以正常使用了,接下来就是下载资源了,创建一个与文章标题一样的文件夹来保存资源,然后HTML文件就可以引用了,效果和网站内呈现出的一模一样。

使用的方法:

success = mht.UnpackMHTString(mht_doc, unpack_dir, html_filename,
                             parts_subdir)

成功后会返回 True,括号内参数的意义:

parameter 说明
mht_doc HTML文件内MHT信息
unpack_dir 放置资源的文件夹路径
html_filename HTML文件的命名
parts_subdir 文件夹名称

运行的效果:
在这里插入图片描述
结果如下:
在这里插入图片描述
文件夹内部资源的部分截图:
在这里插入图片描述
最后的效果还是不错的,代码目前没有发现问题。

生成索引

目前博主写的文章比较少,所以这个索引用处可能不大,但碰到那些文章写的非常多的博主,索引就显得很重要了。根据先前建立的txt文件内的信息,可以把每一篇文章都包括进来:

# 建立索引
def generate_index(account_id):
    file_path = 'URList-' + account_id + '.txt'
    f = open(file_path, 'r')
    fout = open('./CSDN-' + account_id + '/Index.html', 'w', encoding='utf-8')
    fout.write(head_string)
    fout.write("""<h2>""" + account_id + "的博客" + """</h2>\n""")
    fout.write("""<ol>\n""")
    for line in f.readlines():
        m = re.search('(http.+[0-9]{7,}),(.+)', line)
        title = m.group(2)
        print(title)
        fout.write("""<li><a href=\"""" + title + ".html" + """\">""" + title +
                   """</a></li>\n""")
    fout.write("""</ol>""")
    fout.write(tail_string)
    f.close()
    fout.close()

到这里代码就写完了,把每个部分都搞清楚就没问题了,逻辑上还是比较简单的,只是把大量时间都用在了看官方文档、找API上了。

不过一个简单的编码问题让我搞了半天,因为索引里面的编码用的是 UTF-8,而Python3在导入内容之前用的是字符串形式,如果把字符串直接 encode() 转换成UTF-8编码就会变成字节,无法写进文件里面,而再转换成字符串的话就会改变内容。最后以上面代码中的方法,在打开html文件的时候就直接确定编码格式,就没有问题了。


全部代码的Github地址:https://github.com/Stevengz/CSDN_biogs_backups

然后就是那篇作为参考的文章了,代码的基本框架还是照着它参考的,不过时间比较久了,而且它没有像我这样把每个部分都讲解一遍,有兴趣可以看一下:https://blog.csdn.net/lanbing510/article/details/50173361

猜你喜欢

转载自blog.csdn.net/weixin_44613063/article/details/87093504
今日推荐