制作网络小说的电子书

目录

最近一直在使用“追书神器”看小说,不过新版的“追书神器”不再提供免费网站,千万不要更新。 身为资深网络小说迷,怎能受制于人。

另外,手机屏幕太小,阅读体验远比不上 Kindle 之类的电纸书。 是时候自己动手写个工具,将网络小说制成电子书,便于放到 Kindle 上阅读了。

目标

制作电子书需要下面几个步骤:

  • 找到小说
  • 下载小说
  • 用下载的内容制作电子书

当前只开发了下载小说的工具,支持从固定的网站下载小说。 而制作电子书则通过 calibre 软件实现。 下面就介绍下载小说的工具。

下载小说

下载小说分为两步:找目录、按目录下载每个章节。

我使用 requests 获取网页,使用 beautiful soup 解析和输出 HTML 文件。

目前仅针对无图小说网开发下载工具。同样的思路也适用于其它小说网站。

获取目录

从小说目录页面获取目录链接列表,请看下面的函数

def get_contents(url) -> list:
    response = requests.get(url, proxies=proxies)
    bs_object = BeautifulSoup(response.content, "html.parser")
    table_node = bs_object.select('dd > table')
    link_nodes = table_node[0].findAll('a')
    contents = []
    for a_link in link_nodes:
        if 'href' not in a_link.attrs:
            continue
        href = a_link['href']
        link = urljoin(url, href)
        contents.append({
            'name': a_link.string,
            'link': link
        })
    return contents

下载小说章节

从每个章节页面获取章节内容,并组成新的HTML字符串,请看下面的函数。

def get_novel_chapter(url) ->str:
    response = requests.get(url, proxies=proxies)
    bs_object = BeautifulSoup(response.content, "html.parser")
    title_node = bs_object.select_one('#a_main h1')
    content_node = bs_object.select_one('#contents')
    paragraphs = content_node.strings
    html_chapter = BeautifulSoup("
<html>
 <head>
 </head>
 <body>
  <div>
   <div>
    <p></p>
   </div>
  </div>
 </body>
</html>", "html5lib")
    main_div = html_chapter.div
    html_title_node = html_chapter.new_tag('h1')
    html_title_node.string = title_node.string
    main_div.append(html_title_node)
    html_content_node = html_chapter.new_tag('div')
    main_div.append(html_content_node)
    for a_paragraph in paragraphs:
        p_text = a_paragraph.string.strip()
        p_node = html_chapter.new_tag('p')
        p_node.string = p_text
        html_content_node.append(p_node)
    return html_chapter.prettify()

保存HTML文件

最后,将字符串保存成 HTML 文件。

chapter_html = get_novel_chapter(link)
chapter_html_file_path = 'some path'
with open(chapter_html_file_path, "w", encoding="utf-8") as f:
    f.write(chapter_html)

参考

perillaroc/novel-downloader

BeautifulSoup文档