+

// 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"

Miniejercicios

Crea un script el cual recibe un parámetro.  El parámetro será una frase y tu script escribirá en consola el número de apariciones de cada carácter distinto dentro de la frase. 

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

index.js: "e: 2, s: 3, t:1, a: 3, l: 1, f: 1, r:1"

Pista de una posible solución: usar un objeto como diccionario

Y método Object.keys( )

Miniejercicios

Investiga como recoger por la consola lo que el usuario introduzca (pista: process.stdin). Modifica el ejercicio anterior para que el usuario pueda seguir introduciendo frases y se vayan acumulando los resultados

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

index.js: "e: 2, s: 3, t:1, a: 3, l: 1, f: 1, r:1"
 index.js: "Introduce otra frase"

Usuario : "otra"
index.js: "e: 2, s: 3, t:2, a: 4, l: 1, f: 1, r:2"

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

Miniejercicios

Modifica el código anterior de manera que si el usuario introduce el flag --novocals no se tengan en cuenta las vocales

Recuerda el módulo minimist

Miniejercicios

Modifica el código anterior de manera que si el usuario introduce el flag --onlywords se cuentan las apariciones de las distintas palabras

MÁS MÓDULOS !

http

request

axios

EJEMPLO

var request = require('request');
var urlPhotos = 'https://jsonplaceholder.typicode.com/photos';

request.get(urlPhotos, (err, res, body) => {
    console.log(typeof body); // string
    const copy = JSON.parse(body);
    console.log(typeof copy); // object
    const only10 = copy.slice(0,10);
    console.log(only10); // Array[{},{},...]
})

EJEMPLO

var request = require('request');
var urlPhotos = 'https://jsonplaceholder.typicode.com/photos';

request.get(urlPhotos, (err, res, body) => {

    if (err) {
        console.log(`Error con código ${err.code}`);
    }else{

    }
})

EJEMPLO

var request = require('request');
var urlPhotos = 'https://jsonplaceholder.typicode.com/photos';

request.get(urlPhotos, (err, res, body) => {

    console.log(typeof res); // object
    console.log(res.headers); // Headers
    console.log(res.statusCode); // 200
    console.log(res.body); // Same to body

})

EJEMPLO

var request = require('request');
var urlPhotos = 'https://jsonplaceholder.typicode.com/photos';

request.get(urlPhotos, (err, res, data) => {

    console.log(typeof data); // string

    const copy = JSON.parse(data);
    console.log(typeof copy); // object

    const only10 = copy.slice(0,10);
    console.log(only10); // Array[{},{},...]

})

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 mediamarkt.

 

Desde node realiza una petición get a la categoría de smartphones de mediamarkt y devuelve por consola el número de smartphones que tienen disponible en total

EJERCICIO 

Esta vez vamos a extraer todos los smartphones de la página.

 

Crea un array con los datos de los distintos smartphones que te encuentres en la primera página de la categoría smartphones. Haz de recoger mínimo nombre, foto, descripción y precio

¡ 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!

SIGAMOS

Esta vez vamos a extraer todos los portátiles.

 

Investiga (jugando con la web) como se crean las distintas urls para llegar a la siguiente página y extrae desde la primera hasta la última página todos los smartphones.

 

HAZ LAS PETICIONES DE UNA EN UNA Y ESPERA AL MENOS 250 MILISEGUNDOS ANTES DE HACER LA SIGUIENTE PETICIÓN

 

Ten mucho cuidado MUCHO CUIDADO mucho cuidado con los bucles y las peticiones que hagas, ojo con ser baneado y hacer excesivas peticiones

¡consejo!

Métodos cortos :

obtenerPagina(indice)

extraerDatos(html)

 

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!

mini EJERCICIO

Crea un proyecto nuevo, carpeta en blanco y preparar nodejs para funcionar.

 

Descárga como un fichero .json lo que hay en esta url https://jsonplaceholder.typicode.com/posts

 

Ahora haz un script en nodejs que sea capaz de leer el fichero y mostrar solo las publicaciones del usuario con el id = 4.

 

Modifícalo para indicar mediante la opción --id NUMERO el id del usuario del apartamento que quieres visualizar

Modifícalo para que guarde en un fichero a parte los resultados

EJERCICIO

Modificando el ejercicio del web scraping de los portátiles de mediamarkt. 

 

Añádele a dicho script la posibilidad de guardar los smartphones en un fichero de resultados.

Si el usuario no introduce nada por defecto guárdalo en la carpeta output/smartphones .json

Haz que el usuario pueda introducir el parámetro --outputpath "lo/quiero/aqui" para especificar donde se van a guardar los datos

ULTIMO EJERCICIO CON NODEJS

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

PERO ANTES ....

Por cierto .. este será en grupos para que lo hagan guay y con git

primer miniproyecto

nOS PONEMOS EN GRUPOS DE 4

¡ 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