尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
歡迎點擊右上角關注小編,除了分享技術文章之外還有很多福利,私信學習資料可以領取包括不限於Python實戰演練、PDF電子文檔、面試集錦、學習資料等。
想要把教程變成PDF有三步:
1、先生成空html,爬取每一篇教程放進一個新生成的div,這樣就生成了包含所有教程的html文件(BeautifulSoup)
2、將html轉換成pdf(wkhtmltopdf)
3、由於反爬做的比較好,在爬取的過程中還需要代理ip(免費 or 付費)
開始使用
將一段文檔傳入 BeautifulSoup 的構造方法,就能得到一個文檔的對象, 可以傳入一段字符串或一個文件句柄.
如下所示:
首先,文檔被轉換成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’)
自定義設置
使用代理ip
爬取十幾篇教程之後觸發了這個錯誤:
看來廖大的反爬蟲做的很好,於是只好使用代理ip了,嘗試了免費的西刺免費代理後,最後選擇了付費的 阿布雲 ,感覺響應速度和穩定性還OK。
運行結果
運行過程截圖:
運行過程
生成的效果圖:
效果圖
代碼如下: