miércoles, 12 de abril de 2023

Programar con ChatGPT y un sacacorchos

Pues la IA sabe las respuestas pero hay que sacarlas con sacacorchos. Es una pena porque lo bonito de esto sería que cuando te diese una respuesta "pro", si hay algo que no entiendes o una característica que no conocías, le pudieses preguntar y así aprendes.

Voy a poner una conversación muy sencilla que he tenido con esta IA en la que se ve que le tengo que ir pidiendo las cosas poco a poco; eso significa que el usuario tiene que conocer las características, por lo que si el usuario no sabe, ChatGPT tampoco...


YO - puedes crearme un esqueleto de un webscraper en Node.js?

ChatGPT - ¡Claro que sí! Aquí te dejo un esqueleto básico de un web scraper en Node.js utilizando la librería cheerio para hacer el parsing del HTML:

javascript
const request = require('request'); const cheerio = require('cheerio'); const url = 'https://www.ejemplo.com'; request(url, function(error, response, html) { if (!error && response.statusCode == 200) { const $ = cheerio.load(html); // Aquí puedes utilizar la API de cheerio para buscar y extraer datos del HTML // Por ejemplo: $('h1').each(function(i, element) { console.log($(this).text()); }); } });

Este esqueleto utiliza la librería request para hacer una petición HTTP GET al sitio web especificado en la variable url, y luego utiliza cheerio para hacer el parsing del HTML y buscar los elementos que deseas extraer.

Ten en cuenta que este es solo un esqueleto básico y deberás adaptarlo a tus necesidades específicas. Además, ten en cuenta que algunos sitios web pueden bloquear o limitar las peticiones de web scraping, por lo que debes tener cuidado de no violar los términos de servicio o las políticas de uso de los sitios web que visites.


YO - puedes hacerlo asíncrono?

ChatGPT - ¡Por supuesto! Aquí te dejo el mismo esqueleto, pero utilizando la versión asincrónica de request y cheerio:

javascript
const request = require('request-promise-native'); const cheerio = require('cheerio'); const url = 'https://www.ejemplo.com'; (async function() { try { const html = await request(url); const $ = cheerio.load(html); // Aquí puedes utilizar la API de cheerio para buscar y extraer datos del HTML // Por ejemplo: $('h1').each(function(i, element) { console.log($(this).text()); }); } catch (error) { console.error(error); } })();

Este esqueleto utiliza la versión asincrónica de request llamada request-promise-native para hacer la petición HTTP GET y retorna una promesa que puede ser manejada con async/await. Luego utiliza cheerio de la misma manera para hacer el parsing del HTML y buscar los elementos que deseas extraer.

Ten en cuenta que, al igual que con la versión síncrona, algunos sitios web pueden bloquear o limitar las peticiones de web scraping, por lo que debes tener cuidado de no violar los términos de servicio o las políticas de uso de los sitios web que visites.


YO - como puedo hacer 100 llamadas asíncronas en Node.js dividas en lotes de 10?

ChatGPT - Para hacer 100 llamadas asincrónicas divididas en lotes de 10 en Node.js, puedes utilizar Promise.all() en conjunción con Array.slice() para dividir el arreglo de llamadas en lotes de 10 y luego enviar cada lote en una llamada separada de Promise.all(). Aquí te dejo un ejemplo de cómo podrías hacerlo:

javascript
async function makeCalls() { // Creamos un arreglo con las 100 llamadas asincrónicas que deseamos hacer const calls = Array.from({ length: 100 }, (v, i) => makeAsyncCall(i)); // Dividimos el arreglo de llamadas en lotes de 10 y enviamos cada lote en una llamada separada de Promise.all() const batches = []; for (let i = 0; i < calls.length; i += 10) { const batch = calls.slice(i, i + 10); batches.push(batch); } for (const batch of batches) { const results = await Promise.all(batch); console.log(results); } } async function makeAsyncCall(index) { // Aquí iría tu llamada asincrónica, por ejemplo: const result = await someAsyncFunction(index); return result; }

En este ejemplo, creamos un arreglo con las 100 llamadas asincrónicas que deseamos hacer. Luego, dividimos ese arreglo en lotes de 10 utilizando un bucle for y la función Array.slice(), y enviamos cada lote en una llamada separada de Promise.all(). Finalmente, imprimimos los resultados de cada llamada en la consola.

Ten en cuenta que, dependiendo del tipo de llamadas asincrónicas que estés haciendo, es posible que necesites ajustar el código para manejar errores, timeouts, etc.

YO - ¿no sería mejor usar una función generadora para los batches y poder ahorrarnos tener que crear otro array de batches en memoria?

ChatGPT - Sí, puedes utilizar una función generadora para crear los lotes de llamadas asincrónicas en Node.js sin tener que crear un array adicional en memoria. Aquí te dejo un ejemplo de cómo podrías hacerlo:

javascript
async function makeCalls() { const calls = Array.from({ length: 100 }, (v, i) => makeAsyncCall(i)); const batchSize = 10; for await (const batch of batchGenerator(calls, batchSize)) { const results = await Promise.all(batch); console.log(results); } } async function* batchGenerator(iterable, batchSize) { for (let i = 0; i < iterable.length; i += batchSize) { yield iterable.slice(i, i + batchSize); } } async function makeAsyncCall(index) { // Aquí iría tu llamada asincrónica, por ejemplo: const result = await someAsyncFunction(index); return result; }

En este ejemplo, creamos un arreglo con las 100 llamadas asincrónicas que deseamos hacer y un tamaño de lote de 10. Luego, creamos una función generadora llamada batchGenerator que toma el arreglo de llamadas asincrónicas y el tamaño de lote como argumentos, y devuelve los lotes de llamadas utilizando un bucle for y la función Array.slice(). Finalmente, utilizamos un bucle for await para iterar sobre los lotes de llamadas generados por batchGenerator y ejecutamos Promise.all() en cada lote para obtener los resultados de cada llamada asincrónica.

Ten en cuenta que, al igual que en el ejemplo anterior, es posible que necesites ajustar el código para manejar errores, timeouts, etc. dependiendo del tipo de llamadas asincrónicas que estés haciendo.

2 comentarios:

  1. No sé que versión de ChatGPT estás usando, imagino que la 3.5 que es de acceso libre. Dicen que la versión 4, que va por suscripción de pago, mejora sensiblemente a su predecesora (creo que hay alguna web donde te dejan probarla con un número limitado de consultas). Es cualquier caso, incluso con sus limitaciones, a mi me parece una pasada... y creo que esto sólo está empezando (lo que a decir verdad da un poco de miedillo (·_·))

    ResponderEliminar
    Respuestas
    1. No me malinterpretes. Es una pasada; solo estoy un poco... decepcionado por no poder aprender del código que me da la IA.

      Eliminar