无头浏览器 Puppeteer-案例demo

一、无头浏览器 Puppeteer基础介绍:

我们日常使用浏览器的步骤为:
启动浏览器、打开一个网页、进行交互。而无头浏览器指的是我们使用脚本来执行以上过程的浏览器,能模拟真实的浏览器使用场景。

有了无头浏览器,我们就能做包括但不限于以下事情:

  1. 对网页进行截图保存为图片或 pdf
  2. 抓取单页应用(SPA)执行并渲染(解决传统 HTTP 爬虫抓取单页应用难以处理异步请求的问题)
  3. 做表单的自动提交、UI的自动化测试、模拟键盘输入等
  4. 用浏览器自带的一些调试工具和性能分析工具帮助我们分析问题
  5. 在最新的无头浏览器环境里做测试、使用最新浏览器特性
    写爬虫做你想做的事情~

二、写了一个案例demo,一起学习吧:

puppeteer无头浏览器-自动化测试、长图截取,pdf导出功能
github地址:puppeteer-demo
前面看了很多基础理论,但还是不上手,自己写个demo,瞬间清晰;
涉及到相关的知识:

1.cheerio

cheerio 是一个类似于 jQuery 的库,用于在服务器端解析和操作 HTML 文档。它提供了一种方便的方式来使用类似于 jQuery 的选择器和DOM操作,使得在服务器端对 HTML 文档进行解析和操作变得非常简单。

通过 cheerio,你可以像在客户端使用 jQuery 一样在服务器端对 HTML 文档进行操作,包括查找元素、修改内容、添加或删除元素等。这使得在服务器端进行页面分析和数据提取变得更加便捷。

在之前的代码示例中,我们使用了 cheerio 来加载从网站获取的 HTML 内容,并通过使用类似 jQuery 的语法来查找表格中的银行名称。这样可以方便地从网页中提取出需要的信息,进行进一步的处理和分析。

总的来说,cheerio 是一个非常实用的工具,特别适合在 Node.js 环境下对 HTML 文档进行解析和操作。

2. new URL(import.meta.url) 和 path.join(__dirname, …)的区别

new URL(import.meta.url):

import.meta.url 是 ES 模块中的一个特殊变量,用于获取当前模块的 URL。
通过 new URL(import.meta.url) 可以将 URL 字符串解析为 URL 对象,从而获取当前模块文件的完整路径信息。
这种方法在 ES 模块中使用较为常见。
path.join(__dirname, …):

1)__dirname 是 Node.js 中的一个特殊变量,用于获取当前模块的目录路径。
2)path.join() 方法用于拼接路径片段,并返回标准化后的路径。
这种方法在 CommonJS 模块中经常被使用。
虽然这两种方法都可以用于获取当前模块的路径信息,但在不同模块规范下(ES 模块 vs. CommonJS 模块),推荐使用相应的方式来获取路径信息以保持一致性和兼容性。

其中捕获截图,涉及到路径问题,特别研究下:

 import puppeteer from "puppeteer"
