i have this code to scrap a website, but in my computer it runs really slow, can someone with some more experiencia can tell me what am i doing wrong? I´m using puppeteer in js, this is a page of real state in mexico, so probably you’ll need to understand a little bit of spanish, I tried to use the network in the inspector but i don´t find any call to an api that is usefull for the info i need
const mysql = require('mysql2');
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
function delay(time) {
return new Promise(function(resolve) {
setTimeout(resolve, time)
});
}
async function createInmueble(page, info){
return await page.evaluate((info) => {
let inmueble = {};
inmueble.titulo = info.title;
inmueble.precios = info?.priceOperationTypes?.[0]?.prices?.[0]?.amount.toString() || document.querySelector(".price-items").firstElementChild.textContent.trim().split(" ")[1];
inmueble.moneda = info?.priceOperationTypes?.[0]?.prices?.[0]?.isoCode || document.querySelector(".price-items").firstElementChild.textContent.trim().split(" ")[0];
inmueble.inmobiliaria = info?.publisher?.name || null;
inmueble.tipo = info?.realEstateType?.name || null;
inmueble.estado = info?.postingLocation?.location?.parent?.parent?.name || null;
inmueble.municipio = info?.postingLocation?.location?.parent?.name || null;
inmueble.zona = info?.postingLocation?.location?.name || null;
inmueble.latitud = info?.postingLocation?.postingGeolocation?.geolocation?.latitude.toString() || null
inmueble.longitud = info?.postingLocation?.postingGeolocation?.geolocation?.longitude.toString() || null
inmueble.imagenes = info?.pictures?.map(picture => picture.url1200x1200) || null;
inmueble.metros_totales = info?.mainFeatures?.CFT100?.value || "0";
inmueble.metros_construidos = info?.mainFeatures?.CFT101?.value || "0";
inmueble.banios = info?.mainFeatures?.CFT3?.value || "0";
inmueble.estacionamientos = info?.mainFeatures?.CFT7?.value || "0";
inmueble.recamaras = info?.mainFeatures?.CFT2?.value || "0";
inmueble.antiguedad = info?.mainFeatures?.CFT5?.value || "0";
inmueble.medio_banio = info?.mainFeatures?.CFT4?.value || "0";
inmueble.direcciones = info?.postingLocation?.address?.name || null;
inmueble.new_latitud = inmueble?.latitud || null;
inmueble.new_longitud = inmueble?.longitud || null;
inmueble.url = info?.seoAttributes?.canonical || null;
inmueble.telefono = info?.whatsApp;
inmueble.nombre_asesor = null;
inmueble.email = null;
return inmueble;
}, info);
}
async function getInfoInmueble(page){
console.log(page.url());
const info = await page.evaluate(() => {
return POSTING;
});
return info;
}
async function scopeEnlaces(page, enlaces){
let info;
let inmuebles = [];
for(const enlace of enlaces){
try{
await page.goto(enlace);
info = await getInfoInmueble(page);
const inmueble = await createInmueble(page, info);
inmuebles.push(inmueble);
}
catch(err){
console.error("error", enlace);
}
}
return inmuebles;
}
async function getEnlaces(page){
const enlaces = await page.evaluate(() => {
try{
let div_padre = document.querySelector(".postings-container");
const div_hijo = Array.from(div_padre.children);
const enlaces = div_hijo.map(div => {
const link_base = "https://www.vivanuncios.com.mx";
const div_enlace = div.firstElementChild;
const enlace = div_enlace.getAttribute("data-to-posting");
return link_base+enlace;
}).filter(enlace => enlace !== null);
return enlaces;
}
catch(err){
console.log("Error en page:", err);
return [];
}
});
return enlaces;
}
async function getInmuebles(page, url) {
await page.goto(url);
const enlaces = await getEnlaces(page);
return await scopeEnlaces(page, enlaces);
}
async function postInmueble(inmueble){
let query = `INSERT INTO inmueblesvivanuncio (titulo, precios, moneda, inmobiliaria, tipo, estado, municipio, zona, latitud, longitud, imagenes, metros_totales, metros_construidos, banios, estacionamientos, recamaras, antiguedad, medio_banio, direcciones, new_latitud, new_longitud, url, telefono, nombre_asesor, email) VALUES ('${inmueble.titulo}', '${inmueble.precios}', '${inmueble.moneda}', '${inmueble.inmobiliaria}', '${inmueble.tipo}', '${inmueble.estado}', '${inmueble.municipio}', '${inmueble.zona}', '${inmueble.latitud}', '${inmueble.longitud}', '${JSON.stringify(inmueble.imagenes)}', '${inmueble.metros_totales}', '${inmueble.metros_construidos}', '${inmueble.banios}', '${inmueble.estacionamientos}', '${inmueble.recamaras}', '${inmueble.antiguedad}', '${inmueble.medio_banio}', '${inmueble.direcciones}', '${inmueble.new_latitud}', '${inmueble.new_longitud}', '${inmueble.url}', '${inmueble.telefono}', '${inmueble.nombre_asesor}', '${inmueble.email}')`;
connection.query(query, (error, results, fields) => {
if (error){
console.log("error", error);
}
else{
console.log('Fila insertada con éxito');
}
});
}
async function scopeInmuebles(all_inmuebles){
await all_inmuebles.forEach(async inmueble => {
try{
await postInmueble(inmueble);
}
catch(err){
console.error("surgio un error");
}
});
}
async function getBotonSiguiente(page){
const boton = await page.evaluate(() => {
const boton = document.querySelector(".sc-n5babu-2.kNwjYM");
if(boton){
return true;
}
return false;
});
return boton
}
async function scanPage(page){
const BASE_URL = 'https://www.vivanuncios.com.mx/s-casas-en-venta';
let estado = "chihuahua";
let i = 16;
let all_inmuebles = [];
let boton;
do{
let url = `${BASE_URL}/${estado}/page-${i}`;
console.log("Pagina nueva: ", url, "n");
const inmuebles = await getInmuebles(page, url);
all_inmuebles = all_inmuebles.concat(inmuebles);
await page.goto(url);
if(i%5 == 0){
await scopeInmuebles(all_inmuebles);
all_inmuebles = [];
}
boton = await getBotonSiguiente(page);
if (boton) {
i++;
} else {
console.log("No hay boton");
await scopeInmuebles(all_inmuebles);
}
} while(boton && i <= 1000);
return all_inmuebles;
}
async function scrapeo(){
const browser = await puppeteer.launch({headless: false, executablePath: "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"});
const page = await browser.newPage();
const inmuebles = await scanPage(page);
await browser.close();
return inmuebles;
}
async function main(){
const all_inmuebles = await scrapeo();
connection.end();
}
const connection = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: 'CocacolA&_2016',
database: 'InmobiliariaPrueba'
});
connection.connect();
main();
I have try concurrency but it just makes it slower