• 如何自动生成一本epub电子书


    电子书现在已经非常容易获得了,制作电子书的成本也越来越低,本文分享一些制作epub电子书的方法,希望对你有帮助。

    在这里插入图片描述

    一本电子书的主要结构有:

    • 书籍基本元信息:书名/作者/简介/封面图片/出版商/出版时间等等信息。
    • 目录信息: 可以快速定位各个章节位置,方便搜索阅读位置。
    • 章节的正文内容: 保存这本书中的详细阅读内容。

    以上是我们的电子书主要结构,当然还有一些附加信息也是可以根据软件不同去附加上去的,但作为一本电子书,上面的结构就足够了。

    很久以前写过一个爬虫项目,是专门用于自动生成epub电子书的工具,主要的功能:

    • Python3语言实现,支持自定义规则实现爬取目标网页。
    • 内置了gitbook/wordpress博客和javascript教程网站的编写示例,可以参考学习。

    当初实现过程比较简单,只是拿来做爬虫练习写的,任何人都可以借鉴实现属于自己的更好的功能。

    今天来说下实现这个功能的过程。

    epub制作项目

    • ebook_spider项目:一个通用的爬虫制作电子书项目。

    这个项目将制作电子书的基本信息都封装在单个方法中,只需要实现对应方法就可以自动生成电子书了。

    1.EbookLib库

    这是一个Python库,作用是用来制作epub格式电子书。

    • 项目地址,虽然Star不多,但是用起来还是很好用的。
    • 文档地址,开发过程中需要阅读文档介绍。

    本项目的epub文件制作就是使用了ebooklib库完成的,只不过为了简化而封装了一个电子书的基类Ebook

    2.Ebook爬虫基类

    这个Ebook就是一个爬虫基类,可以根据规则匹配网页链接的内容生成epub文件。

    大致的运行过程为:

    HTTPS访问
    True,有章节
    False,无chapter列表
    True,有section
    False,无section
    电子书内容网址
    是否有chapter列表?
    获取chapter列表
    是否有section列表?
    获取文本内容
    异常退出
    输出epub文件

    继承Ebook基类后,可以根据自己需要实现Chapter列表Section列表的获取规则及正文获取规则,就可以自动将目标网址输出到epub电子书文件中,其中内置了img图片素材下载插件,非常方便将图片素材下载并打包到epub文件中。

    Wordpress电子书制作

    大多数个人博客是用wordpress搭建的,所以我们来看下如何将博客打包成epub电子书文件吧。

    WordPressEbook类继承了Ebook,然后根据wordpress网站的布局规则,实现了章节、内容提取规则方法,之后的epub文件制作任务就交给ebooklib库去帮忙完成就可以了。 真的可以说是很简单了。你可以找一个wordpress博客试试看。

    参考项目中的wp_ebook.py 文件:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    #########################################################################
    # Author: zioer
    # mail: next4nextjob@gmail.com
    # Created Time: 2020年01月02日 星期四 18时46分24秒
    #########################################################################
    
    
    from bs4 import BeautifulSoup as bs
    from multiprocessing.dummy import Pool as ThreadPool
    import multiprocessing as mp
    
    
    from Base.EbookBase import Ebook
    
    
    default_headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) \
        AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 \
        Safari/537.36'
    }
    
    
    
    
    class WordPressEbook(Ebook):
        # 电子书制作
        def __init__(self, params, outdir="./", proxy=""):
            if not isinstance(params, dict):
                raise TypeError("params type error! not dict type.")
            self.url = params['url']
            self.book_name = params['book_name']
            self.author = params['author']
            self.lang = params.get('lang', 'zh')
            self.identifier = params.get('id', 'id0001')
            self.page_num = params.get('page_num', 5)   # 新增参数,用于拼接页数请求`{url}/page/{page}`
            self.outdir = outdir
            self.proxy = proxy
            self.opts = {}
            self.plugin = None
    
        def fetch_chapter_list(self, text):
            '''
            抓取章url列表
            params:
                text:  章列表的HTML页面
            return
                list  [url, ...]
            '''
            soup = bs(text, "lxml")
            # 提取章列表
            a_list = ['{}/page/{}'.format(self.url, a) for a in range(1, self.page_num+1)]
            return a_list
    
        def fetch_section_list(self, text):
            '''
            抓取章/节(title,url)列表
            params:
                url:  访问页面URL
            return
                list  [(has_chapter, intro, (title, url)), ...] , has_chapter:  是否分章节,True-是,默认False
            '''
            soup = bs(text, "lxml")
            # 提取小节列表
            a_list = soup.select(r'h2 > a')
            # 提取书/章节描述信息(用于生成简介)
            section_list = [(a.get_text(), a.get('href')) for a in a_list]
            return section_list
    
        def fetch_content(self, text):
            """
            内容提取
            params:
                url: 小节URL地址
            return:
                content: 提取内容, 默认返回整个Body体内容
            """
            try:
                soup = bs(text, 'lxml')
                title = '

    ' + soup.title.text + '

    \n'
    content = soup.find('div', 'entry-content') if content is None: content = soup.find('article') return title + content.prettify() except Exception as e: print(e) return None if __name__ == '__main__': start_urls = [ { 'url': 'https://www.learnhard.cn/', 'page_num': 3, 'book_name': '悟空的修炼笔记', 'author': 'learnhard.cn', 'id': 'learnhard', 'lang': 'zh' }, ] ctx = mp.get_context('fork') p_list = [] for params in start_urls[:]: ebook = WordPressEbook(params, outdir="./") p = ctx.Process(target=ebook.fetch_book) p.start() p_list.append(p) for p in p_list: p.join()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110

    总结

    这个项目是将网页爬虫与epub电子书制作两个需求融合在一起产生的,只要设置好章节、内容爬取规则就可以自动生成一部epub电子书,然后将epub格式转换为mobi或者azw3格式后存放到kindle阅读吧。

    自己动手搞起来吧,既可以达到阅读博客文章的目的,又可以增长编程技能,你觉得这个项目怎么样?

    喜欢这个项目就关注我吧,点关注不迷路,记得到github上也一键三连呀。

  • 相关阅读:
    【考研英语语法】介词 Preposition
    测试报告和结果分析 —— allure整合pytest生成测试报告
    docker搭建 Nexus3 私服
    Java -基础知识之类的初始化顺序
    【嵌入式数据库之sqlite3】
    【Echarts多种曲线实例】Echarts多条曲线不同时间轴对比(附代码)
    【毕业设计源码】基于SSM的小程序任务调度管理信息系统设计与实现
    2022爱分析· 信创厂商全景报告 | 爱分析报告
    攻击者利用漏洞发动DDoS攻击,3万台GitLab服务器仍未修补
    【LeetCode】7. 整数反转
  • 原文地址:https://blog.csdn.net/dragonballs/article/details/126615204