1. 程式人生 > >爬取博客並轉成pdf

爬取博客並轉成pdf

def href tmp std 執行 tex import lac 文件名

前些天無意間看到了“birdben”的博客,寫的比較詳細,但是最新的文章更新時間是“2017-05-07”,時間很是久遠,本打算有時間認真學習一下博主所寫的文章,但是擔心網站會因為某些原因停止服務,於是想到將博主寫的所有文章爬下來保存成pdf,說幹就幹!


你們可以點擊這裏,查看博主的網站。

一、使用到的模塊

  pdfkit:可以將文本、html、url轉成pdf,但是需要安裝wkhtmltopdf.exe,並獲取它的安裝路徑

      pdfkit是基於wkhtmltopdf的python封裝,支持url,本地文件,文本內容轉成pdf,最終還是調用wkhtmltopdf的命令

  PyPDF2:處理pdf的模塊,可讀可寫可合並

 

二、思路分析

  1、博客url分析

主頁url:https://birdben.github.io/
第二頁url:https://birdben.github.io/page/2/
最後一頁url:https://birdben.github.io/page/14/

 某篇文章的url:

技術分享圖片

  查看主頁的html

技術分享圖片

  可以看出:該博客網站共有15個主頁面,每篇文章的url可以使用 “主頁url” + “href”  (見上圖)

  2、整體思路

    • 生成所有頁面的url列表
    • 遍歷每個頁面的url,在html中匹配出每個文章的href,拼接成每個文章的url
    • 利用url生成pdf
    • 合並pdf

三、代碼過程

  1、博客網站共有15個頁面,生成這15個頁面的url

	def geturl():
	    url = "https://birdben.github.io/archives/"
	    list = [url]
	    for i in range(2,15):
	        str = "%spage/%d/" % (url,i)
	        list.append(str)
          return list

   返回的結果:

技術分享圖片

  2、根據已經獲得的頁面url,讀取url,查看html,匹配符合要求的href 

	def getname(url,):
	    r = requests.get ( url )
	    str = "".join(r.text)
	    pattern = re.compile(r‘<a class="archive-article-title" href="(.*)">.*?</a>‘)
	    match = pattern.findall(str)
	    r.close()
         return match

  結果:

技術分享圖片

  3、拼接url,生成每個文章的url,利用url轉成pdf

  4、合並pdf

四、最終代碼

import requests
import re
import pdfkit
from PyPDF2 import PdfFileReader, PdfFileMerger
import os

#獲取一個頁面所有的 文章全稱 用於構建每篇文章的url路徑
def getname(url,):
    r = requests.get ( url )
    str = "".join(r.text)
    pattern = re.compile(r‘<a class="archive-article-title" href="(.*)">.*?</a>‘)
    match  = pattern.findall(str)
    r.close()
    return match

#獲取他的所有頁面,每個頁面會有很多文章
def geturl():
    url = "https://birdben.github.io/archives/"
    list = [url]
    for i in range(2,15):
        str = "%spage/%d/" % (url,i)
        list.append(str)
    return list

#將url轉換成pdf
def savepdf(url,pdfname):
    path_wkthmltopdf = r"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"
    config = pdfkit.configuration ( wkhtmltopdf=path_wkthmltopdf )
    pdfkit.from_url ( url , pdfname , configuration=config )

#爬取所有文章轉成pdf
def do():
    urllist = geturl()
    for url in urllist:
        namelist = getname(url)
        for blog in namelist:
            blogurl = "https://birdben.github.io" + blog
            pdfname = r"pdf\%s.pdf" % blog.strip("/").split("/")[-1]  #將pdf保存到當前目錄下的pdf目錄下,需提前創建
            print(blogurl,pdfname)
            savepdf(blogurl,pdfname)

#合並pdf
def mergepdf(tmpdir,mergename):  #合並文件存放的路徑,合並後的pdf文件名
    merger = PdfFileMerger()
    listfile = [os.path.join(tmpdir, file) for file in os.listdir(tmpdir)]
    for file in listfile:
        if file.endswith(‘.pdf‘):
            filemsg = PdfFileReader(open(file, ‘rb‘))
            label = file.split(‘\\‘)[-1].replace(".pdf", "")
            merger.append (filemsg, bookmark=label , import_bookmarks=False)
    merger.write(mergename)
    merger.close()

 以上代碼是使用到的所有函數

 執行:

if __name__ == ‘__main__‘:
    do()
    #mergepdf("merge",r"merge\docker.pdf")   當do函數執行完後,將需要合並的pdf放到merge目錄下(提前創建),再將do註釋,再執行mergepdf函數即可

  爬取所有文章生成pdf,將生成的pdf放在pdf目錄下,需提前創建

技術分享圖片

將每部分pdf拷貝到另外目錄merge下

技術分享圖片

最終的pdf:

技術分享圖片

爬取博客並轉成pdf