1. 程式人生 > >我是如何將部落格轉成PDF的

我是如何將部落格轉成PDF的

前言

只有光頭才能變強

之前有讀者問過我:“3y你的部落格有沒有電子版的呀?我想要份電子版的”。我說:“沒有啊,我沒有弄過電子版的,我這邊有個文章導航頁面,你可以去文章導航去找來看呀”..然後就沒有然後了。

最近也有個讀者提過這個問題,然後這兩天也沒什麼事做,所以打算折騰折騰,看看怎麼把部落格轉成PDF。

一、準備工作

要將部落格轉成PDF,我首先想到的是能不能將markdown檔案轉成PDF(因為平時我就是用markdown來寫部落格的)。

  • 想了一下,原生markdown顯示的話,程式碼是沒有高亮的,格式也不會太好看。
  • 所以就放棄了這個想法。

於是就去想一下,可不可以將HTML轉成PDF呢。就去GitHub搜了有沒有相關的輪子,也搜到了一些關於Python的爬蟲啥的,感覺還是蠻複雜的。

後來,終於搜到了個不錯的:

**介紹:**收集一系列html轉文件的開源外掛,做成html頁面轉檔案的微服務整合Web應用,目前包含 html轉PDF、html轉圖片、html轉markdown等等。

功能:

  • 網頁轉PDF(參用wkhtml2pdf外掛)
  • 網頁轉圖片(參用wkhtml2pdf外掛)
  • 網頁轉Markdown(參用jHTML2Md)
  • 網頁轉WORD(參用Apache POI)

這裡我主要用到的網頁轉PDF這麼一個功能,對應的外掛是wkhtml2pdf。

1.1踩坑

發現了一個不錯的輪子了,感覺可行,於是就去下載來跑一下看看怎麼樣。啟動的時候倒沒有出錯,但在調介面的時候,老是丟擲異常。

  • 於是就開始查一下路徑,url有沒有問題啦,查來查去發現都沒問題啊。

後來才發現我的wkhtml2pdf.exe檔案打不開,說我缺少幾個dll檔案。於是,我首先想到的是去wkhtml2pdf官網看看有沒有相關的問題,想重新下載一個,但官網都進不去...(不是牆的問題)

好吧,於是就去找‘dll檔案缺失怎麼辦’。後面發現,安裝一下Visual C++ Redistributable for Visual Studio 2015就好了(沒有網上說得那麼複雜)

完了之後,發現可以將一個HTML轉成PDF了,效果還不錯

  • 有目錄
  • 可複製貼上
  • 可跳轉到連結
  • 清晰度好評

HTML轉成PDF

缺點:

  • 頁面載入速度慢的HTML,圖片還沒加載出來就已經生成PDF了
    • 所以我選用了部落格園(速度快)
  • 在PDF的末尾有好幾頁不相關的(評論,廣告啥的)

本來想著能不能只擷取HTML博文的部分啊(評論,廣告和其他不相關的不擷取)。於是就去搜了一下,感覺是挺麻煩的,自己做了幾次試驗都沒弄出來,最後放棄了。

後來又想了一下,我不是有一個沒有廣告的部落格平臺嗎,剛好可以拿來用了。但是,我自己寫完的markdown是沒有全部儲存在硬碟上的,後來發現簡書可以下載已釋出文章的所有markdown

簡書可以下載所有的文章

下載下來的文章,我想全部匯入到之前那個無廣告的部落格平臺上。但發現匯出來的markdown沒有高亮語法..

下載下來的markdown沒有高亮語法

// 沒有語法高亮咋看啊,所以到這裡我就放棄了,將就用一下部落格園生成的PDF吧

1.2爬蟲學習

上面GitHub提供的介面是一個URL生成一個PDF檔案,我是不可能一個一個將連結和標題放上去生成的(因為部落格園上發的也將近200篇了)。

而我是一點也不會爬蟲的,於是也去搜了一下Java的爬蟲輪子,發現一個很出名(WebMagic)

於是就跟著文件學習,也遇到了坑...文件給出的版本是0.7.3,我使用的JDK版本是8,用它的例子跑的時候丟擲了SSLException異常(然而網上的0.6.x版本是沒有問題的)

折騰完折騰去,也找到了0.7.3版本在JDK8上如何解決SSLException異常的辦法了:

修改HttpClientDownloader和HttpClientGenerator這兩個類的部分程式碼就好了。

但是,我還是死活寫不出能用的程式碼出來(真的菜!)..後來去問了一下同事(公眾號:Rude3Knife)咋搞,他用Python幾分鐘就寫好了。


def get_blog_yuan(blog_name, header):
    for i in range(1, 6):
        url = 'https://www.cnblogs.com/' + blog_name + '/default.html?page=' + str(i)
        r = requests.get(url, headers=header, timeout=6)
        selector = etree.HTML(r.text)
        names = selector.xpath("//*[@class='postTitle']/a/text()")
        links = selector.xpath("//*[@class='postTitle']/a/@href")
        for num in range(len(names)):
            print(names[num], links[num])
        time.sleep(5)

我也不糾結了..直接用他爬下來的資料吧(:

WebMagic中文文件:

最後

最後我就生成了好多PDF檔案了:

PDF檔案

// 這篇文章簡單記錄下我這個過程吧,還有很多要改善的[//假裝TODO]。如果你遇到過這種需求,有更好的辦法的話不妨在評論區下告訴我~~

WebMagic我的Demo還沒寫好!!!如果有興趣或者用過WebMagic的同學,有空的話不妨也去爬爬我的部落格園的文章,給我一份程式碼(hhhhh)

分析可能的原因:部落格園反爬蟲or爬取規則沒寫好

部門的前輩建議我去了解一下機器學習,我也想擴充套件一下眼界,所以這陣子會去學一下簡單的機器學習知識。(當然啦,我後面也會補筆記的)

樂於分享和輸出乾貨的Java技術公眾號:Java3y。關注即可領取海量的視訊資源!

帥的人都關注了

文章的目錄導航