Node使用Puppeteer監(jiān)聽并打印網(wǎng)頁的接口請求
在現(xiàn)代 Web 開發(fā)中,前端頁面與后端服務之間的交互頻繁依賴于各種接口請求。無論是調(diào)試前端代碼、分析網(wǎng)絡性能,還是進行安全測試,能夠監(jiān)聽并打印網(wǎng)頁的接口請求都是非常有用的。而 Puppeteer,這個由谷歌開發(fā)的 Node 庫,為我們提供了一個強大的工具來實現(xiàn)這一目標。
一、Puppeteer 簡介
Puppeteer 是一個 Node 庫,它提供了高級的 API 來通過 DevTools 協(xié)議控制 Chrome 或 Chromium。它默認以無頭模式運行,但也可以配置為運行“有頭”模式。借助 Puppeteer,我們可以生成頁面截圖和 PDF、爬取 SPA(單頁應用)并生成預渲染內(nèi)容、自動化表單提交、UI 測試、鍵盤輸入等。在我們的場景中,它還可以幫助我們監(jiān)聽并打印網(wǎng)頁的接口請求。
二、準備工作
在開始之前,你需要確保你的開發(fā)環(huán)境中已經(jīng)安裝了 Node.js 和 npm(Node 包管理器)。然后,你可以通過 npm 安裝 Puppeteer。
npm install puppeteer
安裝完成后,你就可以開始編寫代碼來監(jiān)聽并打印網(wǎng)頁的接口請求了。
三、監(jiān)聽并打印接口請求的代碼實現(xiàn)
以下是一個簡單的示例代碼,展示如何使用 Puppeteer 監(jiān)聽并打印網(wǎng)頁的接口請求。
const puppeteer = require('puppeteer'); (async () => { // 啟動瀏覽器 const browser = await puppeteer.launch({ headless: false, // 設置為 false 方便觀察瀏覽器行為 slowMo: 50, // 放慢執(zhí)行速度,方便觀察 }); // 打開新頁面 const page = await browser.newPage(); // 監(jiān)聽網(wǎng)絡請求 page.on('request', request => { if (request.method() === 'GET') { console.log(`GET 請求: ${request.url()}`); } else if (request.method() === 'POST') { console.log(`POST 請求: ${request.url()}`); console.log(`POST 請求數(shù)據(jù): ${request.postData()}`); } request.continue(); // 繼續(xù)處理請求 }); // 打開目標網(wǎng)頁 await page.goto('https://example.com'); // 等待一段時間,觀察接口請求 await page.waitForTimeout(5000); // 關閉瀏覽器 await browser.close(); })();
代碼解析
啟動瀏覽器:通過 puppeteer.launch 方法啟動瀏覽器。你可以設置 headless 參數(shù)為 false,以便在調(diào)試時能夠看到瀏覽器的界面。
打開新頁面:使用 browser.newPage 方法打開一個新頁面。
監(jiān)聽網(wǎng)絡請求:通過 page.on('request', ...) 方法監(jiān)聽頁面的網(wǎng)絡請求。當頁面發(fā)出請求時,會觸發(fā)這個事件。你可以通過 request.method() 獲取請求方法(如 GET、POST),通過 request.url() 獲取請求的 URL,對于 POST 請求,還可以通過 request.postData() 獲取請求的正文數(shù)據(jù)。
繼續(xù)處理請求:在監(jiān)聽到請求后,調(diào)用 request.continue() 方法繼續(xù)處理請求。如果不調(diào)用這個方法,請求會被攔截,頁面將無法正常加載。
打開目標網(wǎng)頁:使用 page.goto 方法打開目標網(wǎng)頁。你可以將 'https://example.com' 替換為你想要監(jiān)聽接口請求的網(wǎng)頁地址。
等待一段時間:通過 page.waitForTimeout 方法等待一段時間,以便觀察頁面加載過程中發(fā)出的接口請求。
關閉瀏覽器:最后,通過 browser.close 方法關閉瀏覽器。
基于上面的代碼,再完善一個,于json格式輸出
async function printPageRequests(url = 'https://www.baidu.com', action = '', format = 'txt') { console.log(TAG, `printPageRequests start, url:${url}, action:${action}', format:${format}`) // const browser = await puppeteer.launch({ headless: false }); const browser = await puppeteer.launch({headless: true}); const page = await browser.newPage(); page.on('request', (request) => { // const resourceType = request.resourceType(); // if (resourceType === 'fetch') { // console.log(`Fetch Request: ${request.method()} ${request.url()}`); // } request.continue(); }); page.on('response', async (response) => { const request = response.request(); const resourceType = request.resourceType(); if (resourceType === 'fetch' || resourceType === 'xhr') { const requestInfo = `Fetch Response: ${request.method()} ${request.url()} - Status: ${response.status()} ` if (action === 'printBody') { if (format === 'txt') { try { // 嘗試獲取響應內(nèi)容 const responseBody = await response.text(); console.log(`${requestInfo} txt Body: ${responseBody}`); } catch (error) { console.error(`${requestInfo}, Failed to get response body: ${error}`); } } else if (format === 'json') { try { // 嘗試獲取響應內(nèi)容 const responseBody = await response.json(); console.log(`${requestInfo}, Response json Body: ${JSON.stringify(responseBody, null, 2)}`); } catch (error) { console.error(`Failed to get response body: ${error}`); } } } } }); await page.setRequestInterception(true); try { console.log(`Navigating to ${url}`); await page.goto(url, {timeout: 60000}); console.log(`Navigation completed`); } catch (error) { if (error.name === 'TimeoutError') { console.error(`Navigation timeout exceeded for ${url}`); } else { throw error; } } await browser.close(); console.log(TAG, 'printPageRequests end') }
看一個效果,txt格式
再看一個效果,json格式
PS:上面是我把代碼放到了自己的一個工具集中,并使用了commander管理來不斷的豐富工具模塊
四、實際應用場景
1.前端調(diào)試
在前端開發(fā)過程中,開發(fā)者常常需要了解頁面是如何與后端服務交互的。通過使用 Puppeteer 監(jiān)聽接口請求,開發(fā)者可以清晰地看到每個請求的 URL、請求方法、請求數(shù)據(jù)等信息,從而快速定位問題,提高調(diào)試效率。
2.網(wǎng)絡性能分析
通過監(jiān)聽并打印接口請求,我們可以分析每個請求的響應時間、請求大小等信息,從而評估網(wǎng)頁的網(wǎng)絡性能。這對于優(yōu)化網(wǎng)頁加載速度、提升用戶體驗非常有幫助。
3.安全測試
在安全測試中,監(jiān)聽接口請求可以幫助我們發(fā)現(xiàn)潛在的安全問題。例如,通過檢查請求數(shù)據(jù)是否包含敏感信息、請求的 URL 是否符合預期等,我們可以及時發(fā)現(xiàn)并修復安全漏洞。
五、注意事項
請求攔截的限制:雖然 Puppeteer 提供了強大的請求攔截功能,但它也有一些限制。例如,它無法攔截瀏覽器內(nèi)部的一些請求,如字體加載請求等。此外,對于一些復雜的請求,如帶有 WebSocket 的請求,監(jiān)聽和處理可能會更加復雜。
性能影響:監(jiān)聽并處理大量的請求可能會對瀏覽器的性能產(chǎn)生一定影響。在實際使用中,需要注意合理控制監(jiān)聽的范圍和頻率,避免對頁面的正常加載和運行造成過大的干擾。
隱私和安全問題:在監(jiān)聽接口請求時,可能會涉及到一些敏感信息。因此,在使用 Puppeteer 監(jiān)聽接口請求時,需要注意保護用戶的隱私和數(shù)據(jù)安全,避免泄露敏感信息。
六、總結(jié)
通過使用 Puppeteer,我們可以輕松地監(jiān)聽并打印網(wǎng)頁的接口請求,這為前端調(diào)試、網(wǎng)絡性能分析和安全測試等提供了極大的便利。在實際開發(fā)和測試中,合理利用 Puppeteer 的這一功能,可以幫助我們更好地理解和優(yōu)化網(wǎng)頁的交互行為,提升開發(fā)效率和產(chǎn)品質(zhì)量。
到此這篇關于Node使用Puppeteer監(jiān)聽并打印網(wǎng)頁的接口請求的文章就介紹到這了,更多相關Puppeteer監(jiān)聽并打印網(wǎng)頁接口請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
node.js與C語言 實現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小
這篇文章主要介紹了node.js與C語言 實現(xiàn)遍歷文件夾下最大的文件,并輸出路徑,大小的相關資料,需要的朋友可以參考下2017-01-01Node.js 中 cookie-parser 依賴安裝使用詳解
文章介紹了如何在Node.js中使用cookie-parser中間件來解析、設置、簽名和清除HTTP請求中的Cookie,感興趣的朋友一起看看吧2025-02-02node使用querystring內(nèi)置模塊解決分頁返回數(shù)據(jù)太多導致json.parse()解析報錯問題
這篇文章主要介紹了node使用querystring內(nèi)置模塊解決分頁返回數(shù)據(jù)太多導致json.parse()解析報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09