当前位置: 首页 > news >正文

Puppeteer 和 Cheerio 在 Node.js 中的应用

Puppeteer 和 Cheerio 在 Node.js 中的应用

引言

在现代 Web 开发中,自动化测试、数据抓取和页面分析是常见的需求。Node.js 提供了丰富的工具和库来满足这些需求。本文将介绍两个在 Node.js 中常用的库:Puppeteer 和 Cheerio,它们分别用于浏览器自动化和 HTML 解析。

一、Puppeteer:浏览器自动化工具
1.1 什么是 Puppeteer?

Puppeteer 是一个 Node.js 库,提供了一个高级 API 来控制无头 Chrome 或 Chromium 浏览器。它主要用于自动化浏览器操作,如页面导航、表单提交、截图、生成 PDF 等。

1.2 Puppeteer 的主要功能
  • 浏览器自动化:可以模拟用户在浏览器中的操作,如点击、输入、滚动等。
  • 页面导航:可以导航到指定的 URL,并获取页面的内容。
  • 截图和 PDF 生成:可以对页面进行截图,或将页面内容保存为 PDF。
  • 表单提交:可以自动填写和提交表单。
  • 无头模式:可以在无头模式下运行浏览器,即不显示浏览器界面。
1.3 示例代码
const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('https://example.com');const content = await page.content();console.log(content);await browser.close();
})();

在这个示例中,我们使用 Puppeteer 启动了一个无头浏览器,导航到 https://example.com,并获取了页面的 HTML 内容。

二、Cheerio:服务器端的 jQuery
2.1 什么是 Cheerio?

Cheerio 是一个轻量级的库,实现了 jQuery 的核心功能,专门用于解析和操作 HTML 文档。它非常适合用于服务器端的数据提取和操作。

2.2 Cheerio 的主要功能
  • HTML 解析:可以将 HTML 字符串解析为 DOM 树。
  • 选择器:支持类似于 jQuery 的选择器语法,可以方便地选择和操作 DOM 元素。
  • 数据提取:可以从 HTML 中提取所需的数据。
  • DOM 操作:可以对 DOM 元素进行增删改查操作。
2.3 示例代码
const cheerio = require('cheerio');
const html = '<ul id="fruits"><li class="apple">Apple</li><li class="orange">Orange</li><li class="pear">Pear</li></ul>';const $ = cheerio.load(html);const fruits = [];
$('li').each((index, element) => {fruits.push($(element).text());
});console.log(fruits); // 输出: [ 'Apple', 'Orange', 'Pear' ]

在这个示例中,我们使用 Cheerio 解析了一个 HTML 字符串,并提取了所有 <li> 元素的文本内容。

三、结合使用 Puppeteer 和 Cheerio

在实际应用中,Puppeteer 和 Cheerio 经常结合使用。Puppeteer 用于获取页面的动态内容,而 Cheerio 用于解析和提取数据。

3.1 示例代码
const puppeteer = require('puppeteer');
const cheerio = require('cheerio');(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('https://example.com');const content = await page.content();const $ = cheerio.load(content);const titles = [];$('h1').each((index, element) => {titles.push($(element).text());});console.log(titles);await browser.close();
})();

在这个示例中,我们首先使用 Puppeteer 获取页面的 HTML 内容,然后使用 Cheerio 解析 HTML 并提取所有 <h1> 元素的文本内容。

四、总结

Puppeteer 和 Cheerio 是两个功能强大的 Node.js 库,分别用于浏览器自动化和 HTML 解析。Puppeteer 可以模拟用户在浏览器中的操作,获取动态生成的页面内容;而 Cheerio 则提供了类似于 jQuery 的 API,方便地解析和操作 HTML 文档。通过结合使用这两个库,我们可以轻松实现复杂的 Web 自动化任务和数据抓取任务。

五、参考资料
  • Puppeteer 官方文档
  • Cheerio 官方文档

