Python爬取Python教程並製作成pdf

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

歡迎點擊右上角關注小編,除了分享技術文章之外還有很多福利,私信學習資料可以領取包括不限於Python實戰演練、PDF電子文檔、面試集錦、學習資料等。

Python爬取Python教程並制作成pdf

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

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

2、將html轉換成pdf(wkhtmltopdf)

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

開始使用

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

如下所示:

Python爬取Python教程並制作成pdf

首先,文檔被轉換成Unicode,並且HTML的實例都被轉換成Unicode編碼.

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

對象的種類

Beautiful Soup 將複雜 HTML 文檔轉換成一個複雜的樹形結構,每個節點都是 Python 對象,所有對象可以歸納為 4 種: Tag , NavigableString , BeautifulSoup , Comment .

Tag:通俗點講就是 HTML 中的一個個標籤,類似 div,p。

NavigableString:獲取標籤內部的文字,如,soup.p.string。

BeautifulSoup:表示一個文檔的全部內容。

Comment:Comment 對象是一個特殊類型的 NavigableString 對象,其輸出的內容不包括註釋符號.

Tag

Tag就是html中的一個標籤,用BeautifulSoup就能解析出來Tag的具體內容,具體的格式為soup.name,其中name是html下的標籤,具體實例如下:

print soup.title輸出title標籤下的內容,包括此標籤,這個將會輸出

print soup.head輸出head標籤下的內容

如果 Tag 對象要獲取的標籤有多個的話,它只會返回所以內容中第一個符合要求的標籤

Tag 屬性

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

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

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

get

get方法用於得到標籤下的屬性值,注意這是一個重要的方法,在許多場合都能用到,比如你要得到<img src=”#”>標籤下的圖像url,那麼就可以用soup.img.get(‘src’),具體解析如下:

# 得到第一個p標籤下的src屬性printsoup.p.get(“class”)

string

得到標籤下的文本內容,只有在此標籤下沒有子標籤,或者只有一個子標籤的情況下才能返回其中的內容,否則返回的是None具體實例如下:

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

get_text()

可以獲得一個標籤中的所有文本內容,包括子孫節點的內容,這是最常用的方法

搜尋文檔樹

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

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

find_all是用於搜尋節點中所有符合過濾條件的節點。

name參數:是Tag的名字,如p,div,title

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

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

CSS 選擇器

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

# 1. 通過 tag 標籤查找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,本地文件,文本內容到PDF的轉換,其最終還是調用wkhtmltopdf命令。

安裝

先安裝wkhtmltopdf,再安裝pdfkit。

https://wkhtmltopdf.org/downloads.html

pdfkit

shell pip3 install pdfkit

轉換url/file/string

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

轉換url或者文件名列表

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

轉換打開文件

withopen(‘file.html’)asf: pdfkit.from_file(f,’out.pdf’)

自定義設置

Python爬取Python教程並制作成pdf

使用代理ip

爬取十幾篇教程之後觸發了這個錯誤:

Python爬取Python教程並制作成pdf

看來廖大的反爬蟲做的很好,於是只好使用代理ip了,嘗試了免費的西刺免費代理後,最後選擇了付費的 阿布雲 ,感覺響應速度和穩定性還OK。

運行結果

運行過程截圖:

Python爬取Python教程並制作成pdf

運行過程

生成的效果圖:

Python爬取Python教程並制作成pdf

效果圖

代碼如下:

Python爬取Python教程並制作成pdf

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!