天天看點

Python爬取廖雪峰教程存為PDF

首先感謝廖老師給我們大家提供的那麼好的教程,相信大部分童鞋都看過廖老師的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

Python爬取廖雪峰教程存為PDF

将單個html解析成單個pdf檔案

合并成pdf

Python爬取廖雪峰教程存為PDF

最後合并的檔案

内容:

Python爬取廖雪峰教程存為PDF

最後的pdf檔案

最新更新:按照這個代碼目前無法抓取,因為廖老師把網站改成https了。對應代碼要做修改。

而且Requests 請求裡需要加入User-agent模拟浏覽器請求,就可以了。

原文釋出時間為:2018-11-25

本文作者:歐巴

本文來自雲栖社群合作夥伴“

Python愛好者社群

”,了解相關資訊可以關注“

”。