抓取网页内容生成Kindle电子书

标签: 网页 kindle 电子书 | 发表时间:2014-03-26 16:00 | 作者:ericzhang.buaa@gmail.com 张洋
出处:http://blog.codinglabs.org

自从买了kindle后,总是想着如何最大效用发挥其效用。虽然多看上有很多书可以购买,网上也有很多免费的电子书,但是仍然有很多感兴趣的内容是以网页的形式存在的。例如 O’Reilly Atlas就提供了诸多电子书,但是只提供免费的在线阅读;另外还有很多资料或文档都只有网页形式。于是就希望通过某种方法讲这些在线资料转为epub或mobi格式,以便在kindle上阅读。这篇文章介绍了如何借助calibre并编写少量代码来达到这个目的。

Calibre

Calibre简介

Calibre是一个免费的电子书管理工具,可以兼容Windows, OS X及Linux,令人欣喜的是,除了GUI外,calibre还提供了诸多命令行工具,其中的ebook-convert命令可以根据用户编写的recipes文件(实际是python代码)抓取指定页面内容并生成mobi等格式的电子书。通过编写recipes可以自定制抓取行为,以适应不同的网页结构。

安装Calibre

Calibre的下载地址是 http://calibre-ebook.com/download,可以根据自己的操作系统下载相应的安装程序。

如果是Linux操作系统,还可以通过软件仓库安装:

Archlinux:

pacman -S calibre

Debian/Ubuntu:

apt-get install calibre

RedHat/Fedora/CentOS:

yum -y install calibre

注意,如果你使用OSX,需要单独安装 Command Line Tool

抓取网页生成电子书

下面以 Git Pocket Guide为例,说明如何通过calibre从网页生成电子书。

找到index页

要抓取整本书,第一件事就是找到index页,这个页面一般是Table of Contents,也就是目录页,其中每个目录项链接到相应内容页。index页将会指导抓取哪些页面以及生成电子书时内容组织顺序。在这个例子中,index页面是 http://chimera.labs.oreilly.com/books/1230000000561/index.html

编写recipes

Recipes是一个以recipe为扩展名的脚本,内容实际上是一段python代码,用来定义calibre抓取页面的范围和行为,下面是用于抓取Git Pocket Guide的recipes:

from calibre.web.feeds.recipes import BasicNewsRecipe

class Git_Pocket_Guide(BasicNewsRecipe):

    title = 'Git Pocket Guide'
    description = ''
    cover_url = 'http://akamaicovers.oreilly.com/images/0636920024972/lrg.jpg'

    url_prefix = 'http://chimera.labs.oreilly.com/books/1230000000561/'
    no_stylesheets = True
    keep_only_tags = [{ 'class': 'chapter' }]

    def get_title(self, link):
        return link.contents[0].strip()

    def parse_index(self):
        soup = self.index_to_soup(self.url_prefix + 'index.html')

        div = soup.find('div', { 'class': 'toc' })

        articles = []
        for link in div.findAll('a'):
            if '#' in link['href']:
                continue

            if not 'ch' in link['href']:
                continue

            til = self.get_title(link)
            url = self.url_prefix + link['href']
            a = { 'title': til, 'url': url }

            articles.append(a)

        ans = [('Git_Pocket_Guide', articles)]

        return ans

下面分别解释代码中不同部分。

总体结构

总体来看,一个recipes就是一个python class,只不过这个class必须继承calibre.web.feeds.recipes.BasicNewsRecipe。

parse_index

整个recipes的核心方法是parse_index,也是recipes唯一必须实现的方法。这个方法的目标是通过分析index页面的内容,返回一个稍显复杂的数据结构(稍后介绍),这个数据结构定义了整个电子书的内容及内容组织顺序。

总体属性设置

在class的开始,定义了一些全局属性:

title = 'Git Pocket Guide'
description = ''
cover_url = 'http://akamaicovers.oreilly.com/images/0636920024972/lrg.jpg'

url_prefix = 'http://chimera.labs.oreilly.com/books/1230000000561/'
no_stylesheets = True
keep_only_tags = [{ 'class': 'chapter' }]
  • title:电子书标题
  • description:电子书描述
  • cover_url:电子书的封面图片
  • url_prefix:这是我自用的属性,是内容页面的前缀,用于后面拼装内容页的完整url
  • no_stylesheets:不要使用页面CSS样式
  • keep_only_tags:这一行告诉calibre分析index页时仅考虑class属性为“chapter”的DOM元素,如果你看index页的源码会发现这对应一级标题。之所以这样是因为在这个例子中,index页面每个一级标题对应一个独立内容页,而二级标题仅链接到页面中某个锚点(anchor),所以仅需考虑一级标题

parse_index返回值

下面介绍parse_index需要通过分析index页面返回的数据结构。

总体返回数据结构是一个list,其中每个元素是一个tuple,一个tuple表示一卷(volume)。在这个例子中只有一卷,所以list中只有一个tuple。

每个tuple有两个元素,第一个元素是卷名,第二个元素是一个list,list中每个元素是一个map,表示一章(chapter),map中有两个元素:title和url,title是章节标题,url是章节所在内容页的url。

Calibre会根据parse_index的返回结果抓取并组织整个书,并且会自行抓取并处理内容中外链的图片。

整个parse_index使用soup解析index页并生成上述数据结构。

更多

上面是最基本的recipes,想了解更多的使用方法,可以参考 API文档

生成mobi

编写好recipes后,在命令行下通过如下命令即可生成电子书:

