+
// Estamos en un fichero js
// Pero esta vez lo ejecutamos
// En el servidor
console.log('Hello World');
node server.js
En una terminal
function generarNumeroAleatorio(min=0,max=100){
return Math.round(Math.random() * (max - min) + min);
}
console.log(generarNumeroAleatorio())
server.js
Ejecutado desde la terminal
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
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"
Primero nos aseguramos tener un package.json creado o en caso de que no ejecutamos un
NPM INIT en la terminal en nuestro proyecto
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());
});
npm init
npm i lodash moment
MÁS MÓDULOS !
http
request
axios
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
})
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
})
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
})
document.getElementById('pepe');
Antes:
$('#pepe');
Ahora:
$('.list .item.product').html();
$('.list .item.product').text();
$('.list .item.product').val();
Hagamos web scraping a la website de hackernews/jobs
Saca un array de ofertas con todas las que hay en la primera página.
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"
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))
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))
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))
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);
});
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
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);
});
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
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();
ES6
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);
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
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
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);
})
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
YA MAÑANA EMPEZAREMOS A CREAR NUESTRA PRIMERA API RESTFUL CON NODE+EXPRESSJS
¡ No te tires a la piscina a picar código del tirón !
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
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
TELEGRAM-BOT
SMS CON TWILLIO
SLACK
¡busca en google! "How to send email from nodejs" , "How to send slack msg from node", etc etc etc