如何在 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();
})();
输出:
{ ‘Boston Bruins’: ’36’, ‘Buffalo Sabres’: ’31’, ‘Calgary Flames’: ’31’, ‘Chicago Blackhawks’: ’36’,
‘Detroit Red Wings’: ’34’, ‘Edmonton Oilers’: ’37’, ‘Hartford Whalers’: ’31’, ‘Los Angeles Kings’: ’46’,
‘Minnesota North Stars’: ’27’, ‘Montreal Canadiens’: ’39’, ‘New Jersey Devils’: ’32’, ‘New York Islanders’: ’25’,
‘New York Rangers’: ’36’, ‘Philadelphia Flyers’: ’33’, ‘Pittsburgh Penguins’: ’41’, ‘Quebec Nordiques’: ’16’,
‘St. Louis Blues’: ’47’, ‘Toronto Maple Leafs’: ’23’, ‘Vancouver Canucks’: ’28’, ‘Washington Capitals’: ’37’,
‘Winnipeg Jets’: ’26’}