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_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