【发布时间】:2019-03-29 12:15:14
【问题描述】:
我正在使用 express 来显示使用 puppeteer 进行网络抓取的结果,但我遇到了性能问题。
我多次调用刮板文件,因为我想一次获得多个结果。
例如:
const express = require('express')
const app = express()
const scraper = require('./scrapers/scraper.js');
app.get('/getResults', function(req, res, next) {
const url = 'http://www.example.com';
const val1 = new Promise((resolve, reject) => {
scraper
.getPrice(results, url, nights)
.then(data => {
resolve(data)
})
.catch(err => reject('Medium scrape failed'))
})
const url = 'http://www.example.com';
const val2 = new Promise((resolve, reject) => {
scraper
.getPrice(results, url, nights)
.then(data => {
resolve(data)
})
.catch(err => reject('Medium scrape failed'))
const url = 'http://www.example.com';
const val3 = new Promise((resolve, reject) => {
scraper
.getPrice(results, url, nights)
.then(data => {
resolve(data)
})
.catch(err => reject('Medium scrape failed'))
const url = 'http://www.example.com';
const val4 = new Promise((resolve, reject) => {
scraper
.getPrice(results, url, nights)
.then(data => {
resolve(data)
})
.catch(err => reject('Medium scrape failed'))
Promise.all([val1, val2, val3, val4])
.then(data => {
console.log(data)
})
.catch(err => res.status(500).send(err))
}
上面的代码会一次调用scraper.js 文件4次,但是我应该怎么做才能在前一个完成后调用每个文件呢?我的意思是,当 val1 完成后,它应该运行 val2 等等。
事实上,我的代码调用了刮板文件 18 次,这对计算机性能不利,因为 puppeteer 是基于 Chromium 的,它实际上一次打开一个新的 Chromium 实例 18 次。
当我运行它时,我什至得到了这个错误:
(node:26600) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 exit listeners added. Use emitter.setMaxListeners() to increase limit
【问题讨论】: