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

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

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

如何在 Puppeteer 中访问 iFrames?

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

Puppeteer iFrame 选择器

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

js 复制代码
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 selector
  const 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 中。以下是示例:

js 复制代码
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 load
  await iframeElementHandle.waitForSelector('elementInsideIframe');

  await browser.close();
})();

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

多重嵌套iFrame

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

切换到 iFrame

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

js 复制代码
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 内容,这是网页抓取的一个基本方面。以下是实现此目的的方法:

js 复制代码
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 代码。以下是示例:

js 复制代码
await iframe.evaluate(() => {
  document.querySelector('buttonInsideIframe').click();
});

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

在 iFrame 中使用 QuerySelector

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

js 复制代码
const textInIframe = await iframe.evaluate(() => {
  return document.querySelector('elementInsideIframe').textContent;
});

在 iFrame 内滚动

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

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

获取 iFrame 内的元素

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

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

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

waitForFunction()

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

js 复制代码
await iframe.waitForFunction(() => {
  return document.querySelector('expectedElementInsideIframe') !== null;
});

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