Кукловод замедляет выполнение облачных функций Google

#javascript #web-scraping #google-cloud-functions #chromium #puppeteer

#javascript #очистка веб-страниц #google-cloud-функции #chromium #кукловод

Вопрос:

Я использую Puppeteer в облачных функциях Google.

После нескольких тестов я заметил, что мой код занимает в среднем около 56 секунд при развертывании в инфраструктуре облачных функций Google, в то время как та же функция, протестированная локально, занимает всего 13 секунд.

index.js

 const chromium = require('chrome-aws-lambda');
const puppeteer = require('puppeteer-core');
const functions = require('firebase-functions');

exports.check = functions.https.onRequest(async (req, res) => {
    const License = req.query.License;

    browser = await puppeteer.launch({
        args: chromium.args,
        defaultViewport: chromium.defaultViewport,
        executablePath: await chromium.executablePath,
        headless: chromium.headless,
      });
    const page = await browser.newPage();

    await page.goto('http://www.example.com', {waitUntil: 'networkidle2'});
    await page.focus('#txtUserName');
    await page.keyboard.type('testUsername');
    await page.focus('#txtPassword');
    await page.keyboard.type('123123');
    await page.click('#btnLogin');
    await page.waitForSelector('#ctl00_400_header_400')
    //console.log("[✓]login successfully.")
    await page.evaluate(() => document.querySelector('#ctl00_400_header_400').click());
    await page.waitForSelector('#__tab_ctl00_ContentPlaceHolder1_tabQuickSearch_vehicleSerachClaim')
    //console.log("[✓]Enquriy page loaded successfully")
    await page.evaluate(() => document.querySelector('#__tab_ctl00_ContentPlaceHolder1_tabQuickSearch_vehicleSerachClaim').click());
    await page.waitForSelector('#ctl00_ContentPlaceHolder1_tabQuickSearch_vehicleSerachClaim_rdvehicleSearchLicense')
    //console.log("[✓]Claim section loaded successfully")
    await page.evaluate(() => document.querySelector('#ctl00_ContentPlaceHolder1_tabQuickSearch_vehicleSerachClaim_rdvehicleSearchLicense').click());
    //console.log("[✓]License tap loaded successfully")
    await page.waitForSelector('#ctl00_ContentPlaceHolder1_tabQuickSearch_vehicleSerachClaim_txtclaimSearchPersonLicNo');
    await page.focus('#ctl00_ContentPlaceHolder1_tabQuickSearch_vehicleSerachClaim_txtclaimSearchPersonLicNo');
    await page.keyboard.type(License);
    await page.evaluate(() => document.querySelector('#ctl00_ContentPlaceHolder1_tabQuickSearch_vehicleSerachClaim_btnVheicleSearchButtonClaim').click());    

    try {
        await page.waitForSelector('#ctl00_ContentPlaceHolder1_lblErrMessage')
        const textContent = await page.evaluate(() => document.querySelector('#ctl00_ContentPlaceHolder1_lblErrMessage').textContent);
        res.status(200).send( 'Result => '   textContent );
        await browser.close();
    } catch (error) {
        //console.log("The element didn't appear.")
    }    

    try {
        await page.waitForSelector('#ctl00_ContentPlaceHolder1_tabQuickSearch_vehicleSerachClaim_grdClaimDraftSp > tbody > tr:nth-child(3) > td')
        const textContent = await page.evaluate(() => document.querySelector('#ctl00_ContentPlaceHolder1_tabQuickSearch_vehicleSerachClaim_grdClaimDraftSp > tbody > tr:nth-child(3) > td').textContent);
        res.status(200).send( 'Result => '   textContent );
        await browser.close();
    } catch (error) {
        //console.log("The element didn't appear.")
    }   

});
  

Package.json

 {
    "name": "functions",
    "version": "0.0.1",
    "description": "Cloud Functions for Firebase",
    "dependencies": {
      "chrome-aws-lambda": "1.14.0",
      "firebase-functions": "2.2.0",
      "iltorb": "2.4.2",
      "puppeteer-core": "1.14.0",
      "firebase-admin": "7.2.0"
    },
    "engines": {
      "node": "8"
    },
    "private": true
  }
  

Развернуто с использованием функций Firebase с использованием NodeJS 8 и выделенных 2 ГБ памяти.

Как я могу улучшить свой код, чтобы ускорить время выполнения?

Комментарии:

1. Вы не можете сравнить облачную функцию с локальным выполнением. Сколько времени занимает запуск функции по сравнению с выполнением? Также проверьте эту проблему на github. Вы также должны измерить, какие части вашего скрипта медленные.

Ответ №1:

Я не думаю, что стоит ожидать, что любой give-код должен выполняться в облачных функциях так же быстро, как на любом современном рабочем столе, особенно на чем-то таком сложном, как Puppeteer (который, по сути, работает под управлением Chrome).

GCF выделяет только один процессор для любого данного экземпляра сервера. В нем нет графического процессора. GCF предназначен для простой работы, которая не требует больших вычислений. Настольные компьютеры часто имеют 4-8 ядер (или более) и графический процессор, который помогает Chrome быстро работать. На самом деле между этими двумя ситуациями нельзя провести никакого сравнения.

Суть в том, что для этого кода вы мало что можете сделать, чтобы ускорить его, чтобы он соответствовал возможностям рабочего стола.