成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端工程師的一大神器——Puppeteer

開發 開發工具
Puppeteer 是一個 Node 庫,它提供了一個高級 API 來通過 DevTools 協議控制 Chromium 或 Chrome,利用Puppeteer可以獲取頁面DOM節點、網絡請求和響應、程序化操作頁面行為、進行頁面的性能監控和優化、獲取頁面截圖和PDF等,利用該神器就可以操作Chrome瀏覽器玩出各種花樣。

 [[379603]]

本文主要講述一下Google出版并一直在不斷維護的神器puppeteer,通過學習本文你將了解其基本使用和常用功能。

 

一、Puppeteer簡介

Puppeteer 是一個 Node 庫,它提供了一個高級 API 來通過 DevTools 協議控制 Chromium 或 Chrome,利用Puppeteer可以獲取頁面DOM節點、網絡請求和響應、程序化操作頁面行為、進行頁面的性能監控和優化、獲取頁面截圖和PDF等,利用該神器就可以操作Chrome瀏覽器玩出各種花樣。

二、Puppeteer核心組成結構

Puppeteer的結構也反映了瀏覽器的結構,其核心結構如下所示:

 

  1. Browser:這是一個瀏覽器實例,可以擁有瀏覽器上下文,可通過 puppeteer.launch 或 puppeteer.connect 創建一個 Browser 對象。
  2. BrowserContext:該實例定義了一個瀏覽器上下文,可擁有多個頁面,創建瀏覽器實例時默認會創建一個瀏覽器上下文(不能關閉),此外可以利用 browser.createIncognitoBrowserContext()創建一個匿名的瀏覽器上下文(不會與其它瀏覽器上下文共享cookie/cache).
  3. Page:至少包含一個主框架,除了主框架外還有可能存在其它框架,例如iframe。
  4. Frame:頁面中的框架,在每個時間點,頁面通過page.mainFrame()和frame.childFrames()方法暴露當前框架的細節。對于該框架中至少有一個執行上下文
  5. ExecutionCOntext:表示一個JavaScript的執行上下文。
  6. Worker:具有單個執行上下文,便于與 WebWorkers 交互。

三、基本使用和常用功能

該神器整體使用起來比較簡單,下面就開始我們的使用之路。

3.1 啟動Browser

