+

// Estamos en un fichero js
// Pero esta vez lo ejecutamos
// En el servidor

console.log('Hello World');

server.js

node server.js

En una terminal

SCRIPTING

ejEMPLO

function generarNumeroAleatorio(min=0,max=100){
    return Math.round(Math.random() * (max - min) + min);
}

console.log(generarNumeroAleatorio())

server.js

Ejecutado desde la terminal

ejEMPLO pasando parámetros

function generarNumeroAleatorio(min=0,max=100){
    const min_int = +min;
    const max_int = +max;
    return Math.round(Math.random() * (max_int - min_int) + min_int);
}
const minUsuario = process.argv[2];
const maxUsuario = process.argv[3];

console.log(generarNumeroAleatorio(minUsuario,maxUsuario));

server.js

Ejecutado desde la terminal

Miniejercicios

Crea un script el cual recibe dos parámetros, el primero es una frase y el segundo será un carácter o una palabra a buscar. Tu script escribirá en consola el número de apariciones. 

Ejemplo : node index.js "Esta es la frase" a

index.js: "El número de apariciones de 'a' es 3"

mÓDULOS

mÓDULOS

Primero nos aseguramos tener un package.json creado o en caso de que no ejecutamos un

NPM INIT en la terminal en nuestro proyecto

EJEMPLO

var moment = require('moment');
var _ = require('lodash');

var fechas = [ 1520711483186, 1520781485186,
               1520781485186, 1520781485186,
               1520714473186 ];
var unicas = _.uniq(fechas);

unicas.forEach( fecha => {
    console.log(moment(fecha).fromNow());
});

RECUERDA

npm init

 

npm i lodash moment

PARA HACER SCRIPTING DEL BOMBI

LIBRERIA GUAY PARA LAS FECHAS 

package.json

MÁS MÓDULOS !

http

request

axios

Haciendo web scraping

EJEMPLO

var axios = require('axios');
var urlWeb = 'https://www.mediamarkt.es/es/category/_port%C3%A1tiles-701175.html';

axios.get(urlWeb).then(response => {

    console.log(typeof response.data); // string

})

EJEMPLO

var axios = require('axios');
var urlWeb = 'https://www.mediamarkt.es/es/category/_port%C3%A1tiles-701175.html';
axios.get(urlWeb).then(response => {
    console.log(typeof response.data); // string

    const posBodyInit = response.data.indexOf('<body') ;
    const posBodyEnd = response.data.indexOf('</body>') ;
    const aux = response.data.substring(posBodyInit,posBodyEnd);

    console.log(typeof aux) // string :O

})

EJEMPLO

var axios = require('axios');
var cheerio = require('cheerio');

var urlWeb = 'https://airbnb.com';

axios.get(urlWeb).then(response => {

    var $ = cheerio.load(response.data);

    console.log($('.casa')); // :O So Sexy
})

Manipular el HTML con Jquery

document.getElementById('pepe');

Antes:

$('#pepe');

Ahora:

Leer del DOM

$('.list .item.product').html();

$('.list .item.product').text();

$('.list .item.product').val();

¡ Jquery es muy grande!

EJERCICIO SUAVE

Hagamos web scraping a la website de hackernews/jobs

 

Saca un array de ofertas con todas las que hay en la primera página.

 

EJERCICIO SUAVE

Hagamos web scraping a la website de hackernews/jobs

 

Saca un array de ofertas con todas las que hay en la primera página.

 

Obtén en otro array aquellas que tengan alguna de estas palabras en el texto :

"front" "front end" "frontend" "javascript" "js" "angular"

 

¡ Repasemos, asincronia ! 

Promesas

function dameLaInfo(){

    return new Promise((resolve, reject) => {

        setTimeout(() => {
            if( false ){
                reject('No te envío nada');
            }else{
                resolve({nombre: 'Fulano', email: 'fulano@fu.com'});
            }
        }, 3000);

    });

}

dameLaInfo().then(info => console.log(info))

Promesas

function dameLaInfo(){

    return new Promise((resolve, reject) => {

        setTimeout(() => {
            if( false ){
                reject('No te envío nada');
            }else{
                resolve({nombre: 'Fulano', email: 'fulano@fu.com'});
            }
        }, 3000);

    });

}

dameLaInfo().then(info => console.log(info))

Promesas

function dameLaInfo(){

    return new Promise((resolve, reject) => {

        setTimeout(() => {
            if( false ){
                reject('No te envío nada');
            }else{
                resolve({nombre: 'Fulano', email: 'fulano@fu.com'});
            }
        }, 3000);

    });

}

dameLaInfo().then(info => console.log(info))

Promesas

function dameLaInfo(error){
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if(error){
                reject('No te envío nada');
            }else{
                resolve({nombre: 'Fulano', email: 'fulano@fu.com'});
            }
        }, 3000);
    });
}

// Si cambiamos el parámetro se resolverá 
// o se rechazará la promesa

dameLaInfo(true)
    .then(response => {
        console.log(`Me ha llegado como respuesta ${response}`);
    })
    .catch(err => {
        console.log(err);
    });

MULTIPLES PROMESAS

recuerda

Que un get es asíncrono, y con axios o con jquery es una promesa

var axios = require('axios')
var urlInfo = "https://jsonplaceholder.typicode.com/users/2";

