爬取博客並轉成pdf
阿新 • • 發佈:2019-03-26
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