如何在使用木偶前启动它 [英] How to start launch puppeteer before using it

查看:24
本文介绍了如何在使用木偶前启动它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在做一个网络抓取项目,需要将等待时间减少到尽可能少。 因为我正在制作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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