function buscarInfoUsuario(){
    axios.get(urlInfo)
        .then(user => {
            console.log('La info ya llegó');
            return user.data;
        });
}

buscarInfoUsuario().then(user => {
    console.log('Recojo la info');
    console.log(user);
});

hay un error en esta diapo

recuerda

Que un get es asíncrono, y con axios o con jquery es una promesa

var axios = require('axios')
var urlInfo = "https://jsonplaceholder.typicode.com/users/2";

function buscarInfoUsuario(){

    return axios.get(urlInfo)
            .then(user => {
                console.log('La info ya llegó');
                return user.data;
            });
}

buscarInfoUsuario().then(user => {
    console.log('Recojo la info');
    console.log(user);
});

Promesas

Hacemos varias peticiones para pedir distintos datos de un usuario.

var user = {};

//Dos promesas
getTwitterProfile()
    .then( TWProfile => user.TWprofile )

getFacebookProfile()
    .then( FBProfile => user.FBProfile )

// Necesito tener las dos promesas resueltas
if (user.TWProfile && user.FBProfile ) 

Pero queremos esperar a que se cumplan las dos para poder avanzar

Promesas

Promise.all([getTwitterProfile(), getFacebookProfile()])
    .then(resultados => {
        // Cuando todas las promesas se cumplen
        // se devuelve un array de promesas
        let res1 = resultados[0];
        let res2 = resultados[1]; ...
    )
    .catch(err => {
        // En caso de que alguna falle se rechaza todo
        // y se devuelve el error de la que falló
    });
async function f1() {

  var x = await resolveAfter2Seconds(10);

  console.log(x); // 10

}


f1();
function resolveAfter2Seconds(x) { 
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

async function f1() {
  var x = await resolveAfter2Seconds(10);
  console.log(x); // 10
}
f1();

Anécdota

ES6

Desestructuración

var objeto = {
	usuario: 'Jose',
	email: 'jose@gmail.com',
	estado: 'registrado'
}

var { usuario, email, estado } = objeto;

// Jose
console.log(usuario);
// jose@gmail.com
console.log(email);
// registrado
console.log(estado);

Desestructuración

Promise.all([getTwitterProfile, getFacebookProfile])
    .then(resultados => {

        let res1 = resultados[0];
        let res2 = resultados[1];
    });

Antes

Promise.all([getTwitterProfile, getFacebookProfile])
    .then([ res1, res2 ] => {

        console.log(res1); //Es el resultado de la promesa1
        console.log(res2); //Es el resultado de la promesa2
    });

Ahora

Las variables se crearían solas

¡A trabajar otra vez!

EJERCICIO 

Extrae 5 páginas seguidas de jobs

 

Investiga como navega a la siguiente página.

 

Una vez recorras cinco páginas separa también las ofertas de frontend como en el otro

MÁS MÓDULOS

fs

lO USAMOS EN DIRECTO

METODOS

readDir

readDirSync

readFile

readFileSync

var fs = require('fs');

var fileUrl = 'data/a.json';

fs.readFile( fileUrl , (err , data ) => {
    
    if (err){
        console.log('Err', err);
        return ;
    }
    console.log(data) // A lot of shit

    var json = JSON.parse(data);
    console.log(json);

})

¡A trabajar otra vez!

EJERCICIO

Modificando el ejercicio del web scraping de  https://news.ycombinator.com/jobs 

 

Añádele a dicho script la posibilidad de filtrar por algunas palabras los resultados. Usa el módulo minimist

Guarda los resultados de las búsquedas encontradas en un fichero results.json
 

ULTIMO EJERCICIO CON NODEJS

YA MAÑANA EMPEZAREMOS A CREAR NUESTRA PRIMERA API RESTFUL CON NODE+EXPRESSJS

PERO ANTES ....

¡ OJO !

¡ No te tires a la piscina a picar código del tirón ! 

¡ SE ORIGINAL ! 

Ahora que sabes hacer web scraping. 

 

Piensa en alguna otra página que tenga contenido separado por páginas que pueda ser interesante, la que sea, como si es ... el catálogo de juegos nuevos en steam.com o el listado de una búsqueda de videos de programación en youtube

¡ A LA GUERRA !

Realiza un script para poder extraer la info de dicha página cuando lo ejecutes y lo más personalizable posible que puedas

Primer paso

RESUELVE UNA NECESIDAD REAL.

 Mezcla web scraping con otros servicios/módulos de npm de mensajería (nodemailer, twilio, telegram-bot, slack, etc) para montar una idea que gire entorno a la automatización del scrapeo de una web y por ejemplo el envío de un correo por la mañana con el reporte o cuando ejecutes el script indicandoselo por telegram o slack !

 

Dividan fuerzas, sois 4, aprovechen para dividir el problema en 4 partes, ejemplo web scraping por un lado, tratado de la info por otro y el usar un servicio de mensajería por el otro para hacer el proyecto

Segundo paso

MÓDULOS INTERESANTES

 

TELEGRAM-BOT

 

EMAIL

 

SMS CON TWILLIO

 

SLACK

¡busca en google! "How to send email from nodejs" , "How to send slack msg from node", etc etc etc

MÓDULOS INTERESANTES

NodeJS Dia 1 - Scripting & web scraping

By Yunior González Santana

NodeJS Dia 1 - Scripting & web scraping

  • 201