相关文章:

Puppeteer 和 Cheerio 在 Node.js 中的应用

Puppeteer 和 Cheerio 在 Node.js 中的应用 引言 在现代 Web 开发中&#xff0c;自动化测试、数据抓取和页面分析是常见的需求。Node.js 提供了丰富的工具和库来满足这些需求。本文将介绍两个在 Node.js 中常用的库&#xff1a;Puppeteer 和 Cheerio&#xff0c;它们分别用于…...

Unity2D 关于N方向俯视角 中 角色移动朝向的问题

通常对俯视角2d游戏的角色移动我们使用简单2d混合树的方式,但是其不移动时的朝向该如何定义&#xff1f; 十分简单&#xff1a;移动和不移动之间形成逻辑自锁 详细说明思路就是再创建一个简单2d混合树 定义其N方向的idle 并用lastDirc二维向量保存玩家输入&#xff0c;当玩家输…...

pytorch 和tensorflow loss.item()` 只能用于只有一个元素的张量. 防止显存爆炸

loss.item() 是 PyTorch 中的一个方法&#xff0c;它用于从一个只包含单个元素的张量&#xff08;tensor&#xff09;中提取出该元素的值&#xff0c;并将其转换为一个 Python 标量&#xff08;即 int 或 float 类型&#xff09;。这个方法在训练神经网络时经常用到&#xff0c…...

链表刷题|判断回文结构

题目来自于牛客网&#xff0c;本文章仅记录学习过程的做题理解&#xff0c;便于梳理思路和复习 我做题喜欢先把时间复杂度和空间复杂度放一边&#xff0c;先得有大概的解决方案&#xff0c;最后如果时间或者空间超了再去优化即可。 思路一&#xff1a;要判断是否为回文结构则…...

海盗王集成网关和商城服务端功能golang版

之前用golang把海盗王的商城服务端和网关服务端都重写了一次。 后来在同时开启网关和商城服务时&#xff0c;发现窗口数量有点多&#xff0c;有时要找到商城窗口比较麻烦。 既然2个都是用golang govcl写的&#xff0c;是不是可以集成到一起&#xff0c;方便使用呢&#xff1f;…...

SCI 中科院分区中位于4区,JCR分区位于Q2 是什么水平?

环境&#xff1a; ACM Transactions on Interactive Intelligent Systems 《Acm Transactions On Interactive Intelligent Systems》(《交互式智能系统上的 Acm 事务》)是一本由ASSOC COMPUTING MACHINERY (ACM)出版的Computer Interaction-Computer Science-Human学术刊物&…...

微知-Mellanox网卡的另外一种升级方式mlxup?(mlxup -d xxx -i xxx.bin)

背景 一般升级Mellanox网卡使用flint&#xff0c;还有另外一种叫做mlxup。 NVIDIA 提供了两种固件工具来更新和查询适配器固件&#xff1a; MLXUP - 固件更新和查询实用程序。该实用程序允许扫描服务器计算机以查找可用的 NVIDIA 适配器&#xff0c;并指示每个适配器是否需要…...

《Shader入门精要》透明效果

代码以及实例图可以看github &#xff1a;zaizai77/Shader-Learn: 实现一些书里讲到的shader 在实时渲染中要实现透明效果&#xff0c;通常会在渲染模型时控制它的透明通道&#xff08;Alpha Channel&#xff09;​。当开启透明混合后&#xff0c;当一个物体被渲染到屏幕上时&…...

Linux之SELinux与防火墙

一、SELinux的说明 开发背景与目的&#xff1a; SELinux由美国国家安全局&#xff08;NSA&#xff09;开发&#xff0c;旨在避免资源的误用。传统的Linux基于自主访问控制&#xff08;DAC&#xff09;&#xff0c;通过判断进程所有者/用户组与文件权限来控制访问&#xff0c;对…...

深度学习使用LSTM实现时间序列预测

大家好&#xff0c;LSTM是一种特殊的循环神经网络&#xff08;RNN&#xff09;架构&#xff0c;它被设计用来解决传统RNN在处理长序列数据时的梯度消失和梯度爆炸问题&#xff0c;特别是在时间序列预测、自然语言处理和语音识别等领域中表现出色。LSTM的核心在于其独特的门控机…...

Vue第一篇:组件模板总结

前言 本文希望读者有一定的Vue开发经验&#xff0c;样例采用vue中的单文件组件&#xff0c;也是我的个人笔记&#xff0c;欢迎一起进步 必须有根元素 这是一个最简单的vue单文件组件&#xff0c;<template></template>被称为模板&#xff0c;模板中必须有一个根元素…...

时钟使能、

时钟使能 如果正确使用&#xff0c;时钟使能能够显著地降低系统功耗&#xff0c;同时对面积或性能的影响极小。但是如果不正确地使用时钟使能&#xff0c; 可能会造成下列后果&#xff1a; • 面积增大 • 密度减小 • 功耗上升 • 性能下降 在许多使用大量控制集的…...

1. Autogen官网教程 (Introduction to AutoGen)

why autogen The whole is greater than the sum of its parts.(整体的功能或价值往往超过单独部分简单相加的总和。) -Aristotle autogen 例子 1. 导入必要的库 首先&#xff0c;导入os库和autogen库中的ConversableAgent类。 import os from autogen import Conversable…...

开源账目和账单

开源竞争&#xff1a; 开源竞争&#xff08;当你无法彻底掌握技术的时候&#xff0c;你就开源这个技术&#xff0c;让更多的人了解这个技术&#xff0c;形成更多的技术依赖&#xff0c;你会说这不就是在砸罐子吗&#xff1f;一个行业里面总会有人砸罐子&#xff0c;你不如先砸…...

vue2面试题10|[2024-11-24]

问题1&#xff1a;vue设置代理 如果你的前端应用和后端API服务器没有运行在同一个主机上&#xff0c;你需要在开发环境下将API请求代理到API服务器。这个问题可以通过vue.config.js中的devServer.proxy选项来配置。 1.devServer.proxy可以是一个指向开发环境API服务器的字符串&…...

c语言与c++到底有什么区别?

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于c语言与c区别的相关内容&#xff01; 关…...

云计算-华为HCIA-学习笔记

笔者今年7月底考取了华为云计算方向的HCIE认证&#xff0c;回顾从IA到IE的学习和项目实战&#xff0c;想整合和分享自己的学习历程&#xff0c;欢迎志同道合的朋友们一起讨论&#xff01; 第二章&#xff1a;服务器基础 服务器是什么&#xff1f; 服务器本质上就是个性能超强的…...

优先算法 —— 双指针系列 - 复写零

目录 1. 复写零 2. 算法原理 一般情况下 改为就地操作&#xff1a;从左到右&#xff08;错误&#xff09; 从右到左 总结一下解决方法&#xff1a; 如何找到最后一个复写的数 特殊情况 完整步骤&#xff1a; 3. 代码 1. 复写零 题目链接&#xff1a;1089. 复写零 - 力…...

初识Linux—— 基本指令(下)

前言&#xff1a; 本篇继续来学习Linux的基础指令&#xff0c;继续加油&#xff01;&#xff01;&#xff01; 本篇文章对于图片即内容详解&#xff0c;已同步到本人gitee&#xff1a;Linux学习: Linux学习与知识讲解 Linux指令 1、查看文件内容的指令 cat ​ cat 查看文件…...

esayexcel进行模板下载,数据导入,验证不通过,错误信息标注在excel上进行返回下载

场景&#xff1a;普普通通模板下载&#xff0c;加数据导入&#xff0c;分全量和增量&#xff0c;预计20w数据&#xff0c;每一条数据校验&#xff0c;前后端代码贴上&#xff08;代码有删改&#xff0c;关键代码都有&#xff0c;好朋友们自己取舍&#xff0c;代码一股脑贴上了&…...

服务器数据恢复—raid5阵列热备盘上线失败导致EXT3文件系统不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 两组分别由4块SAS硬盘组建的raid5阵列&#xff0c;两组阵列划分的LUN组成LVM架构&#xff0c;格式化为EXT3文件系统。 服务器故障&#xff1a; 一组raid5阵列中的一块硬盘离线。热备盘自动上线替换离线硬盘&#xff0c;但在热备盘上线同步数据…...

《Qt Creator:人工智能时代的跨平台开发利器》

《Qt Creator&#xff1a;人工智能时代的跨平台开发利器》 一、Qt Creator 简介&#xff08;一&#xff09;功能和优势&#xff08;二&#xff09;快捷键与效率提升&#xff08;三&#xff09;跨平台支持&#xff08;四&#xff09;工具介绍与使用主要特性&#xff1a;使用步骤…...

AG32既可以做MCU,也可以仅当CPLD使用

Question: AHB总线上的所有外设都需要像ADC一样&#xff0c;通过cpld处理之后才能使用? Reply: 不用。 除了ADC外&#xff0c;其他都是 mcu可以直接配置使用的。 Question: DMA和CMP也不用? Reply: DMA不用。 ADC/DAC/CMP 用。 CMP 其实配置好后&#xff0c;可以直…...

51c自动驾驶~合集31

我自己的原文哦~ https://blog.51cto.com/whaosoft/12121357 #大语言模型会成为自动驾驶的灵丹妙药吗 人工智能&#xff08;AI&#xff09;在自动驾驶&#xff08;AD&#xff09;研究中起着至关重要的作用&#xff0c;推动其向智能化和高效化发展。目前AD技术的发展主要遵循…...

2023年3月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题目123456789101112131415答案BAACBDDAADBCDBC 1.以下不属于计算机输入设备的有&#xff08; &#xff09;。 A &#xff0e;键盘 B &#xff0e;音箱 C &#xff0e;鼠标 D &#xff0e;传感器 【答案】 …...

linux NFS

什么是NFS NFS是Network File System的缩写&#xff0c;即网络文件系统。一种使用于分散式 文件协议通过网络让不同的机器、不同的操作系统能够分享个人数据&#xff0c;让应用 程序通过网络可以访问位于服务器磁盘中的数据。NFS在文件传送或信息传送 的过程中&#xff0c;依赖…...

查看浏览器的请求头

爬虫时用到了请求头&#xff0c;虽然可以用网上公开的&#xff0c;但是还是想了解一下本机浏览器的。以 Edge 为例&#xff0c;其余浏览器通用。 打开浏览器任一网页&#xff0c;按F12打开DevTools&#xff1b;或鼠标右键&#xff0c;选择“检查”。首次打开界面应该显示在网页…...

【JavaEE进阶】 JavaScript

本节⽬标 了解什么是JavaScript, 学习JavaScript的常⻅操作, 以及使⽤JQuery完成简单的⻚⾯元素操作. 一. 初识 JavaScript 1.JavaScript 是什么 JavaScript (简称 JS), 是⼀个脚本语⾔, 解释型或即时编译型的编程语⾔. 虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名&#xff0c;…...

后端接受大写参数(亲测能用)

重要点引入包别引用错了 import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data;JsonSerialize Data public class Item {JsonProperty(value "Token")private String token…...

Unity ShaderLab --- 实现局部透明

首先准备一张局部透明度的贴图 实现局部透明原理&#xff1a; 采样准备好的贴图&#xff0c;在片元着色中&#xff0c;将返回颜色的a值乘上采样后的a值 代码&#xff1a; fixed4 frag (v2f i) : SV_Target{fixed4 col i.color;col.a * tex2D(_MainTex, i.texcoord).a;return…...