您好,登錄后才能下訂單哦!
這篇文章主要講解了“python基于pyppeteer如何制作PDF文件”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“python基于pyppeteer如何制作PDF文件”吧!
介紹 Pyppeteer 之前,有必要先介紹一下 Puppeteer,Puppeteer 是谷歌官方出的一個通過DevTools協(xié)議控制headless Chrome的Node庫。通過Puppeteer可以直接控制Chrome瀏覽器模擬大部分用戶操作。
所謂Headless Chrome 就是 Chrome 瀏覽器的無界面形態(tài)。
而 Pyppeteer 就是 Puppeteer 的 Python 版本非官方實現(xiàn),它是一位來自于日本的工程師依據(jù) Puppeteer 的一些功能開發(fā)出來的非官方版本
Pyppeteer 采用了 Python 的 async 機(jī)制,需要Python3.5 及以上版本才支持。
但凡是需要通過Chrome瀏覽器手動完成的操作都可以通過 Pyppeteer 自動完成,例如:
生成頁面截圖
生成PDF文件
抓取單頁面應(yīng)用并生成預(yù)先呈現(xiàn)的內(nèi)容
從網(wǎng)站抓取你需要的內(nèi)容
自動表單提交,UI測試,鍵盤輸入等
例如將頁面生成截圖可以直接調(diào)用 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高。
而將網(wǎng)頁轉(zhuǎn)換為PDF的應(yīng)用場景更多,比如將網(wǎng)站博客、專欄,或者公眾號文章批量導(dǎo)出PDF,方便離線閱讀,比如我們最近做的一個醫(yī)療項目需要將用戶填寫的資料支持PDF形式批量導(dǎo)出,就是用的Pyppeteer
導(dǎo)出pdf直接調(diào)用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文件。
安裝 pyppeteer
pip install 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()
第一次運(yùn)行的時候,會自動下載chromium瀏覽器,chromium是chrome的開源版本, 需要幾分鐘才能下載完
[W:pyppeteer.chromium_downloader] start chromium download. Download may take a few minutes. 100%|██████████| 127496521/127496521 [00:20<00: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
執(zhí)行完成后,我們來預(yù)覽下pdf文件
和原文鏈接對比,發(fā)現(xiàn)文章中的圖片丟失了。
通過分析,原來是頁面源代碼中,img 標(biāo)簽沒有src屬性,只有個data-src 屬性,默認(rèn)情況下圖片是無法正常顯示的,圖片之所有能在瀏覽器能正常展示出來,是有個js腳本動態(tài)地修改了dom元素為 <img src='xxxx'>
這個網(wǎng)頁使用的是一種叫懶加載的技術(shù)展示圖片內(nèi)容,所謂懶加載就是圖片不會一次全部下載完,而是當(dāng)前瀏覽到什么位置,就加載該處的圖片,這樣能提高頁面的響應(yīng)速度,同時減輕服務(wù)器性能。
所以,我們也可以通過js代碼模擬真人瀏覽網(wǎng)頁一樣,滾動鼠標(biāo),不停地往下滑動,將圖片動態(tài)加載出來。
最后,完整代碼就變成了這樣:
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 代碼封裝成一個字符串當(dāng)作參數(shù)傳給 page.evaluate 函數(shù), 該代碼就是獲不斷滾動頁面,直到頁面底部為止。這樣整個頁面的圖片就全部加載出來了。
效果看起來還不錯,和原頁面的樣式是一樣的
感謝各位的閱讀,以上就是“python基于pyppeteer如何制作PDF文件”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對python基于pyppeteer如何制作PDF文件這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。