目錄
- Pyppeteer 是什么
- Pyppeteer能做什么
- 截圖
- 導出PDF
- 公眾號鏈接導出PDF示例
Pyppeteer 是什么
介紹 Pyppeteer 之前,有必要先介紹一下 Puppeteer,Puppeteer 是谷歌官方出的一個通過DevTools協議控制headless Chrome的Node庫。通過Puppeteer可以直接控制Chrome瀏覽器模擬大部分用戶操作。
所謂Headless Chrome 就是 Chrome 瀏覽器的無界面形態。
而 Pyppeteer 就是 Puppeteer 的 Python 版本非官方實現,它是一位來自于日本的工程師依據 Puppeteer 的一些功能開發出來的非官方版本
Pyppeteer 采用了 Python 的 async 機制,需要Python3.5 及以上版本才支持。
Pyppeteer能做什么
但凡是需要通過Chrome瀏覽器手動完成的操作都可以通過 Pyppeteer 自動完成,例如:
- 生成頁面截圖
- 生成PDF文件
- 抓取單頁面應用并生成預先呈現的內容
- 從網站抓取你需要的內容
- 自動表單提交,UI測試,鍵盤輸入等
截圖
例如將頁面生成截圖可以直接調用 page.screenshot 方法
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('https://foofish.net')
await page.screenshot({'path': 'example.png'})
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
截圖功能在海報分享等場景用的多,有看過有贊工程師分享的一篇文章,就有用到Puppeteer來做海報分享,性能比Canvas高。
而將網頁轉換為PDF的應用場景更多,比如將網站博客、專欄,或者公眾號文章批量導出PDF,方便離線閱讀,比如我們最近做的一個醫療項目需要將用戶填寫的資料支持PDF形式批量導出,就是用的Pyppeteer
導出PDF
導出pdf直接調用page.pdf方法就可以, 代碼非常簡潔
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('https://foofish.net')
await page.pdf({
"path": "example.pdf", "format": 'A4'})
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
接下來我們以公眾號文章為例,將html頁面制作成一個PDF文件。
公眾號鏈接導出PDF示例
安裝 pyppeteer
任意找一篇公眾號的文章鏈接
url = "https://mp.weixin.qq.com/s/6VBXs19icV0O5hT7cHYwgw"
完成代碼:
browser = await launch(
options={'headless': True,
'args': ['--no-sandbox',
'–disable-gpu',
'–disable-dev-shm-usage',
'–disable-setuid-sandbox',
'–no-first-run',
'–no-zygote',
'–single-process'
]}, )
page = await browser.newPage()
url = "https://mp.weixin.qq.com/s/6VBXs19icV0O5hT7cHYwgw"
await page.goto(url)
file_name = "test.pdf"
await page.pdf({"path": file_name, "format": 'A4'})
await browser.close()
第一次運行的時候,會自動下載chromium瀏覽器,chromium是chrome的開源版本, 需要幾分鐘才能下載完
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
100%|██████████| 127496521/127496521 [00:2000:00, 6268578.80it/s]
[W:pyppeteer.chromium_downloader]
chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: C:\Users\lzjun\AppData\Local\pyppeteer\pyppeteer\local-chromium\575458
執行完成后,我們來預覽下pdf文件

和原文鏈接對比,發現文章中的圖片丟失了。
通過分析,原來是頁面源代碼中,img 標簽沒有src屬性,只有個data-src 屬性,默認情況下圖片是無法正常顯示的,圖片之所有能在瀏覽器能正常展示出來,是有個js腳本動態地修改了dom元素為 img src='xxxx'>

這個網頁使用的是一種叫懶加載的技術展示圖片內容,所謂懶加載就是圖片不會一次全部下載完,而是當前瀏覽到什么位置,就加載該處的圖片,這樣能提高頁面的響應速度,同時減輕服務器性能。
所以,我們也可以通過js代碼模擬真人瀏覽網頁一樣,滾動鼠標,不停地往下滑動,將圖片動態加載出來。
最后,完整代碼就變成了這樣:
async def main():
browser = await launch()
page = await browser.newPage()
url = "https://mp.weixin.qq.com/s/6VBXs19icV0O5hT7cHYwgw"
await page.goto(url)
await page.evaluate('''async () => {
await new
Promise((resolve, reject) => {
var
totalHeight = 0;
var
distance = 100;
var
timer = setInterval(() => {
var
scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if (totalHeight >= scrollHeight){
clearInterval(timer);
resolve();
}
}, 100);
});
}''')
await page.pdf({
"path": "test.pdf", "format": 'A4'})
await browser.close()
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
將js 代碼封裝成一個字符串當作參數傳給 page.evaluate 函數, 該代碼就是獲不斷滾動頁面,直到頁面底部為止。這樣整個頁面的圖片就全部加載出來了。
效果看起來還不錯,和原頁面的樣式是一樣的

在Pyppeteer實踐應用過程中,也遇到不少坑,最后都逐個解決了,這可以單獨寫一篇文章,如果你在使用過程中遇到任何問題歡迎與我交流
以上就是python基于pyppeteer制作PDF文件的詳細內容,更多關于python pyppeteer制作PDF文件的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:- python爬蟲 Pyppeteer使用方法解析
- python爬蟲神器Pyppeteer入門及使用
- python pyppeteer 破解京東滑塊功能的代碼
- 詳解pyppeteer(python版puppeteer)基本使用
- python爬蟲之pyppeteer庫簡單使用