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

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

下面是个人主页的样子:

在这里插入图片描述

然后提取是用的 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_docHTML文件内MHT信息
unpack_dir放置资源的文件夹路径
html_filenameHTML文件的命名
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
--------------------- 

原文:https://blog.csdn.net/weixin_44613063/article/details/87093504 

https://blog.csdn.net/qq_16761099/article/details/80559302

 

,

posted on 2022-10-04 01:28  bdy  阅读(13)  评论(0编辑  收藏  举报

导航