如何在使用木偶前启动它 [英] How to start launch puppeteer before using it
本文介绍了如何在使用木偶前启动它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我目前正在做一个网络抓取项目,需要将等待时间减少到尽可能少。 因为我正在制作REST风格的API,所以我想在有人提出请求之前启动Pupeteer。 这样,我希望Chrome已经启动,这可能会节省很多时间。
但是,我对节点不是很有经验,可能需要一些帮助。下面的代码不起作用,但在某种程度上说明了我尝试处理的内容。const puppeteer = require('puppeteer');
var readlineSync = require('readline-sync');
var x = undefined;
var browser = async () => {
x = await puppeteer.launch();
if (x != null){
resolve(return x);
}
else{
reject(console.log('failed promise'));
}
}
exports.getInfo = (url) => {
return new Promise(async (resolve, reject) => {
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
await page.keyboard.press('Escape');
await page.keyboard.press('PageDown');
await page.keyboard.press('PageDown');
await page.waitForXPath("//div[starts-with(@class, 'detail-desc-decorate-')] | //p[starts-with(@class, 'detail-desc-decorate-')] | //div[@id='product-description']//p");
let data = await page.evaluate(() => {
let images = [];
for (i = 0; i < document.querySelectorAll('div.images-view-item > img').length; i++) {
link = document.querySelectorAll('div.images-view-item > img')[i].src;
images[i] = link;
}
var json = JSON.stringify({
title: document.querySelector('div.product-title').innerText,
description: document.querySelector('div[id=product-description]').innerText,
price: document.querySelector('div.product-price-current').innerText,
productOption: document.querySelector('div.product-sku').innerHTML,
//shippingCost: document.querySelector('div.product-shipping-price').innerText,
//deliviryDate: document.querySelector('span.product-shipping-delivery > span').innerText,
mainImage: document.querySelector('img.magnifier-image').src,
images: images
});
return json
})
await browser.close();
if (data != null) {
resolve(console.log('yay'));
} else {
reject(console.log('failed promise'));
}
})
}
browser().then(console.log(x)).catch(console.log('something went horribly wrong'))
希望这在一定程度上证明了我的目标。
推荐答案
您已接近。尝试将browser
函数更改为以下内容,以便它只启动一次:
let browser;
const launchBrowser = async () => {
if (browser) return;
browser = await puppeteer.launch();
};
然后在getInfo
中等待启动(除第一次外将立即启动):
exports.getInfo = (url) => {
return new Promise(async (resolve, reject) => {
await launchBrowser();
const page = await browser.newPage();
// ...
并从getInfo
末尾删除await browser.close()
。
这篇关于如何在使用木偶前启动它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文