Puppeteer 中的 iFrame使用(包括多重嵌套)指南

iframe或内联框架是一种 HTML元素,可用于在当前页面中嵌入另一个网页或文档。在进行网页抓取时,开发人员经常会遇到带有内嵌 iframe 的网页,其中包含重要信息。弹出窗口、交互式表单、广告和动态内容通常包含在这些 iframe 中。要访问和提取这些关键数据,开发人员需要知道如何导航、操作和与这些 iframe 交互。Puppeteer为网页抓取任务提供了强大的解决方案。

这里将引导您完成在 Puppeteer 中有效处理 iframe 的过程。

如何在 Puppeteer 中访问 iFrames?

在使用 Puppeteer 进行网页抓取时,有效访问和与 iframe 交互至关重要。让我们探索处理 iframe 的各个方面。

Puppeteer iFrame 选择器

要在 Puppeteer 中使用 iframe,第一个关键步骤是选择要与之交互的特定 iframe。这涉及使用 CSS 选择器在网页上查找 iframe 元素。以下是说明这一点的示例:

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('https://example.com');// Selecting the iframe by its selectorconst iframeSelector = 'iframe[name="myiframe"]';const iframeElementHandle = await page.$(iframeSelector);await browser.close();
})();

在此脚本中,我们启动 Puppeteer 浏览器并导航到网页。关键步骤是选择 iframe。我们使用 CSS 选择器“iframe[name=“myiframe”]”来精确定位所需的 iframe。此选择器特定于我们感兴趣的 iframe 元素。然后,

page.$(iframeSelector)方法用于选择 iframe。一旦选定,我们就可以访问 iframe 中的内容,并提取网页抓取任务所需的数据。

等待 iFrame 加载

在使用 Puppeteer 进行网页抓取时,确保 iframe 已完全加载是尝试与其内容交互之前的关键步骤。Puppeteer 提供了一种内置机制,用于等待特定元素出现在 iframe 中。以下是示例:

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('https://example.com');const iframeSelector = 'iframe[name="myiframe"]';const iframeElementHandle = await page.$(iframeSelector);// Waiting for the iframe to loadawait iframeElementHandle.waitForSelector('elementInsideIframe');await browser.close();
})();

与上一节类似,我们使用 CSS 选择器选择 iframe。这里的关键步骤是等待 iframe 加载。在此代码中,我们使用iframeElementHandle.waitForSelector(‘elementInsideIframe’)实现此操作。这意味着 Puppeteer 将等待,直到带有 CSS 选择器“elementInsideIframe”的元素出现在 iframe 中。

多重嵌套iFrame

//确保页面加载完成后,以下方法可以返回所有frame对象
await page.frames()

切换到 iFrame

选择 iframe 只是开始;为了有效地与其内容交互,您需要将 Puppeteer 的页面上下文切换到 iframe。这是网页抓取过程中的重要一步,具体操作如下:

const iframe = iframeElementHandle.contentFrame();
await page.evaluate(() => {document.querySelector('elementInsideIframe').click();
});

使用iframeElementHandle选择 iframe 后,脚本使用iframeElementHandle.contentFrame()将 Puppeteer 的页面上下文切换到 iframe。此步骤至关重要,因为它可确保任何后续操作或交互都发生在 iframe 内,从而将它们与父页面隔离开来。进入 iframe 的上下文后,您可以使用page.evaluate()与 iframe 内的元素进行交互。在代码示例中,我们使用document.querySelector(‘elementInsideIframe’).click()模拟对框架内元素的单击操作。这种交互类似于用户单击或与网页上的元素交互的方式。

获取 iFrame 内容

选择并切换到 iframe 后,下一步就是从中提取所需的数据。Puppeteer 提供了一种便捷的方法来检索 iframe 的 HTML 内容,这是网页抓取的一个基本方面。以下是实现此目的的方法:

const iframeContent = await iframeElementHandle.contentFrame().evaluate(() => {return document.body.innerHTML;
});

在此代码中,document.body.innerHTML用于检索 iframe 的 body 元素的整个 HTML 内容。您可以根据您的网页抓取需求修改此代码以定位 iframe 内的特定元素或数据。

如何与 Puppeteer 中的 iFrames 进行交互?

在网页抓取的背景下,与 iframe 交互是 Puppeteer 自动化的一个基本方面。在本节中,我们将探讨与 iframe 交互的各种方法,让您能够有效地提取有价值的数据。

点击 iFrame 内部

