基于Node+HeadlessBrowser的瀏覽器自動化方案

基于Node+HeadlessBrowser的瀏覽器自動化方案

什么是無頭瀏覽器(Headless Browser)?

無頭瀏覽器,就像是一個沒有用戶界面的瀏覽器程序。你可以想象它就是一個“隱形”的瀏覽器,只不過它沒有圖形界面,但能做我們用普通瀏覽器所能做的大部分事情,比如打開網頁、執行 JavaScript、進行頁面互動等。無頭瀏覽器最常用的場景就是在自動化測試、網頁抓取、服務器上執行任務等不需要用戶界面的場合。

使用無頭瀏覽器,你無需打開真正的瀏覽器窗口就可以讓程序去瀏覽網頁、錄制操作、生成截圖等等,特別適合那些需要在沒有人手動操作的情況下處理網頁內容的任務。

特性PlaywrightPuppeteerSeleniumPhantomJS
支持瀏覽器Chromium, Firefox, WebKitChromium所有主流瀏覽器已內置 WebKit
平臺支持Windows, Mac, LinuxWindows, Mac, LinuxWindows, Mac, LinuxWindows, Mac, Linux
多瀏覽器支持
API 現代性現代且易用現代且易用較復雜,學習曲線陡峭較簡單
開發活躍度活躍且增長快活躍非常活躍已停止維護
適用場景自動化測試、爬蟲、跨瀏覽器兼容性測試瀏覽器自動化測試和爬蟲復雜測試流程靜態網頁抓取
啟動速度較慢
資源占用
文檔和社區支持良好優秀廣泛限制, 文檔停滯
  • Playwright:適合需要多瀏覽器支持的項目,API 現代且跨平臺,對新功能的支持很快。
  • Puppeteer:專注于 Chromium,適合簡單的自動化測試和爬蟲任務。
  • Selenium:對于復雜的跨瀏覽器測試任務是很好的選擇,但需要較多的配置和學習。
  • PhantomJS:雖然輕量且快速,但由于停止維護,而其使用逐漸減少,不建議用于新項目。

一、依賴安裝

以下用Playwright為例,實現幾個模擬瀏覽器操作的案例

// 安裝無頭瀏覽器依賴
npm i playwright --save
// 安裝瀏覽器內核
npx playwright install

二、具體自動化操作

ScreenHotUtils.js提供了三個案例方法

  • 對目標網頁進行截取
  • 獲取目標頁面的大標題
  • 獲取目標頁面Window對象的任意屬性
// 注入chromium內核
const { chromium } = require('playwright');/*** 異步暫停方法* @param {number} delay - 時長(以毫秒為單位)* @returns {Promise<void>}*/
const sleep = delay => new Promise(resolve => setTimeout(resolve, delay));/*** 網頁截屏方法* @param {string} webPageUrl - 目標網頁地址* @param {number} loadDelay - 網頁加載延時(以毫秒為單位)* @param {number} width - 瀏覽器寬度* @param {number} height - 瀏覽器高度* @param {boolean} fullPage - 是否進行全屏長截圖* @returns {Promise<Buffer>} - 截圖圖像的Buffer*/
const captureWebPageScreenshot = async (webPageUrl,loadDelay = 1000,width = 1980,height = 1024,fullPage = false
) => {// 創建瀏覽器對象const browser = await chromium.launch();// 創建一個新的頁面const page = await browser.newPage({viewport: {width,height,},});// 跳轉到目標頁await page.goto(webPageUrl);// 等待頁面加載完成await page.waitForLoadState('load');// 頁面加載延時await sleep(loadDelay);// 截圖,并獲取一個Bufferconst screenFileBuffer = await page.screenshot({ fullPage });// 關閉瀏覽器await browser.close();return screenFileBuffer;
};/*** 獲取網頁標題* @param {string} webPageUrl - 目標網頁地址* @param {number} loadDelay - 網頁加載延時(以毫秒為單位)* @returns {Promise<string>} - 網頁標題*/
const getWebPageTitle = async (webPageUrl, loadDelay = 1000) => {// 創建瀏覽器對象const browser = await chromium.launch();const page = await browser.newPage();await page.goto(webPageUrl);await page.waitForLoadState('load');await sleep(loadDelay);// 獲取頁面標題const title = await page.title();await browser.close();return title;
};/*** 獲取Window屬性* @param {string} webPageUrl - 目標網頁地址* @param {string[]} propertyNames - 要獲取的屬性名稱列表* @returns {Promise<string>} - 獲取的屬性值*/
const getWindowProperty = async (webPageUrl, propertyNames) => {const browser = await chromium.launch();const page = await browser.newPage();await page.goto(webPageUrl);await page.waitForLoadState('load');// 使用 evaluate 在頁面上下文中運行腳本const propertyValue = await page.evaluate(propertyNames => {const result = propertyNames.reduce((pre, prop) => {pre = pre[prop];return pre;}, window);return result;}, propertyNames);await browser.close();return propertyValue;
};module.exports = {getWebPageTitle,getWindowProperty,captureWebPageScreenshot,
};

