📅  最后修改于: 2023-12-03 15:38:21.912000             🧑  作者: Mango
Puppeteer 是一个 Node.js 库。它提供了一个高级别的 API,用于通过 Headless Chrome 浏览器自动化任务。因此,它可以用来实现网站的爬虫等自动化任务。
首先,需要安装 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 的形式保存,可以使用 page.screenshot()
方法或 page.pdf()
方法,并传入选项参数进行设置。
例如,将页面以 PNG 的形式保存:
await page.screenshot({ path: 'example.png' });
使用完 Puppeteer 之后,应该关闭浏览器实例以释放资源。
await browser.close();
以上就是使用 Puppeteer 在 Node.js 中抓取网站的一些基本操作,更多功能可以参考 Puppeteer 官方文档。