抓取网页生成电子书(Windows,OSX及Linux操作系统格式的在线资料格式)
优采云 发布时间: 2021-10-16 13:30抓取网页生成电子书(Windows,OSX及Linux操作系统格式的在线资料格式)
自从我买了kindle,我就一直在想如何最大限度地发挥它的功效。虽然可供购买的书籍很多,网上也有很多免费的电子书,但还是有很多有趣的内容以网页的形式出现。例如,O'Reilly Atlas 提供了很多电子书,但只提供免费在线阅读;此外,许多材料或文件只是网络形式。所以我希望将这些网上资料以某种方式转换成epub或者mobi格式,以便在kindle上阅读。本文文章介绍了如何使用calibre并编写少量代码来实现这一目标。
Calibre 简介
Calibre 是一款免费的电子书管理工具,兼容 Windows、OS X 和 Linux。令人欣慰的是,除了GUI,calibre 还提供了很多命令行工具。ebook-convert 命令可以基于用户编写的食谱。该文件(实际上是python代码)抓取指定页面的内容,生成mobi等格式的电子书。爬取行为可以通过编写recipe来定制,以适应不同的网页结构。
安装口径
Calibre的下载地址是,您可以根据自己的操作系统下载相应的安装程序。
如果是Linux操作系统,也可以通过软件仓库安装:
Archlinux:
pacman -S calibre<br />
Debian/Ubuntu:
apt-get install calibre<br />
红帽/Fedora/CentOS:
yum -y install calibre<br />
请注意,如果您使用 OSX,则需要单独安装命令行工具。
抓取网页以生成电子书
下面以Git Pocket Guide为例,说明如何通过calibre从网页生成电子书。
找到索引页
要爬取整本书,首先要找到索引页。这个页面一般是目录,也就是目录页面,其中每个目录链接都连接到相应的内容页面。在生成电子书时,索引页会指导抓取哪些页面以及内容组织的顺序。在这个例子中,索引页是。
写食谱
食谱是一个带有食谱扩展名的脚本。内容其实是一段python代码,定义了calibre爬取页面的范围和行为。以下是爬取 Git Pocket Guide 的秘籍:
from calibre.web.feeds.recipes import BasicNewsRecipe<br /><br />class Git_Pocket_Guide(BasicNewsRecipe):<br /><br /> title = 'Git Pocket Guide'<br /> description = ''<br /> cover_url = 'http://akamaicovers.oreilly.com/images/0636920024972/lrg.jpg'<br /><br /> url_prefix = 'http://chimera.labs.oreilly.com/books/1230000000561/'<br /> no_stylesheets = True<br /> keep_only_tags = [{ 'class': 'chapter' }]<br /><br /> def get_title(self, link):<br /> return link.contents[0].strip()<br /><br /> def parse_index(self):<br /> soup = self.index_to_soup(self.url_prefix + 'index.html')<br /><br /> div = soup.find('div', { 'class': 'toc' })<br /><br /> articles = []<br /> for link in div.findAll('a'):<br /> if '#' in link['href']:<br /> continue<br /><br /> if not 'ch' in link['href']:<br /> continue<br /><br /> til = self.get_title(link)<br /> url = self.url_prefix + link['href']<br /> a = { 'title': til, 'url': url }<br /><br /> articles.append(a)<br /><br /> ans = [('Git_Pocket_Guide', articles)]<br /><br /> return ans<br />
下面解释了代码的不同部分。
整体结构
一般来说,一个recipe是一个python类,但是这个类必须继承calibre.web.feeds.recipes.BasicNewsRecipe。
解析索引
整个recipe的核心方法是parse_index,这也是recipes必须实现的唯一方法。该方法的目标是通过分析索引页的内容,返回一个稍微复杂一些的数据结构(稍后介绍)。这个数据结构定义了整个电子书的内容和内容组织顺序。
整体属性设置
在类的开头,定义了一些全局属性:
title = 'Git Pocket Guide'<br />description = ''<br />cover_url = 'http://akamaicovers.oreilly.com/images/0636920024972/lrg.jpg'<br /><br />url_prefix = 'http://chimera.labs.oreilly.com/books/1230000000561/'<br />no_stylesheets = True<br />keep_only_tags = [{ 'class': 'chapter' }]<br />
parse_index 返回值
下面通过分析索引页来描述parse_index需要返回的数据结构。
整体的返回数据结构是一个列表,其中每个元素是一个元组,一个元组代表一个卷。在这个例子中,只有一个卷,所以列表中只有一个元组。
每个元组有两个元素,第一个元素是卷名,第二个元素是一个列表,列表中的每个元素都是一个映射,表示一个章节(chapter),映射中有两个元素: title 和 url , Title是章节的标题,url是章节所在的内容页面的url。
Calibre 会根据parse_index 返回的结果对整本书进行爬取和组织,并会自行爬取处理内容内外的图片。
整个parse_index使用soup解析索引页,生成上述数据结构。
更多的
以上是最基本的食谱。如果想详细了解如何使用,可以参考API文档。
生成手机
写好菜谱后,可以在命令行中使用以下命令生成电子书:
ebook-convert Git_Pocket_Guide.recipe Git_Pocket_Guide.mobi<br />
您可以生成mobi 格式的电子书。ebook-convert 会爬取相关内容,根据配方代码自行组织结构。
最终效果
下面是在kindle上看到的效果。
内容
内容一
内容二
带图片的页面
实际效果
我的食谱仓库
我在github上做了一个kindle-open-books,里面有一些菜谱,是我自己写的,其他同学贡献的。欢迎任何人提供食谱。