如何用 KindleEar 推送无 RSS 的网站内容(上篇)

优采云 发布时间: 2022-05-08 05:12

  如何用 KindleEar 推送无 RSS 的网站内容(上篇)

  之前书伴曾介绍过利用 Calibre 抓取网站内容制成电子书的方法,可以很方便地生成既美观又实用的期刊样式电子书。Calibre 功能的强大毋庸置疑,不过在实际使用时却有一个明显的不便之处:当你想要定时推送某个内容源时,就必须让运行 Calibre 的电脑一直保持开机状态。因此,很多小伙伴选择使用有着类似功能,并且能免费托管在 Google App Engine 服务器上的开源程序 KindleEar 来解决这个问题。

  KindleEar 虽然支持直接订阅 RSS,但可惜很多 RSS 供稿可用性并不高,内置的订阅又无法满足个性化的需求,在这种情况下,就有必要学会自己编写可精准获取目标网站内容的抓取脚本。这里所说的“抓取脚本”也可以理解成为 KindleEar 添加内置订阅,内置的订阅其实也是由一个个定制的抓取脚本组成。

  写这篇文章的动机是网友 Jone 发给书伴的一封长信,他在信中详细描述了自己想要解决的问题:如何在没有编程基础的前提下编写 KindleEar 抓取脚本,并能方便地重新部署到 Google App Engine 上。所以书伴花了几天研究了一下 KindleEar 的抓取脚本,并将经验分享给需要的小伙伴。为了顾及没有任何编程经验的小伙伴,本文会尽可能以普通用户的视角撰写,对涉及代码的部分尽可能做到形象化的说明。

  由于编写 KindleEar 抓取脚本牵涉到测试环境的配置,导致篇幅较长,所以本文分成了“上篇”和“下篇”。上篇主要是抓取脚本的相关介绍和测试环境的配置步骤,下篇则是编写抓取脚本的具体步骤。

  一、KindleEar 的抓取方式

  KindleEar 和 Calibre 一样,支持通过“RSS”或“网页(HTML)”两种方式抓取目标网站上的内容。

  KindleEar 对 RSS 和 HTML 有着不同的处理方式。当目标站点提供 RSS 时,它就会用通用的 RSS 处理模块来提取供稿内容生成电子书,也就是前面提到的“自定义 RSS”。直接用 RSS 自然是最方便的,但现实世界的情况总比理想中的复杂,有很多种原因导致我们无法顺利获取 RSS,比如有些网站根本就不提供 RSS,或者提供了 RSS 却只有摘要信息,甚至提供的 RSS 存在格式上的错误无法正常读取等。

  RSS 本质上只是一种简单的数据格式,其结构有着相对严格和固定的规范,所以只需要一个通用处理模块就可以应付几乎所有站点的 RSS 供稿。而 HTML 页面就没这么省心了,可以说不同网站的 HTML 标签结构存在着天壤之别,所以当目标站点不提供 RSS 时,就只能为其编写高度定制化的抓取脚本。

  说点题外话:可能很多小伙伴会疑惑,为什么很多网站都不提供 RSS 呢?RSS 生来就是为了方便用户追踪网站更新的,从用户角度来看是相当方便——不用访问网站就能获取到网站内容更新,但是这却不可避免地影响到了内容提供者的商业利益。虽然十多年前很多人也为 RSS 做过一些商业化的尝试,但终以失败告终。随着 2013 年 Google 关闭 Google Reader,算是宣告了 RSS 大时代的终结。现在除了一些博客以及尚有情怀的网站外,大都不再提供 RSS 供稿了,即便提供也只是放点摘要信息,最终的目的还是把用户引导到自己的网站上。RSS 并没有消亡,只是因为它给了用户太多自由而不太被商业容忍。

  二、KindleEar 的抓取脚本

  在《Calibre 使用教程之抓取网站页面制成电子书》这篇文章中,书伴详细介绍了如何通过编写 Recipe 脚本的方式让 Calibre 抓取指定网站的内容,KindleEar 也提供了类似的功能。不过需要注意的是,虽然 KindleEar 的 MOBI 转换模块提取自 Calibre,但是抓取脚本却与 Calibre 的 Recipe 脚本并不通用,这是因为 KindleEar 并没有直接移植 Calibre 的 Recipe 处理模块,而是将其作为参考重新写了一个处理模块,这导致包括脚本后缀名(KindleEar 是 .py,Calibre 是 .recipe)、相关功能的实现等很多方面都有所不同。因此,你必须遵循 KindleEar 提供的相关功能函数为 KindleEar 编写专用的抓取脚本。

  KindleEar 内置的抓取脚都存放在其项目目录下的 books 目录中,脚本的文件名均以英文命名并以 .py 为后缀。每个脚本都继承同目录下名为 base.py 的基类,该基类已对很多种抓取方式做了定义,比如 RSS、HTML 页面、*敏*感*词*等。我们所创建的抓取脚本就是通过继承这个基类,再根据实际情况改写、定制其中的一些参数和函数,从而实现对目标网站内容的精准抓取。KindleEar 的作者在 base.py 做了大量注释,如果你有一定的编程经验,完全可以根据这些注释说明来理解其中的参数和函数都是如何工作的。

  三、KindleEar 的调试环境

  由于 KindleEar 的运行依赖于 Google App Engine 环境,无法像用 Calibre 测试 Recipe 脚本那样直接在本地运行,所以为了方便测试编写的 KindleEar 抓取脚本,我们需要在本地搭建可以为 KindleEar 虚拟运行环境的 Google App Engine SDK(Windows 还需要安装 Python 环境和相关的 Python 库)。

  不要害怕任何技术性字眼,按照步骤一步步做一般不会有问题。注意不要忽略任何一段文字。

  1、安装 App Engine SDK

  下面是 Google App Engine SDK 的下载链接,请根据自己的系统类型选择下载安装:

  Windows 系统:

  macOS 系统:

  Linux 系统:

  因为 KindleEar 是 Python 程序,所以 SDK 还会依赖 Python 环境。macOS 系统和 Linux 系统都预装了 Python,而对于 Windows 系统,如果没有安装 Python,就需要手动安装 2.7.x 版本的 Python:

  Windows 系统(64 位):

  Windows 系统(32 位):官方下载

  此外,KindleEar 的运行还依赖一些第三方 Python 库,这些库需要在命令行中用 pip 命令安装。

  注意,本文之后的内容经常会用到命令行,所以应记住,当文中说到输入命令时,你需要打开“终端”(Windows 系统则打开“命令提示符”),把相关命令输入(或拷贝)进去,按回车执行。

  macOS 和 Linux 用户可直接通过执行下面的命令安装这些第三方 Python 库:

  pip install lxml pillow jinja2 pycrypto

  Windows 用户需要先下载安装微软的 Microsoft Visual C++ Compiler for Python 2.7,因为安装第三方 Python 库的对其有依赖。安装完成后,通过以下命令安装 KindleEar 依赖的第三方 Python 库:

  C:\Python\Scripts\pip install lxml pillow jinja2 pycrypto

  * 提示:上面这条命令假设你的 Python 是默认安装在 C 盘的,如果指定了其它磁盘,请自行更改路径。

  2、获取 KindleEar 源代码

  首先需要获取一份 KindleEar 源代码到本地。你可以通过下面的链接下载 ZIP 包解压缩备用:

  KindleEar 源代码:

  如果你的电脑已经安装了 Git 工具,也可以通过 Git 的 Clone 命令将源代码拉取到本地:

  git clone

  为了之后上传方便,建议去 GitHub 注册一个账户,然后把 KindleEar 项目 Fork 一份到自己的账户下,这样,在添加好编写的抓取脚本后,可以先将源代码 Push 到你 Fork 的项目中,再按照 KindleEar 搭建教程中的“自动上传”方式利用 Google App Engine 的云端 Shell 重新部署你 Fork 的 KindleEar 项目。

  3、在本地运行 KindleEar

  接下来就是让 KindleEar 在本机运行起来了。注意,在这里我们不使用带界面的 Google App Engine Launcher,而只使用它附带的命令行工具。默认情况下,Windows 系统可以直接在命令提示符中使用这些命令,而 macOS 系统需要先打开界面版的 Google App Engine Launcher,点击软件的菜单中的“Make Symlinks…”创建命令软链接才能使用命令。Linux 系统需要添加 PATH 变量才能使用命令。

  打开终端(Windows 系统打开命令提示符)并定位到 KindleEar 的项目目录。假设项目在系统桌面上。

  macOS 系统需要输入类似以下命令定位到 KindleEar 项目目录(注意替换 YOURNAME):

  cd /Users/YOURNAME/Desktop/KindleEar

  Windows 系统则需要输入类似以下命令定位到 KindleEar 项目目录(注意替换 YOURNAME):

  cd C:\Users\YOURNAME\Desktop\KindleEar

  定位到 KindleEar 项目目录后,输入以下命令让 KindleEar 运行起来(注意有两个空格):

  dev_appserver.py ./app.yaml ./module-worker.yaml

  当你看到终端(或命令提示符)上出现如下所示的输出,就说明 KindleEar 已经在本机正常运行了:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线