与 iframe 中的元素交互通常从单击按钮、链接或其他交互元素等基本功能开始。此步骤在网页抓取中通常至关重要,因为它会触发操作或访问 iframe 中的更多数据。要使用 Puppeteer 单击 iframe 内部,我们使用 iframe.evaluate() 方法,该方法允许我们在 iframe 的上下文中运行 Javascript 代码。以下是示例:

await iframe.evaluate(() => {document.querySelector('buttonInsideIframe').click();
});

通过在 iframe 的上下文中使用iframe.evaluate() ,我们可以与按钮等元素进行交互。

在 iFrame 中使用 QuerySelector

对于 iframe 中的网页抓取,querySelector 函数是一种功能强大且常用的工具,用于操作或检索特定元素中的数据。这是一种多功能方法,可让您根据 CSS 选择器定位元素。当您需要从 iframe 上下文中的元素中提取文本、属性或数据时,这种方法尤其有用。以下是在 iframe 上下文中使用它的方法:


const textInIframe = await iframe.evaluate(() => {return document.querySelector('elementInsideIframe').textContent;
});

在 iFrame 内滚动

在 iframe 内滚动对于网页抓取至关重要,尤其是在处理较长或动态加载的内容时。滚动允许您访问 iframe 加载时可能无法立即显示的隐藏或附加数据。您可以使用 Puppeteer 在 iframe 内滚动,如下所示:

// 在此脚本中,我们使用window.scrollBy(0, 100)在 iframe 内向下滚动 100 像素。
await iframe.evaluate(() => {window.scrollBy(0, 100); // Scrolling down by 100 pixels
});

获取 iFrame 内的元素

当您需要从 iframe 中的多个元素中提取数据时,Puppeteer 提供了一种方便的方法$$eval()。此方法对于网页抓取任务非常有用,因为它简化了从 iframe 中与给定选择器匹配的多个元素中提取数据的过程。这在处理结构化数据(例如产品名称、价格或列表或表格中显示的任何信息)时非常有用。


const elementsInIframe = await iframe.$$eval('selectorInsideIframe', (elements) => {return elements.map((element) => element.textContent);
});

此代码使用$$eval()从 iframe 内与提供的选择器匹配的所有元素中检索文本内容数组。

waitForFunction()

Puppeteer 中的page.waitForFunction()方法是一个强大的工具,用于等待 iframe 中满足条件。这对于确保 iframe 已正确加载并且预期内容可用于交互特别有用。以下是如何在iframe 中使用page.waitForFunction()的示例:

await iframe.waitForFunction(() => {return document.querySelector('expectedElementInsideIframe') !== null;
});

在此代码中,Puppeteer 等待指定条件变为真,然后才继续在 iframe 中进行进一步的交互。这是确认 iframe 已准备好进行抓取并且所需元素可用的有效方法。

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

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

相关文章

Java 中 IOC 和 AOP 机制详解

Java 中 IOC 和 AOP 机制详解 1. IOC (Inversion of Control) 控制反转 1.1 定义 控制反转:将对象的创建和依赖关系的管理从应用程序代码中转移到外部容器中。简单来说,就是把对象的创建和管理交给容器负责,而不是由程序员自己手动创建和管…

zookeeper启动(一)

1.zookeeper启动入口 在zkServer.sh的启动命令中,我们可以找到zookeeper启动的关键类org.apache.zookeeper.server.quorum.QuorumPeerMain QuorumPeerMain#main 我们可以直接看org.apache.zookeeper.server.quorum.QuorumPeerMain中的main方法,从下面的main方法中,我们可以…

专为Mac设计的窗口管理Magnet 中文

Magnet是一款专为Mac设计的窗口管理工具软件。它具备强大的多窗口管理能力,支持用户通过简单的拖放操作,将应用程序窗口快速对齐、排列和分组。此外,Magnet还提供了预设的布局选项和自定义设置功能,帮助用户实现个性化的窗口布局。…

本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验

GLM-4-9B是清华大学和智谱AI推出的最新一代预训练模型GLM-4系列中的开源版本。在语义、数学、推理、代码和知识等多方面的数据集测评中,GLM-4-9B及其人类偏好对齐的版本GLM-4-9B-Chat均表现出较高的性能,其通用能力评测结果甚至超越了Llama-3-8B开源大模…

多样本上下文学习:开拓大模型的新领域

大模型(LLMs)在少量样本上下文学习(ICL)中展现出了卓越的能力,即通过在推理过程中提供少量输入输出示例来学习,而无需更新权重。随着上下文窗口的扩展,我们现在可以探索包含数百甚至数千个示例的…

pdf怎么编辑修改内容?3个实用软件!

