当前位置: 首页 > news >正文

【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

,

相关文章:

  • 【python】Python中yield的理解与使用|python生成器
  • 【数据结构】八大数据结构分类 研读笔记
  • 【python】list、tuple、dict、set、dataframe、narray、series之间的区别
  • 【python】python3.7数据分析入门学习笔记 研读
  • 【VS输出UTF8】 C++ 控制台程序中输出UTF8字符乱码问题解决方法
  • 【python】python一些热点问题
  • 【thrift】thrift 研究
  • 【人工智能】我的人工智能之旅——线性回归 研读
  • 【python】Python Web服务器并发性能测试
  • 【protocolbuff】linux下安装google protobuf[实践] --未成功
  • 【ML】之 线性回归(实战) 研读
  • 【VS2017】VS2017离线安装教程
  • 【hadoop】为什么要用hadoop?
  • 【容器适配器】什么是容器适配器和用法
  • 【socket】setsockopt函数的作用和说明
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 2017前端实习生面试总结
  • Android系统模拟器绘制实现概述
  • Angular 2 DI - IoC DI - 1
  • co.js - 让异步代码同步化
  • ECMAScript入门(七)--Module语法
  • Invalidate和postInvalidate的区别
  • JavaWeb(学习笔记二)
  • java第三方包学习之lombok
  • js继承的实现方法
  • Meteor的表单提交:Form
  • PhantomJS 安装
  • PHP那些事儿
  • Python中eval与exec的使用及区别
  • react-native 安卓真机环境搭建
  • storm drpc实例
  • Vue组件定义
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 浏览器缓存机制分析
  • 你不可错过的前端面试题(一)
  • 三栏布局总结
  • const的用法,特别是用在函数前面与后面的区别
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 如何用纯 CSS 创作一个货车 loader
  • # Panda3d 碰撞检测系统介绍
  • #if 1...#endif
  • #pragma 指令
  • #pragma预处理命令
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)