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

📅  最后修改于: 2022-05-13 01:56:35.939000             🧑  作者: Mango

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

Puppeteer 是一个 Node.js 库,它提供了一个高级 API 来通过 DevTools 协议控制无头 Chrome 或 Chromium。它允许在无头/有头浏览器上自动化、测试和抓取网页。

安装 Puppeteer:要使用 puppeteer,您必须安装 Node.js。然后,可以使用 npm 包管理器在命令行中安装 Puppeteer。

npm install puppeteer

使用 Puppeteer:可以使用以下命令将 Puppeteer 库导入到您的脚本中:

const puppeteer = require('puppeteer');

重要的是要记住 Puppeteer 是一个基于 Promise 的库,它对无头 Chrome 实例执行异步调用。因此,我们将其包装在异步包装器中。这意味着代码会立即执行。

这是一个截取页面截图的简单示例:

Javascript
import Puppeteer
const puppeteer = require('puppeteer');
 
(async () => {
    const browser = await puppeteer.launch();
     
    // Open new page in headless browser
    const page = await browser.newPage();
     
    // To visit page in browser
    await page.goto('https://scrapethissite.com');
     
    // Save Screenshot at Path
    await page.screenshot({path: 'screenshot.png'});
   
      // Close our browser instance
    await browser.close();
  })();


Javascript
const puppeteer = require('puppeteer');
 
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://scrapethissite.com/pages/forms/');
 
    const textsArray = await page.evaluate(
        () => [...document.querySelectorAll(
            '#hockey > div > table > tbody > tr > td.name')]
            .map(elem => elem.innerText)
    );
    const WinArray = await page.evaluate(
        () => [...document.querySelectorAll(
            '#hockey > div > table > tbody > tr > td.wins')]
            .map(elem => elem.innerText)
    );
    var result = {};
    textsArray.forEach((textsArray, i) =>
        result[textsArray] = WinArray[i]);
    console.log(result);
    await browser.close();
})();



运行您的代码:将您的代码保存为 JavaScript 文件并使用以下命令在命令行中运行它 -

node filename.js

示例:以下代码返回一个带有 NHL 曲棍球队名称和当年获胜次数的对象,

Javascript

const puppeteer = require('puppeteer');
 
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://scrapethissite.com/pages/forms/');
 
    const textsArray = await page.evaluate(
        () => [...document.querySelectorAll(
            '#hockey > div > table > tbody > tr > td.name')]
            .map(elem => elem.innerText)
    );
    const WinArray = await page.evaluate(
        () => [...document.querySelectorAll(
            '#hockey > div > table > tbody > tr > td.wins')]
            .map(elem => elem.innerText)
    );
    var result = {};
    textsArray.forEach((textsArray, i) =>
        result[textsArray] = WinArray[i]);
    console.log(result);
    await browser.close();
})();


输出: