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

大家好,我是若川。歡迎加我微信?ruochuan12,長期交流學習。今天推薦神器puppeteer,我猜有挺多人不知道。文章不長,看完有空也可以試玩。

我18年也寫過一篇puppeteer爬取生成pdf的文章,時間真快。前端使用puppeteer 爬蟲生成《React.js 小書》PDF并合并

點擊下方卡片關注我、加個星標,或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列

一、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實例。

const path = require('path');
const puppeteer = require('puppeteer');const chromiumPath = path.join(__dirname, '../', 'chromium/chromium/chrome.exe');async function main() {// 啟動chrome瀏覽器const browser = await puppeteer.launch({// 指定該瀏覽器的路徑executablePath: chromiumPath,// 是否為無頭瀏覽器模式,默認為無頭瀏覽器模式headless: false});
}main();

3.2 訪問頁面

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

async function main() {// 啟動chrome瀏覽器// ……// 在一個默認的瀏覽器上下文中被創建一個新頁面const page1 = await browser.newPage();// 空白頁訪問該指定網址await page1.goto('https://51yangsheng.com');// 創建一個匿名的瀏覽器上下文const browserContext = await browser.createIncognitoBrowserContext();// 在該上下文中創建一個新頁面const page2 = await browserContext.newPage();page2.goto('https://www.baidu.com');
}main();

3.3 設備模擬

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

async function main() {// 啟動瀏覽器// 設備模擬:模擬一個iPhone X// user agentawait 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')// 視口(viewport)模擬await page1.setViewport({width: 375,height: 812});// 訪問某頁面
}main();

3.4 獲取DOM節點

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

async function main() {// 啟動chrome瀏覽器const browser = await puppeteer.launch({// 指定該瀏覽器的路徑executablePath: chromiumPath,// 是否為無頭瀏覽器模式,默認為無頭瀏覽器模式headless: false});// 在一個默認的瀏覽器上下文中被創建一個新頁面const page1 = await browser.newPage();// 空白頁訪問該指定網址await page1.goto('https://www.baidu.com');// 等待title節點出現await page1.waitForSelector('title');// 用page自帶的方法獲取節點const titleDomText1 = await page1.$eval('title', el => el.innerText);console.log(titleDomText1);// 百度一下// 用js獲取節點const titleDomText2 = await page1.evaluate(() => {const titleDom = document.querySelector('title');return titleDom.innerText;});console.log(titleDomText2);
}main();

3.5 監聽請求和響應

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

async function main() {// 啟動chrome瀏覽器const browser = await puppeteer.launch({// 指定該瀏覽器的路徑executablePath: chromiumPath,// 是否為無頭瀏覽器模式,默認為無頭瀏覽器模式headless: false});// 在一個默認的瀏覽器上下文中被創建一個新頁面const page1 = await browser.newPage();page1.on('request', request => {if (request.url() === 'https://s.bdstatic.com/common/openjs/amd/eslx.js') {console.log(request.resourceType());console.log(request.method());console.log(request.headers());}});page1.on('response', response => {if (response.url() === 'https://s.bdstatic.com/common/openjs/amd/eslx.js') {console.log(response.status());console.log(response.headers());}})// 空白頁剛問該指定網址await page1.goto('https://www.baidu.com');
}main();

3.6 攔截某一請求

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

async function main() {// 啟動chrome瀏覽器const browser = await puppeteer.launch({// 指定該瀏覽器的路徑executablePath: chromiumPath,// 是否為無頭瀏覽器模式,默認為無頭瀏覽器模式headless: false});// 在一個默認的瀏覽器上下文中被創建一個新頁面const page1 = await browser.newPage();// 攔截請求開啟await page1.setRequestInterception(true);// true開啟,false關閉page1.on('request', request => {if (request.url() === 'https://s.bdstatic.com/common/openjs/amd/eslx.js') {// 終止該請求request.abort();console.log('該請求被終止!!!');}else {// 繼續該請求request.continue();}});// 空白頁訪問該指定網址await page1.goto('https://www.baidu.com');
}main();

3.7 截圖

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

async function main() {// 啟動瀏覽器,訪問頁面的操作// 截屏操作,使用Page.screenshot函數// 截取整個頁面:Page.screenshot函數默認截取整個頁面,加上fullPage參數就是全屏截取await page1.screenshot({path: '../imgs/fullScreen.png',fullPage: true});// 截取屏幕中一個區域的內容await page1.screenshot({path: '../imgs/partScreen.jpg',type: 'jpeg',quality: 80,clip: {x: 0,y: 0,width: 375,height: 300}});browser.close();
}main();

3.8 生成pdf

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

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


最近組建了一個江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你進群。


·················?若川出品?·················

今日話題

一直漲粉很乏力,公眾號不寫原創,平時轉載文章,活下來艱難。想著破局,但平時工作又忙,寫原創文章艱難。只能暫時少接公眾號廣告了,能接廣告變現有時是更新的動力啊,以后的路難走啊。同時深知寫原創重要,但運營也很重要。原創、高質量和每天更新,這三點靠個人只能做到兩點。歡迎分享、收藏、點贊、在看我的公眾號文章~

一個愿景是幫助5年內前端人走向前列的公眾號

可加我個人微信 ruochuan12,長期交流學習

推薦閱讀

我在阿里招前端,我該怎么幫你?(現在還能加我進模擬面試群)

如何拿下阿里巴巴 P6 的前端 Offer

點擊方卡片關注我、加個星標,或者查看源碼等系列文章。
學習源碼整體架構系列、年度總結、JS基礎系列

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275974.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

selenium界面元素定位

一、 Selenium界面元素定位 本文元素定位以das2為例 #導入包 from selenium import webdriver #打開火狐驅動 driverwebdriver.Firefox() #訪問網址 driver.get("http://192.168.3.217:8080/das/seatlogin.jsp ") 進行web頁面自動化測試,對頁面上…

vue.js ui_UI / UX開發:考慮Vue.js

vue.js uiBecause sometimes we have to add logic to our concepts, and Vue makes it a whole lot easier.因為有時我們必須在概念中添加邏輯,而Vue使其變得更加容易。 FULL DISCLOSURE: THIS IS NOT A COMPLETE JAVASCRIPT OR VUE COURSE. There’s no way I co…

Silverlight學習筆記十七BingMap(三)之地圖的地區標識

如果我們需要在Bing Maps中加入一個小圖釘標記&#xff0c;該如何實現了&#xff1f; Bing Maps控件已經為我們提供了這個功能&#xff0c;在Microsoft.Maps.MapControl名稱空間下提供了實現圖釘應用的圖釘層Pushpin類用該類來實現普通標識 在Xaml中添加<map:Pushpin Locati…

win10查看pcie設備_壹拓網科技解密WIN10系統使用向日葵開機棒遠程開機需要設置幾個地方...

向日葵開機棒&#xff0c;是一款非常好用的遠程智能遠程開機硬件&#xff0c;它一頭接網線&#xff0c;另外一頭和被開電腦接在同一個路由器下&#xff0c;不需要和被開電腦或者設備直接連接&#xff0c;當然&#xff0c;被開電腦需要有線聯網&#xff0c;暫時不支持使用無線方…

如何成為公司獨當一面的工程師

大家好&#xff0c;我是若川。歡迎加我微信 ruochuan12&#xff0c;長期交流學習。今天推薦黃老師的這篇文章&#xff0c;你可能看到過了&#xff0c;但值得再看一遍。之前常有小伙伴問&#xff0c;大多情況下我都會分享這篇文章。點擊下方卡片關注我、加個星標&#xff0c;或者…

webpack4.0配置記錄(2)

