Puppeteer: Implementación de proyecto NestJS

[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]

Implementación de un proyecto NestJS de WebScrapping (Puppeteer) en AWS Lambda

Puppeteer — Después de algunos meses de intentar ejecutar un proyecto de web scrapping de NestJs dentro de un AWS Lambda, finalmente obtuve la solución.

Estaba usando https://github.com/adieuadieu/serverless-chrome, así que noté que AWS por defecto no tiene fuentes del sistema, necesitaba configurarlo manualmente. Por eso, estaba teniendo este problema:

 

2022–04–13T13:04:46.622Z 9b8249dc-60ad-560c-a06f-130cac3fd345 INFO @serverless-chrome/lambda: Error trying to spawn chrome: Error: connect ECONNREFUSED 127.0.0.1:9222 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16) { errno: ‘ECONNREFUSED’, code: ‘ECONNREFUSED’, syscall: ‘connect’, address: ‘127.0.0.1’, port: 9222}

 

[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]


DevTools listening on ws://127.0.0.1:9222/devtools/browser/b3db09ab-4250-4c63-be21-07eb1eeefa3d
[0413/133945.501862:FATAL:platform_font_skia.cc(97)] Check failed: InitDefaultFont(). Could not find the default font

Para saber más sobre el error lo publiqué aquí:

https://github.com/adieuadieu/serverless-chrome/issues/335

Después de un tiempo de búsqueda, finalmente pude encontrar otra solución, necesitaba usar “chrome-aws-lambda”, esta biblioteca ya tiene configuradas las fuentes del sistema, lo que puede ser un acceso directo a nuestro trabajo. Asumiré que ya tienes un titiritero en tu proyecto.

Para instalar necesitas ejecutar:

 

npm install chrome-aws-lambda — save-prod

 

Creé este tutorial con dos formas de usar Puppeteer, usando el titiritero puro o usando el titiritero extra (¿Cuál es el mejor? Depende de cuál sea tu propósito).

1 — Si usas Titiritero puro puedes usar el siguiente código:

const chromium = require('chrome-aws-lambda');

exports.handler = async (event, context, callback) => {
  let result = null;
  let browser = null;

  try {
    browser = await chromium.puppeteer.launch({
      args: chromium.args,
      defaultViewport: chromium.defaultViewport,
      executablePath: await chromium.executablePath,
      headless: chromium.headless,
      ignoreHTTPSErrors: true,
    });

    let page = await browser.newPage();

    await page.goto(event.url || 'https://example.com');

    result = await page.title();
  } catch (error) {
    return callback(error);
  } finally {
    if (browser !== null) {
      await browser.close();
    }
  }

  return callback(null, result);
};

2 — Si usa Puppeteer Extra para tener complementos, puede usar el siguiente código:

const chromium = require('chrome-aws-lambda');
 const { PuppeteerExtra } = require('puppeteer-extra');
 
 exports.handler = async (event, context, callback) => {
   let result = null;
   let browser = null;
 
   try {
     const puppeteerExtraInstance = new PuppeteerExtra(chromium.puppeteer, undefined);
     puppeteerExtraInstance.use(pluginXYZ);
     
     browser = await puppeteerExtraInstance.launch({
       args: chromium.args,
       defaultViewport: chromium.defaultViewport,
       executablePath: await chromium.executablePath,
       headless: chromium.headless,
       ignoreHTTPSErrors: true,
     });
 
     let page = await browser.newPage();
 
     await page.goto(event.url || 'https://example.com');
 
     result = await page.title();
   } catch (error) {
     return callback(error);
   } finally {
     if (browser !== null) {
       await browser.close();
     }
   }
 
   return callback(null, result);
 };

Uno de estos códigos antes garantizará que tiene cromo y un titiritero con fuentes del sistema y se lanzará en AWS Lambda.

Si obtiene algo como la imagen de arriba, su web scrapping dentro de lambda se estará ejecutando:

Puppeteer


¡Espero que esto ayude!

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]

Diego Pacheco

Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Recent Post

[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]