如何用 KindleEar 推送無 RSS 的網站內容(上篇) – 書伴

之前書伴曾介紹過利用 Calibre 抓取網站內容制成電子書的方法,可以很方便地生成既美觀又實用的期刊樣式電子書。Calibre 功能的強大毋庸置疑,不過在實際使用時卻有一個明顯的不便之處,那就是當你想要定時推送某個內容源時,需要讓運行 Calibre 的電腦一直開機。因此,很多小伙伴選擇使用有著類似功能,并且可以免費托管在 Google App Engine 服務器上的開源程序 KindleEar 來解決這個問題。

雖然 KindleEar 支持直接訂閱 RSS,但是由于很多 RSS 并不靠譜,很多時候無法滿足閱讀需求,而內置的訂閱又無法滿足個性化的需求,所以就需要學會自己編寫腳本來精準抓取目標網站的內容。

寫這篇文章的動機是網友 Jone 發給書伴的一封長信,他在信中詳細描述了自己想要解決的問題:如何在沒有編程基礎的前提下編寫 KindleEar 抓取腳本,并能方便地重新部署到 Google App Engine 上。所以書伴花了幾天研究了一下 KindleEar 的抓取腳本,并將經驗分享給需要的小伙伴。為了顧及沒有任何編程經驗的小伙伴,本文會盡可能以普通用戶的視角撰寫,對涉及代碼的部分盡可能做到形象化的說明。

目錄

一、KindleEar 的抓取方式
二、KindleEar 的抓取腳本
三、KindleEar 的調試環境
1、安裝 App Engine SDK
2、在本地運行 KindleEar

由于編寫 KindleEar 抓取腳本牽涉到測試環境的配置,導致篇幅較長,所以本文分成了“上篇”和“下篇”。上篇主要是抓取腳本的相關介紹和測試環境的配置步驟,下篇則是編寫抓取腳本的具體步驟。

一、KindleEar 的抓取方式

KindleEar 和 Calibre 一樣,支持通過“RSS”或“網頁”兩種方式抓取目標網站上的內容。這兩種方式中,最方便的當屬 RSS 了,只要目標網站提供了 RSS 地址,直接將其添加到 KindleEar 的“自定義 RSS”就可以了。但是現實世界的情況總比想象中的復雜,有很多種原因導致 RSS 無法被順利抓取,比如有些網站根本就不提供 RSS,或者提供了 RSS 卻只有簡短的摘要信息,甚至提供的 RSS 有格式上的錯誤等。

RSS 本質上只是一種簡單的數據格式,其承載的內容和 HTML 格式一樣也是由站點的數據填充的。對于 KindleEar 來說,當抓取的目標站點提供 RSS 時,它就可以用通用的 RSS 抓取功能來提取內容生成電子書,也就是前面提到的“自定義 RSS”;而在目標站點不提供 RSS 時,我們就需要通過編寫腳本直接抓取其 HTML 頁面上的內容來生成電子書,KindleEar 內置的那些訂閱其實就是一個個定制的抓取腳本。

說點題外話:可能很多小伙伴會疑惑,為什么很多網站都不提供 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、網頁、漫畫等。我們所創建的抓取腳本就是通過繼承這個基類,再根據實際情況改寫、定制其中的一些參數和函數,從而實現對目標網站內容的精準抓取。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 的下載鏈接,請根據自己的系統類型選擇下載安裝:

因為 KindleEar 是 Python 程序,所以 SDK 還會依賴 Python 環境。macOS 系統和 Linux 系統都預裝了 Python,而對于 Windows 系統,如果沒有安裝 Python,就需要手動安裝 2.7.x 版本的 Python:

此外,KindleEar 的運行還依賴一些第三方 Python 庫,這些庫需要在命令行中用 pip 命令安裝。

注意,本文之后的內容經常會有用到命令行的地方,所以應記住,當文中說到輸入命令時,你需要打開終端(Windows 系統打開“命令提示符”),把相關命令輸入(或拷貝)進去,按回車執行。

macOSLinux 用戶可直接通過執行下面的命令安裝這些第三方 Python 庫:

