Как начать запуск кукловода перед его использованием - PullRequest
0 голосов
/ 08 февраля 2020

В настоящее время я работаю над проектом очистки веб-страниц, и мне нужно как можно меньше сократить время ожидания. Так как я делаю спокойный API, я хочу запустить кукловод, прежде чем кто-то сделает запрос. Таким образом, я надеюсь, что 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'))

Надеюсь, что это в некоторой степени демонстрирует мою цель.

1 Ответ

1 голос
/ 08 февраля 2020

Ты рядом. Попробуйте изменить функцию 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();
        // ...

и удалите await browser.close() с конца getInfo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...