接上一篇webpack4.0配置記錄(1),繼續記錄學習webpack配置。 定義環境變量 new Webpack.DefinePlugin({//用來定義全局環境變量DEV:JSON.stringify(dev),FLAG:true }), webpack簡單優化 noParsemodule:{noParse:/jquery/,//不去解析設置的包所依賴的關系,如jquery } ignorePlugi…

flex如何做響應式設計_響應式設計-您做錯了!

flex如何做響應式設計Responsive design is not just about the web that automatically adjusts to different screen resolutions and resizeable images, but designs that are crucial for web performance.自適應設計不僅涉及可自動適應不同屏幕分辨率和可調整大小圖像的網…

怎么查看和獲取SQL Server實例名

查看實例名時可用 1、服務—SQL Server(實例名)&#xff0c;默認實例為(MSSQLSERVER) 或在連接企業管理時-查看本地實例 2、通過注冊表 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/InstalledInstance 3、用命令 sqlcmd/osql sqlcmd -L sqlcmd -Lc osql -L 獲…

30萬手表推薦_今年六十歲生日,兒子說要送只30萬的手表,請問有哪些推薦?...

關注腕表部落&#xff0c;盡享腕表生活一位讀者向筆者提出這樣一個問題&#xff1a;今年六十歲生日&#xff0c;兒子說要送只30萬的手表&#xff0c;請問有哪些推薦&#xff1f;首先要恭喜這位老爺子&#xff0c;一來是生日馬上就要到了&#xff0c;二來是還有這么孝順而且慷慨…

關注博客

https://blog.51cto.com/oldboyhttps://blog.51cto.com/yw666轉載于:https://blog.51cto.com/11732716/2348556

寫 Node.js 代碼,從學會調試開始

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。今天推薦這篇調試文章&#xff0c;熟悉我的讀者都知道我寫的源碼文章都多次強調要調試&#xff0c;而且寫了調試方法。點擊下方卡片關注我、加個星標&#xff0c;或者查…

創建用戶友好的表單

Forms are a common way to engage with users and could be a user’s first impression of your product. Since forms aren’t always the user’s favourite thing, it is essential to make filling out forms as easy as possible. Let’s go over a few tips for creati…

細節決定成敗—關于.net的.dll.refresh文件

一直在做.net的項目&#xff0c;c/s的、b/s的&#xff0c;一直沒有注意這個東西。眾所周知&#xff0c;.net的程序生成后會在bin目錄下生成.dll文件&#xff0c;而.dll.refresh這個文件從何而來呢&#xff1f;那天無聊地google了下才知&#xff0c;這個東東是在你的項目中引用第…

環境在c盤_如何給女朋友解釋為什么 Windows 上面的軟件都把自己安裝在 C 盤

本文經授權轉載自漫畫編程(ID&#xff1a;mhcoding)周末&#xff0c;我在家里面看電視&#xff0c;女朋友正在旁邊鼓搗她的電腦&#xff0c;但是好像并不是很順利&#xff0c;于是就有了以下對話。計算機存儲我們使用的計算機中&#xff0c;保存信息的介質有兩類&#xff1a;一…

能讓你縱享絲滑的SSR技術,轉轉這樣實踐

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。今天推薦這篇圖文并茂的SSR技術文章。這是江西前端群里一個小伙伴的文章。群里小伙伴很多都在知名大廠&#xff0c;但他們都很低調。點擊下方卡片關注我、加個星標&…

魅族魅藍mirror簡單打開usb調試模式的步驟

經常我們使用安卓手機鏈接電腦的時候&#xff0c;或者使用的有些應用比如我們企業營銷團隊經常使用的應用引號精靈&#xff0c;以前使用的老版本就需要開啟USB調試模式下使用&#xff0c;現經常新版本不需要了&#xff0c;如果手機沒有開啟USB調試模式&#xff0c;電腦則無辦法…

hp-ux 單用戶 啟動_UX備忘單:搜索與瀏覽

hp-ux 單用戶 啟動重點 (Top highlight)When designing search results and interest sites, you have to keep in mind what ‘mode’ your user is in. Are they in ‘searching mode’ or ‘browsing mode’? This will help you determine how to design your platform to…

細數開源歷史上的九個重大事件

開放源碼&#xff08;開源&#xff09;的精神在于使用者可以使用、復制、散布、研究和改進軟件。這可以追溯到20世紀60年代&#xff0c;至今已有半個世紀了。伯樂在線-職場博客的這篇文章將列舉開源歷史上的九大重要事件。雖然本文不是專門對開源產品&#xff0c;但還是說到了一…

有贊大數據平臺安全建設實踐

一、概述 在大數據平臺建設初期&#xff0c;安全也許并不是被重點關注的一環。大數據平臺的定位主要是服務數據開發人員&#xff0c;提高數據開發效率&#xff0c;提供便捷的開發流程&#xff0c;有效支持數倉建設。大數據平臺的用戶都是公司內部人員。數據本身的安全性已經由公…

請先設置tkk_理光MP2014掃描至文件夾的設置方法

理光旗下的2014系列入門級A3黑白復印機市場保有量較大&#xff0c;該系列機型加裝M16網卡后可以方便的實現掃描至文件夾功能&#xff0c;經常有客戶咨詢該機型的掃描設置方法&#xff0c;下面我就以MP2014D為例來演示一下該機型的SMB掃描設置方法&#xff1a;首先是在電腦上建立…