如何自动生成一本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: [email protected]
# 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 = '<h1>' + soup.title.text + '</h1>\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()

总结

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

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

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

猜你喜欢

转载自blog.csdn.net/dragonballs/article/details/126615204