核心函數就是異步調用puppeteer.launch()函數,根據相應的配置參數創建一個Browser實例。

  1. const path = require('path'); 
  2. const puppeteer = require('puppeteer'); 
  3.  
  4. const chromiumPath = path.join(__dirname, '../''chromium/chromium/chrome.exe'); 
  5.  
  6. async function main() { 
  7.     // 啟動chrome瀏覽器 
  8.     const browser = await puppeteer.launch({ 
  9.         // 指定該瀏覽器的路徑 
  10.         executablePath: chromiumPath, 
  11.         // 是否為無頭瀏覽器模式,默認為無頭瀏覽器模式 
  12.         headless: false 
  13.     }); 
  14.  
  15. main(); 

3.2 訪問頁面

訪問頁面首先需要創建一個瀏覽器上下文,然后基于該上下文創建一個新的page,最后指定要訪問的網址。

  1. async function main() { 
  2.     // 啟動chrome瀏覽器 
  3.     // …… 
  4.  
  5.     // 在一個默認的瀏覽器上下文中被創建一個新頁面 
  6.     const page1 = await browser.newPage(); 
  7.  
  8.     // 空白頁訪問該指定網址 
  9.     await page1.goto('https://51yangsheng.com'); 
  10.  
  11.     // 創建一個匿名的瀏覽器上下文 
  12.     const browserContext = await browser.createIncognitoBrowserContext(); 
  13.     // 在該上下文中創建一個新頁面 
  14.     const page2 = await browserContext.newPage(); 
  15.     page2.goto('https://www.baidu.com'); 
  16.  
  17. main(); 

3.3 設備模擬

經常需要不同類型的機型的瀏覽結果,此時就可以采用設備模擬實現,下面模擬一個iPhone X的設備的瀏覽器結果

  1. async function main() { 
  2.     // 啟動瀏覽器 
  3.  
  4.     // 設備模擬:模擬一個iPhone X 
  5.     // user agent 
  6.     await page1.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
  7.     // 視口(viewport)模擬 
  8.     await page1.setViewport({ 
  9.         width: 375, 
  10.         height: 812 
  11.     }); 
  12.      
  13.     // 訪問某頁面 
  14.  
  15. main(); 

3.4 獲取DOM節點

獲取DOM節點有兩種方式,一種方式是直接調用page所帶的原生函數,另一種是通過執行js代碼獲取。

  1. async function main() { 
  2.     // 啟動chrome瀏覽器 
  3.     const browser = await puppeteer.launch({ 
  4.         // 指定該瀏覽器的路徑 
  5.         executablePath: chromiumPath, 
  6.         // 是否為無頭瀏覽器模式,默認為無頭瀏覽器模式 
  7.         headless: false 
  8.     }); 
  9.  
  10.     // 在一個默認的瀏覽器上下文中被創建一個新頁面 
  11.     const page1 = await browser.newPage(); 
  12.  
  13.     // 空白頁訪問該指定網址 
  14.     await page1.goto('https://www.baidu.com'); 
  15.  
  16.     // 等待title節點出現 
  17.     await page1.waitForSelector('title'); 
  18.  
  19.     // 用page自帶的方法獲取節點 
  20.     const titleDomText1 = await page1.$eval('title', el => el.innerText); 
  21.     console.log(titleDomText1);// 百度一下 
  22.  
  23.     // 用js獲取節點 
  24.     const titleDomText2 = await page1.evaluate(() => { 
  25.         const titleDom = document.querySelector('title'); 
  26.         return titleDom.innerText; 
  27.     }); 
  28.     console.log(titleDomText2); 
  29.  
  30. main(); 

3.5 監聽請求和響應

下面就來監聽一下百度中某一js腳本的請求和響應,request事件是監聽請求,response事件是監聽響應。

  1. async function main() { 
  2.     // 啟動chrome瀏覽器 
  3.     const browser = await puppeteer.launch({ 
  4.         // 指定該瀏覽器的路徑 
  5.         executablePath: chromiumPath, 
  6.         // 是否為無頭瀏覽器模式,默認為無頭瀏覽器模式 
  7.         headless: false 
  8.     }); 
  9.  
  10.     // 在一個默認的瀏覽器上下文中被創建一個新頁面 
  11.     const page1 = await browser.newPage(); 
  12.  
  13.     page1.on('request', request => { 
  14.         if (request.url() === 'https://s.bdstatic.com/common/openjs/amd/eslx.js') { 
  15.             console.log(request.resourceType()); 
  16.             console.log(request.method()); 
  17.             console.log(request.headers()); 
  18.         } 
  19.     }); 
  20.  
  21.     page1.on('response', response => { 
  22.         if (response.url() === 'https://s.bdstatic.com/common/openjs/amd/eslx.js') { 
  23.             console.log(response.status()); 
  24.             console.log(response.headers()); 
  25.         } 
  26.     }) 
  27.  
  28.     // 空白頁剛問該指定網址 
  29.     await page1.goto('https://www.baidu.com'); 
  30.  
  31. main(); 

3.6 攔截某一請求

默認情況下request事件只有只讀屬性,不能夠攔截請求,若想攔截該請求則需要通過page.setRequestInterception(value)啟動請求攔截器,然后利用request.abort, request.continue 和 request.respond 方法決定該請求的下一步操作。

  1. async function main() { 
  2.     // 啟動chrome瀏覽器 
  3.     const browser = await puppeteer.launch({ 
  4.         // 指定該瀏覽器的路徑 
  5.         executablePath: chromiumPath, 
  6.         // 是否為無頭瀏覽器模式,默認為無頭瀏覽器模式 
  7.         headless: false 
  8.     }); 
  9.  
  10.     // 在一個默認的瀏覽器上下文中被創建一個新頁面 
  11.     const page1 = await browser.newPage(); 
  12.  
  13.     // 攔截請求開啟 
  14.     await page1.setRequestInterception(true);// true開啟,false關閉 
  15.     page1.on('request', request => { 
  16.         if (request.url() === 'https://s.bdstatic.com/common/openjs/amd/eslx.js') { 
  17.             // 終止該請求 
  18.             request.abort(); 
  19.             console.log('該請求被終止!!!'); 
  20.         } 
  21.         else { 
  22.             // 繼續該請求 
  23.             request.continue(); 
  24.         } 
  25.     }); 
  26.  
  27.     // 空白頁訪問該指定網址 
  28.     await page1.goto('https://www.baidu.com'); 
  29.  
  30. main(); 

3.7 截圖

截圖是一個很有用的功能,通過截取就可以保存一份快照,方便后期問題的排查。(注:在無頭模式下進行截圖,否則截的圖可能有問題)

  1. async function main() { 
  2.     // 啟動瀏覽器,訪問頁面的操作 
  3.      
  4.     // 截屏操作,使用Page.screenshot函數 
  5.     // 截取整個頁面:Page.screenshot函數默認截取整個頁面,加上fullPage參數就是全屏截取 
  6.     await page1.screenshot({ 
  7.         path: '../imgs/fullScreen.png'
  8.         fullPage: true 
  9.     }); 
  10.  
  11.     // 截取屏幕中一個區域的內容 
  12.     await page1.screenshot({ 
  13.         path: '../imgs/partScreen.jpg'
  14.         type: 'jpeg'
  15.         quality: 80, 
  16.         clip: { 
  17.             x: 0, 
  18.             y: 0, 
  19.             width: 375, 
  20.             height: 300 
  21.         } 
  22.     }); 
  23.  
  24.     browser.close(); 
  25.  
  26. main(); 

3.8 生成pdf

除了利用截圖保留快照外,還可以使用pdf保留快照。

  1. async function main() { 
  2.     // 啟動瀏覽器,訪問頁面的操作 
  3.      
  4.     // 根據網頁內容生成pdf文件,使用Page.pdf——注意:必須在無頭模式下才可以調用 
  5.     await page1.pdf({ 
  6.         path: '../pdf/baidu.pdf' 
  7.     }); 
  8.  
  9.     browser.close(); 
  10.  
  11. main(); 

本文轉載自微信公眾號「執鳶者」,可以通過以下二維碼關注。轉載本文請聯系執鳶者公眾號。

 

責任編輯:武曉燕 來源: 執鳶者
相關推薦

2021-09-13 09:28:10

PuppeteerNode 庫DevTools 協議

2021-05-27 12:10:42

前端puppeteer代碼

2023-12-06 07:36:27

前端開發

2015-08-26 14:18:25

Web前端工程師價值

2015-09-30 10:25:03

前端工程師

2019-07-29 16:05:48

前端DockerNode.js

2018-11-15 15:55:44

前端工程師Web云計算

2010-01-13 10:53:51

Web前端工程師定位

2014-12-23 14:55:23

前端

2015-08-17 10:32:06

前端工程師優秀

2015-08-24 09:02:49

前端工程師

2016-01-28 11:18:09

卓越前端工程師

2011-04-15 09:14:03

抄襲巨頭IT

2016-09-22 16:14:45

前端設計Photoshop

2010-01-13 10:10:07

Web前端工程師

2015-03-16 16:01:40

Web前端前端工程師Web

2020-09-29 07:38:22

Python裝飾器框架

2011-05-25 16:59:20

前端工程師

2019-06-24 09:40:17

前端前端工程師開發工具

2019-12-18 10:30:24

前端開發技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久成人精品免费播放动漫 | 日韩在线一区二区三区 | 欧美亚洲网站 | 81精品国产乱码久久久久久 | 91成人免费 | 在线观看中文字幕av | 91麻豆精品国产91久久久久久久久 | 国产高清在线视频 | 久久影音先锋 | 国产精品影视 | 欧美国产免费 | a级在线免费视频 | 91精品在线播放 | 精品久久久久久亚洲精品 | 国产精品一区二区视频 | 在线国产一区二区 | 精品国产91 | 欧美精品一区二区三区在线 | 一区视频在线播放 | 亚洲欧美激情国产综合久久久 | 国际精品久久 | 欧美国产日韩在线观看 | 美女视频黄色的 | 日韩视频精品在线 | 国产精品视频导航 | 久久噜噜噜精品国产亚洲综合 | www.日本在线播放 | 视频1区2区 | 日本亚洲欧美 | 欧美精品一区二区三区在线播放 | 日韩欧美在线视频一区 | 日韩精品av一区二区三区 | 天天操天天插天天干 | 成人欧美一区二区三区在线播放 | 国产日韩欧美在线 | 国产精品成av人在线视午夜片 | 欧美一区二区三区四区视频 | 一级毛片免费视频观看 | 欧美精品一区二区在线观看 | 91国在线高清视频 | 国产自产c区 |