Bookfere首發:如何用 KindleEar 推送無 RSS 的網站內容(上篇)

無需破費 用30天Kindle unlimited:https://amzn.to/2NNksoy

無需破費 用Audible有聲書30天:https://amzn.to/2MPAazN

僅限Amazon Prime會員!史低價!新款Kindle Paperwhite 4,更薄更輕防水設計,8GB存儲 $89.99 免運費32GB版僅售$114.99 。 (注意價格下方的提示:Join Prime to save $40.00 on this item ) 如果你之前從未使用過Amazon Prime會員,現可立即開始30天Prime免費試用

之前書伴曾介紹過利用 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 系統:

https://storage.googleapis.com/appengine-sdks/featured/GoogleAppEngine-1.9.85.msi

macOS 系統:

https://storage.googleapis.com/appengine-sdks/featured/GoogleAppEngineLauncher-1.9.85.dmg

Linux 系統:

https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.85.zip

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

Windows 系統(64 位):

https://www.python.org/ftp/python/2.7.16/python-2.7.16.amd64.msi

Windows 系統(32 位):官方下載

https://www.python.org/ftp/python/2.7.16/python-2.7.16.msi

此外,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 源代碼:

https://github.com/cdhigh/KindleEar/archive/master.zip

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

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

為了之後上傳方便,建議去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 已經在本機正常運行了:

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 為例,由淺入深詳細說明如何編寫 KindleEar 的抓取腳本。編寫好的腳本可抓取指定板塊下指定數量和日期的新聞條目,並將其整合到同一本電子書中,其中還包括對內容頁、分頁等細節的處理。最後,把測試成功的抓取腳本上傳部署到 Google App Engine 的生產環境上。

▲ China Daily 網站抓取效果

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

本文標題:《Bookfere首發:如何用 KindleEar 推送無 RSS 的網站內容(上篇)》,本文鏈接:http://www.yunjialeguanwang.com/archives/4058.html