三、執行測試

const {getWebPageTitle,captureWebPageScreenshot,getWindowProperty,
} = require('./ScreenHotUtils');
const fs = require('fs');
const path = require('path');(async () => {const webPageUrl = `http://www.baidu.com`;//   執行截圖動作const fileBuffer = await captureWebPageScreenshot(webPageUrl);// 寫入本地 | 上傳OSS | 其他fs.writeFileSync(path.resolve(__dirname, './screenShot.png'), fileBuffer);//   獲取頁面標題const pageTitle = await getWebPageTitle(webPageUrl);console.log('PageTitle', pageTitle); // 百度一下 你就知道// 獲取頁面cookieconst cookie = await getWindowProperty(webPageUrl, ['document', 'cookie']);console.log('Cookie:', cookie); // cookie......
})();

效果:
在這里插入圖片描述
就這樣,我們可以輕松獲得一個頁面截圖,通過代碼就能在不打開瀏覽器的情況下獲取到網頁的圖像,來實現一些自動化巡檢&截圖工具。

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

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

相關文章

AEB法規升級后的市場預測與分析:技術迭代、政策驅動與產業變革

文章目錄 一、政策驅動&#xff1a;全球法規升級倒逼市場擴容二、技術迭代&#xff1a;從“基礎防護”到“場景全覆蓋”三、市場格局&#xff1a;競爭加劇與生態重構四、挑戰與未來展望五、投資建議結語 近年來&#xff0c;全球汽車安全法規的加速升級正深刻重塑AEB&#xff08…

【Docker項目實戰】使用Docker部署Caddy+vaultwarden密碼管理工具(詳細教程)

【Docker項目實戰】使用Docker部署vaultwarden密碼管理工具 前言一、vaultwarden介紹1.1 vaultwarden簡介1.2 主要特點二、本次實踐規劃2.1 本地環境規劃2.2 本次實踐介紹三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本四、拉取鏡像五、…

第十六屆藍橋杯大賽軟件賽省賽第二場

第十六屆藍橋杯大賽軟件賽省賽第二場 大家好。最近參加了第十六屆藍橋杯大賽軟件賽省賽第二場 Python 大學 B 組的比賽&#xff0c;現在來和大家分享一下我的解題思路和代碼實現。以下內容是我自己寫的&#xff0c;可能對也可能錯&#xff0c;歡迎大家交流討論。 試題 A&…

硬件須知的基本問題2

目錄 1、典型電路 1. DC5V 轉 DC3.3V 電路 2. 通信電路 2、STM32F103RCT6 最小系統如何設計搭建電路 1. 電源電路 2. 復位電路 3. 時鐘電路 4. 下載電路 5. 單片機連接連接 3、請列舉你所知道的二極管型號&#xff1f; 1. 整流二極管 2. 小信號二極管 3. 肖特基二極管 4. 超…

力扣HOT100——102.二叉樹層序遍歷