import path from 'path';async function captureScreenshot(url, outputFilePath) {// .launch 方法启动一个浏览器实例,然后打开一个新的页面const browser = await puppeteer.launch({ headless: true });printColor("开始启动.......", 32);const page = await browser.newPage();printColor("等待页面加载完毕.......", 32);await page.goto(url, { waitUntil: 'networkidle0' }); // 等待页面加载完成  // 确保页面加载完成后再进行下一步操作。printColor("获取网站完整页面中.......", 32);// 获取页面的整个高度和宽度const bodyHeight = await page.evaluate(() => document.body.scrollHeight);// const bodyWidth = await page.evaluate(() => document.body.scrollWidth);// 设置视口大小和截图尺寸await page.setViewport({ width: 1366, height: bodyHeight });// import.meta.url 是 ES 模块中的一个特殊变量,用于获取当前模块的 URL。puppeteer-explore/puppeteer-app/short/index.mjsconst currentFilePath = new URL(import.meta.url).pathname;// path.join() 方法用于拼接路径片段,并返回标准化后的路径。// path.dirname(currentFilePath) 的结果是:// puppeteer-explore/puppeteer-app/short// outputFilePath的结果是:screenshot/baidu.com.pngconst outPath = path.join(path.dirname(currentFilePath), outputFilePath);//  outPath的结果就是// puppeteer-explore/puppeteer-app/short/screenshot/baidu.com.pngawait page.screenshot({ path: outPath, fullPage: true });await browser.close(); // 关闭浏览器
}
// const url = 'https://isux.tencent.com';
const url = 'https://baidu.com';const outPath = 'screenshot/' + getMainDomain(url) + '.png'; // 不包含short目录// const outPath = path.join(path.dirname(new URL(import.meta.url).pathname), outputFilePath);captureScreenshot(url, outPath).then(() => console.log('Screenshot captured', outPath)).catch(error => console.error(error));function getMainDomain(url) {const parsedUrl = new URL(url);const hostname = parsedUrl.hostname;// 'isux.tencent.com'return hostname;
}function printColor(text, color) {const colorCode = `\u001b[${color}m`;const textCode = `${text}\u001b[0m`;process.stdout.write(`${colorCode}${textCode}\n`);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(十六)springboot实战——spring securtity的认证流程源码解析

前言 本节内容是关于spring security安全框架认证流程的源码分析,spring security的认证流程主要是在UsernamePasswordAuthenticationFilter过滤器中实现的。我们会通过源码层级的分析,了解清楚spring security的底层是如何实现用户的认证的。 正文 1…

MySQL数据库练习【二】

MySQL数据库练习【二】 一、MySQL基本语法二、建库建表-数据准备三、MySQL经典50题-题目四、MySQL经典50题-答案4.1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数4.2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数4.…

云计算运维1

1、企业服务器LNMP环境搭建 集群:多台服务器在一起作同样的事 。分布式 :多台服务器在一起作不同的事 。 环境准备: 1、设置静态ip(NAT模式网关为.2) # cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"E…

【多模态大模型】Latent Diffusion:在潜在空间而非像素空间进行操作,从而减少了计算复杂度

Latent Diffusion Stable Diffusion 和 Latent Diffusion扩散模型的成本问题子问题1: 高计算成本和训练复杂度子问题2: 保持生成图像的视觉保真度子问题3: 实现多模态和高分辨率图像合成子问题4: 保持图像质量与细节Latent Diffusion 过程: 总结子问题/子解法1&…

关于php匿名函数中的use

匿名函数中的use&#xff0c;其作用就是从父作用域继承变量。 下例是最常见的用法&#xff0c;如果不使用use&#xff0c;函数中将找不到变量$msg。 <?php $msg [1,2,3]; $func function()use($msg){print_r($msg); }; $func(); ?>运行输出 Array ([0] > 1[1] …

识别CMS指纹与WAF识别

目录 识别CMS指纹 1 什么是CMS指纹&#xff1f; 2 常见的CMS指纹 3 识别CMS指纹的方法有哪些&#xff1f; &#xff08;1&#xff09;分析HTTP响应头&#xff0c;识别CMS的特定标头。 &#xff08;2&#xff09;通过配置文件/特殊文件 &#xff08;3&#xff09;分析网站…

SSM框架,Spring-ioc的学习(上)

知识点引入 关于框架 框架( Framework )是一个集成了基本结构、规范、设计模式、编程语言和程序库等基础组件的软件系统&#xff0c;它可以用来构建更高级别的应用程序。框架的设计和实现旨在解决特定领域中的常见问题&#xff0c;帮助开发人员更高效、更稳定地实现软件开发目…

iOS 需求 多语言(国际化)App开发 源码

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

Python:流程控制

4.1 顺序结构 在任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下一行行地执行&#xff0c;中间没有任何判断和跳转。 如果Python程序的多行代码之间没有任何流程控制&#xff0c;则程序总是从上往下依次执行&#xff0c;排在前面的代码先执行&#xf…

第5章——深度学习入门(鱼书)

第5章 误差反向传播法 上一章中&#xff0c;我们介绍了神经网络的学习&#xff0c;并通过数值微分计算了神经网络的权重参数的梯度&#xff08;严格来说&#xff0c;是损失函数关于权重参数的梯度&#xff09;。数值微分虽然简单&#xff0c;也容易实现&#xff0c;但缺点是计…

STM32内存管理

一.什么是内存管理 内存管理是计算机系统中的一个重要组成部分&#xff0c;它负责管理计算机的内存资源。内存管理的主要目标是有效地分配、使用和释放内存&#xff0c;以满足程序的运行需求。 内存是计算机用于存储程序和数据的地方&#xff0c;它由一系列内存单元组成&#…

Flink 2.0 状态存算分离改造实践

本文整理自阿里云智能 Flink 存储引擎团队兰兆千在 FFA 2023 核心技术&#xff08;一&#xff09;中 的分享&#xff0c;内容关于 Flink 2.0 状态存算分离改造实践的研究&#xff0c;主要分为以下四部分&#xff1a; Flink 大状态管理痛点 阿里云自研状态存储后端 Gemini 的存…

利用路由懒加载和CDN分发策略对极客园项目进行性能优化

文章目录 前言1.配置路由懒加载2.项目资源打包3.包体积可视化分析4.cdn配置 总结 前言 极客园项目的完成之后&#xff0c;我们需要对项目进行打包以及性能优化&#xff0c;优化用户体验以及加快响应时间&#xff0c;本文只列举了路由懒加载和cdn分发的策略 1.配置路由懒加载 …

政安晨:快速学会~机器学习的Pandas数据技能(二)(索引、选择与赋值)

小伙伴们&#xff0c;今天这篇文章里讲到的操作&#xff0c;专业的数据科学家每天都会执行这个动作数十次。你当然也可以做到&#xff01; 概述 选择pandas DataFrame或Series中的特定值进行操作是几乎任何数据操作中的一个隐含步骤&#xff0c;因此在使用Python处理数据时&am…

怎么给《Cyberpunk 2077》制作功能性MOD

Cyberpunk的官方mod支持【REDmod】&#xff1a;https://www.cyberpunk.net/zh-cn/modding-support。官网有三个视频教程&#xff0c;其中第二集演示了脚本的替换&#xff0c;比较合程序员的胃口。 REDmod 是《赛博朋克 2077》的免费 DLC&#xff08;须购买游戏之后才能下载&am…

【Java 数据结构】String进阶

字符串常量池 1. 创建对象的思考2. 字符串常量池(StringTable)3. 再谈String对象创建 1. 创建对象的思考 下面两种创建String对象的方式相同吗&#xff1f; public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 …

前端ajax技术

ajax可以实现局部刷新&#xff0c;也叫做无刷新&#xff0c;无刷新指的是整个页面不刷新&#xff0c;只是局部刷新&#xff0c;ajax可以自己发送http请求&#xff0c;不用通过浏览器的地址栏&#xff0c;所以页面整体不会刷新&#xff0c;ajax获取到后台数据&#xff0c;更新页…

计算机毕业设计 | SSM超市进销存管理系统(附源码)

1&#xff0c;绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约&#xff0c;外国人迈克尔库伦开设了第一家合作商店&#xff0c;为了更好地吸引大量客流量&#xff0c;迈克尔库伦精心设计了低价策略&#xff0c;通过大量进货把商品价格压低&#xff0c;通过商店一次性集…

Nginx中logs的nginx.pid文件引发的问题

Nginx中logs的nginx.pid文件引发的问题 Q1&#xff1a;nginx: [error] CreateFile() "D:\software\nginx-1.22.1/logs/nginx.pid" failed (2: The system cannot find the file specified)Q2&#xff1a;nginx: [error] invalid PID number "" in "D:…

【flink状态管理(四)】MemoryStateBackend的实现

文章目录 1.基于MemoryStateBackend创建KeyedStateBackend1.1. 状态初始化1.2. 创建状态 2. 基于MemoryStateBackend创建OperatorStateBackend3.基于MemoryStateBackend创建CheckpointStorage 在Flink中&#xff0c;默认的StateBackend实现为MemoryStateBackend&#xff0c;本文…