项目实战 | 手把手带你获取某知识付费平台内容制作电子书(二)
时间:2022-06-23
本文章向大家介绍项目实战 | 手把手带你获取某知识付费平台内容制作电子书(二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
接上一篇文章, 项目实战 | 手把手带你获取某知识付费平台精华帖,并制作电子书(一)还有一些遗留问题,我说了上篇文章只是牛刀小试,这一篇文章会进一步优化.
上一篇文章的问题:
- 文章是txt形式的, 不支持插入图片
- 不支持点击链接
- 电子书文档没有目录
- 加速制作电子书.
这篇文章解决了几个问题
- 可以生成pdf版本的电子书了
- 支持插入图片,但只支持插入一张图片(后续怎么插入多张还需要研究,本人对Python中动态网页不是很熟, 有兴趣的朋友可以一起探讨)
- 生成目录,方便查阅
- 另外可以控制抓取普通帖子和精华帖子
好了,开始我的表演, 先给效果图!
准备好网页内容
先做一个html网页模板,下面会介绍这个模板,这个模板中插入,标题,作者时间,正文,以及图片
self.html_template = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>{title}</h1>
<h6>{author_time}</h6>
<p font-size = '35px'>{text}</p>
<img src = {images}>
</body>
</html>
"""
接着用我们抓取到的标题,作者时间,正文,图片来填充这个模板,并把这些内容填充到一个内容数组中.
if topic.get('type') == 'talk' and topic.get('talk'): # 会话模式的
text = topic.get('talk').get('text').replace('n', '') # 获取正文内容
title = text[0:20] if len(text) > 20 else text
author = topic.get('talk').get('owner').get('name') # 获取作者名称
create_time = (topic.get('create_time')[:20]).replace('T', ' ') # 获取最后更新时间
author_time = '{}在{}发表'.format(author, create_time)
images = topic.get('talk').get('images') # 获取图片列表
img = []
if images is not None:
for image in images:
img = image.get('large').get('url')
# img.append(image.get('large').get('url'))
title = title if len(title) > 0 else '无标题'
html_content = self.html_template.format(title=title, author_time=author_time, text=text,
images=img)
self.html_contents.append(html_content)
生成pdf版本的电子书,并带有目录
把内容列表转换成文件列表,然后用pdfkit工具传化成pdf文件. 这里需要安装两个包一个是pdfkit,另一个是wkhtmltopdf,
其中 wkhtmltopdf工具是一个exe文件,然后要指定这个文件
self.config = pdfkit.configuration(
wkhtmltopdf='C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe') # 这里需要配置一下wkhtmlpdf.exe路径
# 下面是把内容列表转化成文件列表,然后用pdfkit转换成pdf文件,与此同时目录也会自动生成.
def creat_pdf_file(self, group_title):
htmls = [] # 这里是存放html文件
for index, file in enumerate(self.html_contents):
html = '{}.html'.format(index)
with open(html, 'w', encoding='utf-8') as f: # 点击open函数查看用法,这里是写入不要搞错了
f.write(file)
htmls.append(html)
try:
output_file = 'D:/zsxq2/{}.pdf'.format(group_title)
if not os.path.exists(output_file): # 过滤掉重复文件
pdfkit.from_file(htmls, output_file, configuration=self.config) # 注意这里需要配置一下wkhtmltopdf
except Exception as e:
print(e)
插入图片
self.html_template = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>{title}</h1>
<h6>{author_time}</h6>
<p>{text}</p>
<img src = {images}> # 注意这里传入图片的url,但是怎么传入多张,我还没有弄明白,不是很熟动态插入代码
</body>
</html>
"""
这里向html模板中插入标题,作者与时间,然后帖子正文内容,以及图片
html_content = self.html_template.format(title=title, author_time=author_time, text=text,
images=img)
普通帖子与精华帖子
很容易通过浏览器的调试模式找到普通帖子的链接,然后直接获取数据.这里我的函数中添加了一个type字段来控制是获取精华帖子还是普通帖子
# 精华帖子
url_content_essence = 'https://api.zsxq.com/v1.10/groups/{}/topics?scope=digests&count=20&end_time={}'.format(
group_id,
self.end_time)
# 普通帖子
url_content_normal = 'https://api.zsxq.com/v1.10/groups/{}/topics?count=20&end_time={}'.format(
group_id,
self.end_time)
response = requests.get(url=url_content_essence if type > 0 else url_content_normal,
headers=self.zsxq_headers) # 一定要加headers,规范写法,就像过马路一样穿红灯有时没事,有时要命!
进一步优化
其实我们知道,星球中很多内容是由链接构成的,而我们又知道pdf 支持链接的点击,所以我决定把链接加上.方便点击链接,另外像我加入了七十多个星球了,我想加快电子书制作速度,这里就要用到多线程. 还有每个帖子动态只插入了一张图片,其实帖子中可能有多张图片,这里我还需要进一步优化. 总之要优化的就4个地方
- 帖子中的链接文章
- 电子书制作速度要加快
- 星球动态的多张图片
- pdf文件没有标注页码
猜你喜欢
项目实战 | 手把手带你获取某知识付费平台精华帖,并制作电子书(一)
他 11 岁学习编程,21 岁开发出 Linux 操作系统,拒绝乔布斯的 offer,活出了程序员该成为的样子
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码 (二)
- 高级时钟约束
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码(一) 主体
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——支持多种数据库。让分页更加简单。
- IO约束(下)
- 可以通过基类实现的几种功能。vs2008 .net 2.0
- Python基础知识2:字典
- 桶式移位器
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.7 增加了一个js函数的分页方式。
- FireEye报告:揭露新型工控系统恶意软件TRITON
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.6 修改了几个小bug,使用演示。
- Invoke-PSImage:将PS脚本隐藏进PNG像素中并用一行指令去执行它
- linux的内存清理相关知识!
- 一个页面搞定几乎所有的列表需求的实现思路和一点代码。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ruby 和 Java 的基础语法比较
- 聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别
- 聊聊面试-int和Integer的区别
- 记一次Linux修改MySQL配置不生效的问题
- VBA解析复合文档03——解析扇区链表
- C++核心准则E.17:不要试图在所有函数中捕捉所有异常
- 《图解算法》第1章 算法简介
- 自动化篇 | 这些自动化场景,批处理脚本完全可以取代 Python!
- 《RabbitMQ》如何保证消息不被重复消费
- 算法篇:树之翻转树
- 每日一题 | 约瑟夫问题
- 编码的浪漫:完美序列化的官方评测
- 【Vulnhub】symfonos2
- PWN入门(unsafe unlink)
- tf_cnn_benchmark 显存问题