給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;[[3],[9,20],[15,7]] /*** Definition for a bi…

CSS 定位學習筆記

一、定位概述 CSS 定位是控制 HTML 元素在頁面中位置的核心技術&#xff0c;允許元素脫離正常文檔流&#xff0c;實現復雜布局效果。 二、定位類型對比 定位類型屬性值參考基準是否脫離文檔流常用場景靜態定位static無否默認布局相對定位relative自身原位置否元素微調絕對定…

Threejs中頂視圖截圖

Threejs中頂視圖截圖 一般項目中的每個模型&#xff0c;都需要有一張對應的圖片&#xff0c;一般是頂視圖&#xff0c;在對應的2D場景場景中展示。以下分享一個實現方式&#xff0c;先將清空模型材質的紋理&#xff0c;把顏色設置為白色&#xff0c;使用正交相機截取頂視圖&am…

深度探索:DeepSeek賦能WPS圖表繪制

一、研究背景 在當今數字化信息爆炸的時代&#xff0c;數據處理與可視化分析已成為眾多領域研究和決策的關鍵環節。隨著數據量的急劇增長和數據維度的不斷豐富&#xff0c;傳統的數據可視化工具在應對復雜數據時逐漸顯露出局限性。Excel作為廣泛應用的電子表格軟件&#xff0c;…

第11章 面向分類任務的表示模型微調

??????第1章 對大型語言模型的介紹第2章 分詞和嵌入第3章 解析大型語言模型的內部機制第4章 文本分類第5章 文本聚類與主題建模第6章 提示工程第7章 高級文本生成技術與工具第8章 語義搜索與檢索增強生成第9章 多模態大語言模型第10章 構建文本嵌入模型第12章 微調生成模…

4.換行和續寫

一.FileOutputStream寫出數據的兩個小問題&#xff1a; 問題一&#xff1a;換行 假設在本地文件中要輸出數據aweihaoshuai 666&#xff0c;在輸出這個數據時要換行寫出&#xff0c;如下圖&#xff1a; 問題二&#xff1a;續寫 假設在一個文本文件中已經存在數據aweihaoshuai…

聯易融受邀參加上海審計局金融審計處專題交流座談

近日&#xff0c;聯易融科技集團受邀出席了由上海市審計局金融審計處組織的專題交流座談&#xff0c;憑借其在供應鏈金融領域的深厚積累和創新實踐&#xff0c;聯易融為與會人員帶來了精彩的分享&#xff0c;進一步加深現場對供應鏈金融等金融發展前沿領域的理解。 在交流座談…

SOC估算:開路電壓修正的安時積分法

SOC估算&#xff1a;開路電壓修正的安時積分法 基本概念 開路電壓修正的安時積分法是一種結合了兩種SOC估算方法的混合技術&#xff1a; 安時積分法&#xff08;庫侖計數法&#xff09; - 通過電流積分計算SOC變化 開路電壓法 - 通過電池電壓與SOC的關系曲線進行校準 方法原…

代碼隨想錄打卡|Day27(合并區間、單調遞增的數字、監控二叉樹)

貪心算法 Part05 合并區間 力扣題目鏈接 代碼隨想錄鏈接 視頻講解鏈接 題目描述&#xff1a; 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0…

PostgreSQL的擴展 pg_cron

PostgreSQL的擴展 pg_cron pg_cron 是 PostgreSQL 的一個開源擴展&#xff0c;它允許在數據庫內部使用 cron 語法調度定期任務&#xff0c;是最接近 Oracle DBMS_SCHEDULER 的解決方案。 一 安裝與配置 1 安裝方法 下載路徑&#xff1a; https://github.com/citusdata/pg_…

卷積神經網絡遷移學習:原理與實踐指南

引言 在深度學習領域&#xff0c;卷積神經網絡(CNN)已經在計算機視覺任務中取得了巨大成功。然而&#xff0c;從頭開始訓練一個高性能的CNN模型需要大量標注數據和計算資源。遷移學習(Transfer Learning)技術為我們提供了一種高效解決方案&#xff0c;它能夠將預訓練模型的知識…

圖論---樸素Prim(稠密圖)

O( n ^2 ) 題目通常會提示數據范圍&#xff1a; 若 V ≤ 500&#xff0c;兩種方法均可&#xff08;樸素Prim更穩&#xff09;。 若 V ≤ 1e5&#xff0c;必須用優先隊列Prim vector 存圖。 // 最小生成樹 —樸素Prim #include<cstring> #include<iostream> #i…

Spring-Cache替換Keys為Scan—負優化?

背景 使用ORM工具是往往會配合緩存框架實現三級緩存提高查詢效率&#xff0c;spring-cache配合redis是非常常規的實現方案&#xff0c;如未做特殊配置&#xff0c;CacheEvict(allEntries true) 的批量驅逐方式&#xff0c;默認使用keys的方式查詢歷史緩存列表而后delete&…

【N8N】Docker Desktop + WSL 安裝過程(Docker Desktop - WSL update Failed解決方法)

背景說明&#xff1a; 因為要用n8n&#xff0c;官網推薦這個就下載了&#xff0c;然后又是一堆卡的安裝問題記錄過程。 1. 下載安裝包 直接去官網Get Docker | Docker Docs下載 下載的是第一個windows - x86_64. &#xff08;*下面那個beta的感覺是測試版&#xff09; PS&am…

RT Thread 發生異常時打印輸出cpu寄存器信息和棧數據

打印輸出發生hardfault時,當前棧十六進制數據和cpu寄存器信息 在發生 HardFault 時,打印當前棧的十六進制數據和 CPU 寄存器信息是非常重要的調試手段。以下是如何實現這一功能的具體步驟和示例代碼。 1. 實現 HardFault 處理函數 我們需要在 HardFault 中捕獲異常上下文,…

【安裝neo4j-5.26.5社區版 完整過程】

1. 安裝java 下載 JDK21-windows官網地址 配置環境變量 在底下的系統變量中新建系統變量&#xff0c;變量名為JAVA_HOME21&#xff0c;變量值為JDK文件夾路徑&#xff0c;默認為&#xff1a; C:\Program Files\Java\jdk-21然后在用戶變量的Path中&#xff0c;添加下面兩個&am…