Python爬取Python教程并制作成pdf

想要把教程變成PDF有三步:

1、先生成空html,爬取每一篇教程放進一個新生成的div,這樣就生成了包含所有教程的html文件(BeautifulSoup)

2、將html轉(zhuǎn)換成pdf(wkhtmltopdf)

3、由于反爬做的比較好,在爬取的過程中還需要代理ip(免費 or 付費)

推薦下我自己創(chuàng)建的Python學(xué)習(xí)交流群960410445,這是Python學(xué)習(xí)交流的地方,不管你是小白還是大牛,小編都歡迎,不定期分享干貨,包括我整理的一份適合零基礎(chǔ)學(xué)習(xí)Python的資料和入門教程。

開始使用

將一段文檔傳入?BeautifulSoup?的構(gòu)造方法,就能得到一個文檔的對象, 可以傳入一段字符串或一個文件句柄.

如下所示:

首先,文檔被轉(zhuǎn)換成Unicode,并且HTML的實例都被轉(zhuǎn)換成Unicode編碼.

然后,Beautiful Soup選擇最合適的解析器來解析這段文檔,如果手動指定解析器那么Beautiful Soup會選擇指定的解析器來解析文檔.

對象的種類

Beautiful Soup?將復(fù)雜?HTML?文檔轉(zhuǎn)換成一個復(fù)雜的樹形結(jié)構(gòu),每個節(jié)點都是?Python?對象,所有對象可以歸納為 4 種:?Tag , NavigableString , BeautifulSoup , Comment .

Tag:通俗點講就是?HTML?中的一個個標(biāo)簽,類似?div,p。

NavigableString:獲取標(biāo)簽內(nèi)部的文字,如,soup.p.string。

BeautifulSoup:表示一個文檔的全部內(nèi)容。

Comment:Comment?對象是一個特殊類型的?NavigableString?對象,其輸出的內(nèi)容不包括注釋符號.

Tag

Tag就是html中的一個標(biāo)簽,用BeautifulSoup就能解析出來Tag的具體內(nèi)容,具體的格式為soup.name,其中name是html下的標(biāo)簽,具體實例如下:

print soup.title輸出title標(biāo)簽下的內(nèi)容,包括此標(biāo)簽,這個將會輸出

The Dormouse's story

print soup.head輸出head標(biāo)簽下的內(nèi)容

The Dormouse's story

如果 Tag 對象要獲取的標(biāo)簽有多個的話,它只會返回所以內(nèi)容中第一個符合要求的標(biāo)簽。

Tag 屬性

每個?Tag?有兩個重要的屬性?name?和?attrs:

name:對于Tag,它的name就是其本身,如soup.p.name就是p

attrs是一個字典類型的,對應(yīng)的是屬性-值,如print soup.p.attrs,輸出的就是{'class': ['title'], 'name': 'dromouse'},當(dāng)然你也可以得到具體的值,如print soup.p.attrs['class'],輸出的就是[title]是一個列表的類型,因為一個屬性可能對應(yīng)多個值,當(dāng)然你也可以通過get方法得到屬性的,如:print soup.p.get('class')。還可以直接使用print soup.p['class']

get

get方法用于得到標(biāo)簽下的屬性值,注意這是一個重要的方法,在許多場合都能用到,比如你要得到<img src="#">標(biāo)簽下的圖像url,那么就可以用soup.img.get('src'),具體解析如下:

# 得到第一個p標(biāo)簽下的src屬性printsoup.p.get("class")

string

得到標(biāo)簽下的文本內(nèi)容,只有在此標(biāo)簽下沒有子標(biāo)簽,或者只有一個子標(biāo)簽的情況下才能返回其中的內(nèi)容,否則返回的是None具體實例如下:

# 在上面的一段文本中p標(biāo)簽沒有子標(biāo)簽,因此能夠正確返回文本的內(nèi)容printsoup.p.string# 這里得到的就是None,因為這里的html中有很多的子標(biāo)簽printsoup.html.string

get_text()

可以獲得一個標(biāo)簽中的所有文本內(nèi)容,包括子孫節(jié)點的內(nèi)容,這是最常用的方法。

搜索文檔樹

BeautifulSoup 主要用來遍歷子節(jié)點及子節(jié)點的屬性,通過Tag取屬性的方式只能獲得當(dāng)前文檔中的第一個 tag,例如,soup.p。如果想要得到所有的<p>?標(biāo)簽,或是通過名字得到比一個 tag 更多的內(nèi)容的時候,就需要用到 find_all()

find_all(name, attrs, recursive, text, **kwargs )

find_all是用于搜索節(jié)點中所有符合過濾條件的節(jié)點。

name參數(shù):是Tag的名字,如p,div,title

# 1. 節(jié)點名print(soup.find_all('p'))# 2. 正則表達式print(soup.find_all(re.compile('^p')))# 3. 列表? print(soup.find_all(['p','a']))

另外 attrs 參數(shù)可以也作為過濾條件來獲取內(nèi)容,而 limit 參數(shù)是限制返回的條數(shù)。

CSS 選擇器

以 CSS 語法為匹配標(biāo)準(zhǔn)找到 Tag。同樣也是使用到一個函數(shù),該函數(shù)為select(),返回類型是 list。它的具體用法如下:

# 1. 通過 tag 標(biāo)簽查找print(soup.select(head))# 2. 通過 id 查找print(soup.select('#link1'))# 3. 通過 class 查找print(soup.select('.sister'))# 4. 通過屬性查找print(soup.select('p[name=dromouse]'))# 5. 組合查找print(soup.select("body p"))

wkhtmltopdf

wkhtmltopdf主要用于HTML生成PDF。

pdfkit是基于wkhtmltopdf的python封裝,支持URL,本地文件,文本內(nèi)容到PDF的轉(zhuǎn)換,其最終還是調(diào)用wkhtmltopdf命令。

安裝

先安裝wkhtmltopdf,再安裝pdfkit。

https://wkhtmltopdf.org/downloads.html

pdfkit

shell pip3 install pdfkit

轉(zhuǎn)換url/file/string

importpdfkitpdfkit.from_url('http://google.com','out.pdf')pdfkit.from_file('index.html','out.pdf')pdfkit.from_string('Hello!','out.pdf')

轉(zhuǎn)換url或者文件名列表

pdfkit.from_url(['google.com','baidu.com'],'out.pdf')pdfkit.from_file(['file1.html','file2.html'],'out.pdf')

轉(zhuǎn)換打開文件

withopen('file.html')asf:? ? pdfkit.from_file(f,'out.pdf')

自定義設(shè)置

使用代理ip

爬取十幾篇教程之后觸發(fā)了這個錯誤:

看來廖大的反爬蟲做的很好,于是只好使用代理ip了,嘗試了免費的西刺免費代理后,最后選擇了付費的?阿布云?,感覺響應(yīng)速度和穩(wěn)定性還OK。

運行結(jié)果

運行過程截圖:

運行過程

生成的效果圖:

效果圖

代碼如下:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容