pip install lxml pillow jinja2 pycrypto

Windows 用戶需要先下載安裝微軟的 Microsoft Visual C++ Compiler for Python 2.7,因為安裝第三方 Python 庫的對其有依賴。安裝完成后,通過以下命令安裝 KindleEar 依賴的第三方 Python 庫:

C:PythonScriptspip install lxml pillow jinja2 pycrypto

* 提示:上面這條命令假設你的 Python 是默認安裝在 C 盤的,如果指定了其它磁盤,請自行更改路徑。

2、在本地運行 KindleEar

首先需要獲取一份 KindleEar 源代碼到本地。你可以通過下面的鏈接下載 ZIP 包解壓縮備用:

如果你的電腦已經安裝了 Git 工具,也可以通過 Git 的 Clone 命令將源代碼拉取到本地:

git clone https://github.com/cdhigh/KindleEar.git

接下來就是讓 KindleEar 在本機運行起來了。注意,在這里我們不使用帶界面的 Google App Engine Launcher,而只使用它附帶的命令行工具。默認情況下,Windows 系統可以直接在命令提示符中使用這些命令,而 macOS 系統需要先打開界面版的 Google App Engine Launcher,點擊軟件的菜單中的“Make Symlinks…”創建命令軟鏈接才能使用命令。Linux 系統需要添加 PATH 變量才能使用命令。

打開終端(Windows 系統打開命令提示符)并定位到 KindleEar 的項目目錄。假設項目在系統桌面上。

macOS 系統需要輸入類似以下命令定位到 KindleEar 項目目錄:

cd /Users/yourname/Desktop/KindleEar

Windows 系統則需要輸入類似以下命令定位到 KindleEar 項目目錄:

cd C:UsersyournameDesktopKindleEar

定位到 KindleEar 項目目錄后,輸入以下命令讓 KindleEar 運行起來:

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

當你看到終端或命令提示符上出現如下所示的輸出,就說明 KindleEar 已經在本機正常運行了:

INFO     2019-05-11 13:51:41,358 sdk_update_checker.py:231] Checking for updates to the SDK.
INFO     2019-05-11 13:51:44,383 sdk_update_checker.py:247] Update check failed: 
INFO     2019-05-11 13:51:44,613 api_server.py:275] Starting API server at: http://localhost:49342
INFO     2019-05-11 13:51:44,625 dispatcher.py:256] Starting module "default" running at: http://localhost:8080
INFO     2019-05-11 13:51:44,667 dispatcher.py:256] Starting module "worker" running at: http://localhost:8081
INFO     2019-05-11 13:51:44,672 admin_server.py:150] Starting admin server at: http://localhost:8000
INFO     2019-05-11 13:51:46,928 instance.py:294] Instance PID: 37115

打開瀏覽器(推薦用 Chrome),輸入 http://localhost:8080 即可訪問運行在本機上的 KindleEar,輸入默認用戶名和密碼 admin 即可登入控制界面。至此,KindleEar 的調試環境便準備好了。

本文的下篇將會以 China Daily 為例,由淺入深詳細說明編寫抓取腳本的具體步驟。寫好的腳本可抓取指定板塊下的新聞條目,并將其整合到同一本電子書中,其中還包括對內容頁、分頁等細節的處理。最后,把測試成功的抓取腳本上傳部署到 Google App Engine 環境上。推送到 Kindle 的效果如下圖所示。

▲ China Daily 網站抓取效果

為方便編寫代碼,建議先備好一款代碼編輯器,推薦 Sublime TextVisual Studio Code。如果你對 KindleEar 抓取腳本有什么疑問,或者發現本教程存在的謬誤或不詳盡之處,歡迎留言。

未經允許不得轉載:螞蟻搬書 » 如何用 KindleEar 推送無 RSS 的網站內容(上篇) – 書伴
微信公眾號:螞蟻搬書
關注我們,分享kindle電子書資源
12000人已關注
分享到:
贊(0) 打賞

評論搶沙發

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

微信掃一掃打賞

2元体彩七星彩走势图