📜  如何在 Node.js 中使用 Puppeteer 抓取网站?(1)

📅  最后修改于: 2023-12-03 15:38:21.912000             🧑  作者: Mango

如何在 Node.js 中使用 Puppeteer 抓取网站?

Puppeteer 是一个 Node.js 库。它提供了一个高级别的 API,用于通过 Headless Chrome 浏览器自动化任务。因此,它可以用来实现网站的爬虫等自动化任务。

安装和初始化 Puppeteer

首先,需要安装 Puppeteer 库和 Chrome 浏览器。可以运行以下命令在项目中安装它们:

npm install puppeteer --save

然后在代码文件的开头引入 Puppeteer:

const puppeteer = require('puppeteer');

初始化 Puppeteer 的过程中可以传入一些选项,其中最常用的是 headless,它指示 Chrome 是否应该运行在无头模式下。无头模式是指 Chrome 运行时没有 GUI 界面,可以节省资源并提高性能:

const browser = await puppeteer.launch({
  headless: true
});
打开页面和等待完成

打开一个页面可以使用 browser.newPage() 方法,这样就可以创建一个新的 Page 实例来表示打开的页面。

const page = await browser.newPage();

随后,可以使用 page.goto(url) 方法前往指定的 URL:

await page.goto('https://www.baidu.com');

Page 的内部实现是一个事件触发代码的机制。当通过 page.goto(url) 进行页面跳转时,代码不会自动等待页面加载完成。这时需要等待触发 page.load 事件来确保存取到的页面完整,可以使用 page.waitForNavigation() 方法或 page.waitForSelector(selector) 方法来等待页面加载完成。例如,等待一个特定的元素展示出来:

await page.waitForSelector('#id_selector');
获取和操作元素

获取页面元素可以使用 page.$(selector) 方法。当页面中有多个匹配该 selector 的元素时,会返回第一个匹配的元素实例;如果没有找到,返回 null。

const element = await page.$('#id_selector');

获取元素后,可以使用 element.click() 方法模拟点击事件,或使用 element.type(text) 方法向输入框中输入文本:

await element.click();
await element.type('input_text');

如果要获取多个匹配该 selector 的元素实例列表,可以使用 page.$$() 方法来获取:

const elementList = await page.$$('.list_selector');
获取页面的数据

获取页面的数据可以使用 page.evaluate() 方法,该方法会在浏览器上下文中执行提供的函数,并将结果序列化为 JavaScript 值。该函数的返回值可以是任何 Serializable 类型,例如数字、字符串、布尔值、对象或数组。

例如,获取页面标题:

const title = await page.evaluate(() => {
  return document.title;
});
保存截图或 PDF

如果需要将页面以截图或 PDF 的形式保存,可以使用 page.screenshot() 方法或 page.pdf() 方法,并传入选项参数进行设置。

例如,将页面以 PNG 的形式保存:

await page.screenshot({ path: 'example.png' });
关闭浏览器

使用完 Puppeteer 之后,应该关闭浏览器实例以释放资源。

await browser.close();

以上就是使用 Puppeteer 在 Node.js 中抓取网站的一些基本操作,更多功能可以参考 Puppeteer 官方文档。