天天看點

備份CSDN部落格正文到本地存檔

大哥有了新想法,然而沒有技術,令人欣慰的是大哥想到了我,于是我便答應免費幫個忙,這是一個基于雲的項目,具體細節也就不透露了,然而在實作的過程中,其中一個子產品我覺得可以自用,于是我就想把這個子產品抽出來,該子產品的功能就是将CSDN部落格上的文章下載下傳到本地。

        假期隻完成了一個模闆,雖然很垃圾,但是卻能滿足自用的需求,一直以來,我都很害怕自己喝懵了寫的一些感悟放在網上會在某一天再也打不開,事實上,這種事 情确實也發生過很多次。忘記使用者,文章被管理者删除,部落格被封閉,網站不再維護等都會導緻這樣的問題,于是我就不得不定期将自己在各個網站注冊的部落格複制 到一個本地的文檔上,包括網易的,百度的,CSDN的,51CTO的,以及老婆的QQ空間的(我總是将内容釋出在老婆的QQ上,因為那上面可以暢所欲 言),這麼多的網站,如此多的日志,工作量真的不少,久而久之,本地的存檔也越來越亂,漸漸的,有很多文章都被遺漏了。特别是CSDN的部落格,一直以來, 我都想将其完整的dump到本地,一篇一篇的複制,簡直不可能,因為太多了,也找過整站下載下傳器,但是效果不理想。趁此機會,别人委托我做的這個小玩意正好 可以用于此目的,而且比較滿意的一點就是dump下來的每一篇文章都裁掉了不相關的内容,比如友情連結,部落格通路量以及廣告等,唯一被保留的就是正文和正 文的圖檔資源。

        起初我是使用C++手工實作的,然而卻需要自行解析HTML文檔的各個标簽,落實下來就是複雜的字元串解析,其實字元串解析可以堪稱是程式設計的精髓,但是對 于實際做項目,這種工作還是直接使用現有的解析庫比較好,後來我發現使用腳本語言更簡單,比如使用python,perl,甚至grep/awk/sed 都可以,然而字元編碼卻始終是一個大問題。通過咨詢一個超猛的同僚,我認識了htmlparser這個java庫,實在是太友善了,它将html檔案元素 抽象成了各個類,這樣可以很友善的實作過濾,更可貴的是,這種過濾甚至都不用自己實作,htmlparser中自帶了過濾功能,你要做的隻是重載一些方法 即可,這樣就是使用很簡單的代碼實作這個部落格下載下傳功能了,下載下傳完了之後最好将其儲存成一個單獨的PDF文檔,雖然java也可以實作這個功能,然而目前已 經有了很多這樣的工具,有現成工具的就不程式設計實作,這永遠是一個真理。

        首先看一下效果,然後看一下代碼。

        儲存在本地的存檔擁有下面的目錄結構,首先是一個頂級目錄,以我部落格的标題來命名,内部是一個按月份存檔的目錄集合以及一個index.html索引檔案,如下圖所示:

備份CSDN部落格正文到本地存檔

展開一個月份存檔目錄,你将看到本月的文章集合,每一篇文章包含一個目錄,如下圖所示:

備份CSDN部落格正文到本地存檔

每一篇文章包含的目錄中儲存有該篇文章包含的所有圖檔,如果沒有包含圖檔,則目錄為空,如下圖:

備份CSDN部落格正文到本地存檔

随意打開一篇文章,你将看到該篇文章的标題以及正文,所有的圖檔也被包含,連結到了該文章的_files目錄中的對應圖檔,如下圖:

備份CSDN部落格正文到本地存檔

index.html呈現處以下的樣子:

備份CSDN部落格正文到本地存檔

點選每一篇,将跳轉到該篇文章

如果你以文本編輯器或者xcode打開每一篇文章或者index.html檔案,你将看到其中的大部分連結都被改成了本地的相對路徑了,并且删除了大量的無關的内容,這種修改很簡單,手工改其實很可以做到,使用程式來做當然更簡便些,問題是當你寫程式所帶來的麻煩超過了手工修改的麻煩時,這種程式設計就很沒有意義,幸運的是,htmlparser可以很簡單的做到這一點,一點也不複雜,這樣的話這種程式設計就顯得很有意義了。

        代碼很簡單,基本就是幾大塊:

1.幾次周遊-按首頁周遊月份資訊,按月份存檔周遊文章,按每一篇文章周遊圖檔;

2.解析關鍵資訊,比如标題,文章中的圖檔等,并填充資料結構。這種事可以通過Filter來完成;

3.根據filter的副作用填充的資訊生成目錄。

需要說明的是,以下的代碼完全是過程化的,沒有使用java語言的OO特性,是以它的資料以及方法完全是static的,沒有生成任何對象,我隻是想使用htmlparser的API以及java語言IDE的諸多良好的功能,比如方法以及方法參數的自動補全功能,老手或者科班高年級學生可能會較真地說,C/C++的IDE也可以支援這樣的功能,如果碰到這樣反駁的,我也可以說,其實嘛,彙編語言也是可以自動補全的…另外,代碼中有很多的寫死,其實應該将它們再抽象一下的,或者說定義成變量也可以,隻是因為自用,以後也不準備維護,就這麼着了。還有,那就是最大的問題,代碼有一些bug,比如對于标題中含有奇怪字元的支援,以及錯誤日志(這很重要)的記錄的缺失等等。不管怎麼說,代碼如下:

那麼,如果使用上面的代碼備份你自己的CSDN部落格呢?很簡單,将dog250改成你的ID即可,我在main方法中注釋了一大段的内容,你也可以将其展開,然後他就是通用的了,試試看。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1269013