在当今数字化时代,PDF文件因其跨平台、格式固定的特性,成为我们日常工作和生活中不可或缺的一部分。然而,PDF文件的修改和编辑往往成为许多人的难题。本文将为您详细介绍如何编辑修改PDF文件的内容,并推荐几款实用的编辑软件&…

搭建多平台比价系统需要了解的电商API接口?

搭建一个多平台比价系统涉及多个步骤,以下是一个大致的指南: 1. 确定需求和目标 平台选择:确定你想要比较价格的平台,例如电商网站、在线旅行社等。数据类型:明确你需要收集哪些数据,如产品价格、产品名称…

github的个人readme文件

一个好的svg图: Simon-He95/profile-3d-contrib/profile-season-animate.svg at 4281d9f46e3d5416bd8f8cc5779157bfdaa8589d Simon-He95/Simon-He95 GitHub 请访问他的主页从提交记录就可以看到这个立体的登录github的图

nginx中配置ssl证书(宝塔面板)

首先申请一个SSL证书,这里我申请的joyssl的免费证书。提交订单申请后,按照页面提示在域名解析中将CNAME和记录值配置好。 比如我用的阿里云, 这是好后,需要等几分钟,然后域名检验成功。 然后点击joyssl的左侧菜单的“证…

消息队列笔记

异步技术 企业级应用中广泛使用的三种异步消息传递技术 原文链接:https://blog.csdn.net/qq_55917018/article/details/122122218 三种异步消息传递技术 JMS (java message service) 一个Java规范,等同于JDBC规范,提供了与消息服务相关的…

Oracle数据库面试题-9

81. 请解释Oracle数据库中的林业数据处理方法。 Oracle数据库中的林业数据处理 在Oracle数据库中处理林业数据涉及到存储、管理、分析和可视化与林业相关的数据。以下是林业数据处理的一些关键方面以及如何使用Oracle数据库进行示例性的SQL说明: 数据库设计&#…

Web后端开发(请求-简单参数)(一)

原始方式: 在原始的web程序中,获取请求参数,需要通过HttpServletRequest 对象手动获取。 RequestMapping("/simpleParam") public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParame…

小阿轩yx-iptables 防火墙

小阿轩yx-iptables 防火墙 Linux 防火墙基础 体系主要工作在 网络层针对TCP/IP 数据包实施过滤和限制 属于典型的包过滤防火墙(或者称为网络层防火墙) 体系基于内核编码实现 好处 具有非常稳定的性能高效率 防火墙两个表示 netfilteriptables …

代码随想录算法训练营第四天|24. 两两交换链表中的节点 |19.删除链表的倒数第N个节点 | 面试题 02.07. 链表相交 | 142.环形链表II

24. 两两交换链表中的节点 文档讲解:代码随想录 视频讲解:帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点_哔哩哔哩_bilibili 1. 第一想法是不知道这个题如何做,知道有改变指针这个操作。 2. 双指针也太…

学习分享-为什么把后台的用户验证和认证逻辑放到网关

将后台的用户验证和认证逻辑放到网关(API Gateway)中是一种常见的设计模式,这种做法在微服务架构和现代应用中有许多优势和理由: 1. 集中管理认证和授权 统一的安全策略 在一个包含多个微服务的系统中,如果每个服务…

优化扩散模型中的采样计划

在生成模型领域,扩散模型(Diffusion Models, DMs)因其卓越的生成质量而成为最新的技术趋势。但这些模型的一个关键缺点是它们的采样速度较慢,需要通过大型神经网络进行多次顺序函数评估。扩散模型通过一个称为采样计划的离散噪声水…

Golang | Leetcode Golang题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; var (dx [4]int{1, -1, 0, 0}dy [4]int{0, 0, 1, -1} ) func solve(board [][]byte) {if len(board) 0 || len(board[0]) 0 {return}n, m : len(board), len(board[0])queue : [][]int{}for i : 0; i < n; i {if board[i][0] O {q…

xmind父主题快捷键Ctrl+Enter

xmind父主题快捷键 CtrlEnter

实验八、地址解析协议《计算机网络》

水逆退散&#xff0c;学业进步&#xff0c;祝我们都好&#xff0c;不止在夏天。 目录 一、实验目的 二、实验内容 &#xff08;1&#xff09;预备知识 &#xff08;2&#xff09;实验步骤 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地…

MySQL之查询性能优化(十二)

查询性能优化 优化COUNT()查询 4.使用近似值 有时候某些业务场景并不要求完全精确的COUNT值&#xff0c;此时可以用近似值来代替。EXPLAIN出来的优化器估算的行数就是一个不错的近似值&#xff0c;执行EXPLAIN并不需要真正地去执行查询&#xff0c;所以成本很低。很多时候&am…