chilkat 库,可以说有海量的功能,不过chilkat并不能随随便便就使用,有些功能需要证书认证,还好其中需要用的 CkSpider() 是免费的,而 CkMht() 虽然需要许可证,但我的代码里面已经添加了许可,只要完整复制就可以正常运行。

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

准备环境

因为chilkat并不存在于Python的PyPI软件库,所以无法通过pip进行下载,点击链接:

https://www.chilkatsoft.com/python.asp,选择与自己Python版本相匹配的版本,下载并解压,在解压后的文件夹里面用Python进行下载,输入:

python installChilkat.py -g


即可安装成功。

相关API说明:​​http://www.chilkatsoft.com/refdoc/pythonCkSpiderRef.html​

提取链接

本来可以用 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,即文章链接中包含的表示身份的部分。

下面是个人主页的样子:

【python备份】Python备份CSDN完整博客 研读_html

然后提取是用的 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

文件夹名称

 

 

运行的效果:

【python备份】Python备份CSDN完整博客 研读_ide_02

结果如下:

【python备份】Python备份CSDN完整博客 研读_github_03

文件夹内部资源的部分截图:

最后的效果还是不错的,代码目前没有发现问题。

生成索引

目前博主写的文章比较少,所以这个索引用处可能不大,但碰到那些文章写的非常多的博主,索引就显得很重要了。根据先前建立的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