ebook-convert Git_Pocket_Guide.recipe Git_Pocket_Guide.mobi

即可生成mobi格式的电子书。ebook-convert会根据recipes代码自行抓取相关内容并组织结构。

最终效果

下面是在kindle上看到的效果。

目录

内容一

内容二

含有图片的页

实际效果

我的recipes仓库

我在github上建了一个 kindle-open-books,里面放了一些recipes,有我写的,也有其他同学贡献的。欢迎任何人贡献的recipes。

相关 [网页 kindle 电子书] 推荐:

抓取网页内容生成Kindle电子书

- - CodingLabs
自从买了kindle后,总是想着如何最大效用发挥其效用. 虽然多看上有很多书可以购买,网上也有很多免费的电子书,但是仍然有很多感兴趣的内容是以网页的形式存在的. 例如 O’Reilly Atlas就提供了诸多电子书,但是只提供免费的在线阅读;另外还有很多资料或文档都只有网页形式. 于是就希望通过某种方法讲这些在线资料转为epub或mobi格式,以便在kindle上阅读.

Kindle 原系统上读 ePub 电子书

- stier - Page to Page
在Kindle上安装过Launchpad以后,再安装fbKindle好像是顺理成章的事,毕竟剩下的就是复制fbKindle文件到Kindle上就可以了. 虽然平时遇到Epub格式的电子书习惯上是拿软件转一下,不过有了fbKindle以后也可以直接拷到Kindle阅读,迈开了越狱的步子,也不怕多走一步,继续动手.

Kindle电子书资源网站汇总

- lichzy - Yoxu Home
以下收集了部分个人收藏的优秀的kindle电子书资源网站,欢迎补充. 推荐的网站以个人喜好为主,勿喷. 【推荐】amazon官方推荐的免费电子书下载网站(http://www.amazon.com/b?ie=UTF8&node=2245146011). * Project Gutenberg (http://www.gutenberg.org/)Over 30,000 free titles.Project Gutenberg, one of the original sources of free ebooks, is dedicated to the creation and distribution of eBooks..

《财富》推乔布斯自传 仅提供Kindle电子书

- xing - cnBeta.COM
新浪科技讯 北京时间9月28日下午消息,据美国科技资讯网站CNET报道,《财富》杂志周二推出了新版史蒂夫・乔布斯(Steve Jobs)自传,该自传内容采集于《财富》杂志的以往报道,目前只在亚马逊Kindle商店中以电子书的形式提供阅读.

装了电子书后的Kindle阅读器要更重一些

- 苦吟 - 雷锋网
装了电子书后的Kindle阅读器是否会更重. 电子书又不是看得见摸得着有重量的实体书. 但是,加州大学伯克利分校计算机教授John D. Kubiatowicz会很严肃的告诉你,确实如此. Kubiatowicz教授的依据是,电子设备通过捕获电子并将其转化为0和1信息进行数据处理,你的Kindle上装的电子书越多,数据处理量越大,电子运动也越频繁.

Amazon Kindle英国电子书销量超过实体书

- - Solidot
英国亚马逊(Amazon.co.uk)宣布它的Kindle电子书销量超过了实体书. 每售出一百本实体书,它同时售出112本电子书. 去年五月,它的电子书销量就已经超过了精装本,现在则超过了平装本和精装本总和. 亚马逊称,读者更偏爱kindle电子书. EL James的《Fifty Shades of Grey》系列是Kindle最畅销电子书.

谷歌首款电子书酷似一代Kindle 售价140美元

- NOir - GeekPark 捕风捉影
谷歌刚刚在其博客上宣布,它将与硬件厂商iRiver合作推出它的第一款电子阅读器,这款电子阅读器将内置谷歌的eBookstore支持. 谷歌称,这款电子阅读器的名称叫作“iRiver Story HD”,外观酷似亚马逊的第一代Kindle,只是按键的颜色是青铜色的. Story HD的用户可以直接从Google eBookstore购买电子书.

亚马逊将允许Kindle用户从图书馆借阅电子书

- Eddy - cnBeta.COM
亚马逊今日宣布,Kindle用户今后可从美国1.1万家图书馆中下载电子图书. 目前大部分美国图书馆都提供电子图书版本,并向除Kindle以外大部分电子图书阅读器开放,例如智能手机以及iPad平板电脑等.

Kindle用户可从1.1万家美国图书馆借阅电子书

- long - Solidot
亚马逊宣布,Kindle用户将可以从超过1.1万家的美国图书馆里借阅Kindle电子书. 用户通过登录亚马逊的账户获得阅读权限,然后可以使用Wi-Fi、USB等连接方式,将电子书下载到设备上. 在此次开放阅读中,用户除了可以通过Kindle客户端以外,还可以使用PC和智能手机等设备,通过亚马逊的应用程序,来阅读这些数字图书.

亚马逊发布支持 HTML5 格式的新电子书格式 Kindle Format 8

- charles - Engadget 中国版
「好漂亮的图书」,这是亚马逊希望新的 Kindle Format 8 (KF8)电子书格式带给读者最直观的感觉,这个格式将支持 HTML5 ,并成为 Kindle 电子书的新格式. 官方宣称,KF8 格式允许出版商基于改进的功能推出更加吸引人的画册、漫画、图文小说;其支持更多文件格式,设计元素也有所增加,增加了逾 150 种格式功能,包括固定布局、嵌套表格、侧边栏、可扩展性图形;也即是说文本、字体和图片的排版布局能力得到提升.