首先感謝廖老師給我們大家提供的那麼好的教程,相信大部分童鞋都看過廖老師的python教程,我也是從這個教程入了門。後來又開始接着學JavaScript,不過每次都要用浏覽器上網浏覽太麻煩,是以就用爬蟲爬下來儲存為PDF格式。不過缺點就是沒有目錄廢話不多說上代碼。
# coding=utf-8
import os
import time
import re
import requests
import pdfkit
from bs4 import BeautifulSoup
from PyPDF2 import PdfFileMerger,PdfFileReader, PdfFileWriter
import sys
#test12
html_template = """
<!DOCTYPE html>
<body>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
{content}
path_wk = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' #安裝位置
</body>
</html>
"""
config = pdfkit.configuration(wkhtmltopdf = path_wk)
def parse_url_to_html(url, name):
#----------------------------------------------------------------------
"""
解析URL,傳回HTML内容
:param url:解析的url
:param name: 儲存的html檔案名
body = soup.find_all(class_="x-wiki-content")[0]
:return: html
"""
try:
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
# 正文
# 标題
center_tag.insert(1, title_tag)
title = soup.find('h4').get_text()
# 标題加入到正文的最前面,居中顯示
center_tag = soup.new_tag("center")
title_tag = soup.new_tag('h1')
title_tag.string = title
if not m.group(3).startswith("http"):
body.insert(1, center_tag)
html = str(body)
# body中的img标簽的src相對路徑的改成絕對路徑
pattern = "(<img .*?src=\")(.*?)(\")"
def func(m):
html = html_template.format(content=html)
rtn = m.group(1) + "http://www.liaoxuefeng.com" + m.group(2) + m.group(3)
return rtn
else:
return m.group(1)+m.group(2)+m.group(3)
html = re.compile(pattern).sub(func, html)
def get_url_list():
html = html.encode("utf-8")
with open(name, 'wb') as f:
f.write(html)
return name
except Exception as e:
print ("解析錯誤!")
#----------------------------------------------------------------------
"""
menu_tag = soup.find_all(class_="uk-nav uk-nav-side")[1]
擷取所有URL目錄清單
:return:
"""
response = requests.get("http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000")
soup = BeautifulSoup(response.content, "html.parser")
urls = []
def save_pdf(htmls, file_name):
for li in menu_tag.find_all("div"):
url = "http://www.liaoxuefeng.com" + li.a.get('href')
urls.append(url)
return urls
#----------------------------------------------------------------------
"""
把所有html檔案儲存到pdf檔案
'custom-header': [
:param htmls: html檔案清單
:param file_name: pdf檔案名
:return:
"""
options = {
'page-size': 'Letter',
'margin-top': '0.75in',
'margin-right': '0.75in',
'margin-bottom': '0.75in',
'margin-left': '0.75in',
'encoding': "UTF-8",
#----------------------------------------------------------------------
('Accept-Encoding', 'gzip')
],
'cookie': [
('cookie-name1', 'cookie-value1'),
('cookie-name2', 'cookie-value2'),
],
'outline-depth': 10,
}
pdfkit.from_file(htmls, file_name, options=options,configuration=config)
def main():
start = time.time()
pdfs.append(file_name+str(i)+'.pdf')
file_name = u"liaoxuefeng_Python3_tutorial"
urls = get_url_list()
for index, url in enumerate(urls):
parse_url_to_html(url, str(index) + ".html")
htmls =[]
pdfs =[]
print(len(urls))
for i in range(len(urls)):
htmls.append(str(i)+'.html')
save_pdf(str(i)+'.html', file_name+str(i)+'.pdf')
output = open(u"廖雪峰Python_all.pdf", "wb")
print (u"轉換完成第"+str(i)+'個html')
print(pdfs)
pdf_output = PdfFileWriter()
for pdf in pdfs:
pdf_input = PdfFileReader(open(pdf,'rb'))
page_count = pdf_input.getNumPages()
print(page_count)
for i in range(page_count):
pdf_output.addPage(pdf_input.getPage(i))
pdf_output.write(output)
print (u"輸出PDF成功!")
if not os.path.exists(dir_name):
for html in htmls:
os.remove(html)
print (u"删除臨時檔案"+html)
for pdf in pdfs:
os.remove(pdf)
print (u"删除臨時檔案"+pdf)
total_time = time.time() - start
print(u"總共耗時:%f 秒" % total_time)
#----------------------------------------------------------------------
def changeDir(dir_name):
"""
目錄切換
"""
os.mkdir(dir_name)
main()
os.chdir(dir_name)
#----------------------------------------------------------------------
if __name__ == '__main__':
#存放檔案的路徑
dir_name = 'c:\\12'
changeDir(dir_name)
代碼很簡單,就是擷取所有部落格左側導航欄對應的所有URL,然後将每個url解析出來儲存成html,再将每個html儲存成單個pdf檔案,最後合并pdf檔案。需要注意的是windwos 下需要安裝wkhtmltopdf.exe 這個軟體,并在python代碼裡指明這個程式的路徑。不然合并時會報錯。
下載下傳html儲存成pdf

将單個html解析成單個pdf檔案
合并成pdf
最後合并的檔案
内容:
最後的pdf檔案
最新更新:按照這個代碼目前無法抓取,因為廖老師把網站改成https了。對應代碼要做修改。
而且Requests 請求裡需要加入User-agent模拟浏覽器請求,就可以了。
原文釋出時間為:2018-11-25
本文作者:歐巴
本文來自雲栖社群合作夥伴“
Python愛好者社群”,了解相關資訊可以關注“
”。