UNPKG

mercadolibre-car-scraper

Version:

TypeScript-based web scraper for MercadoLibre car listings with foreign currency prices

109 lines (106 loc) 4.46 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { scrapeMercadoLibre: () => scrapeMercadoLibre }); module.exports = __toCommonJS(index_exports); // src/scraper.ts var import_chromium = __toESM(require("@sparticuz/chromium")); async function getPuppeteerAndOptions() { const isLocal = !process.env.VERCEL; let puppeteer; let launchOptions; if (isLocal) { puppeteer = await import("puppeteer"); launchOptions = { headless: true, args: ["--no-sandbox", "--disable-setuid-sandbox"] }; } else { puppeteer = await import("puppeteer-core"); launchOptions = { args: import_chromium.default.args, defaultViewport: import_chromium.default.defaultViewport, executablePath: await import_chromium.default.executablePath(), headless: "true" }; } return { puppeteer, launchOptions }; } async function scrapeMercadoLibre(producto) { if (!producto || typeof producto !== "string") { throw new Error("Producto debe ser una cadena de texto v\xE1lida"); } const { puppeteer, launchOptions } = await getPuppeteerAndOptions(); let browser = null; try { browser = await puppeteer.launch(launchOptions); const page = await browser.newPage(); const BASE_URL = "https://autos.mercadolibre.com.ar"; const query = producto.trim().replace(/\s+/g, "-"); const url = `${BASE_URL}/${query}`; const response = await page.goto(url, { waitUntil: "networkidle2", timeout: 3e4 }); if (!response?.ok()) { throw new Error(`Error al cargar la p\xE1gina: ${response?.status()}`); } await page.waitForSelector(".ui-search-layout__item", { timeout: 1e4 }); const preciosNoPesos = await page.evaluate(() => { const items = Array.from(document.querySelectorAll(".ui-search-layout__item")); const preciosFiltrados = []; items.forEach((item) => { const frontImageElem = item.querySelector(".poly-component__picture.poly-component__picture--contain"); const precioElem = item.querySelector(".andes-money-amount__fraction"); const simboloElem = item.querySelector(".andes-money-amount__currency-symbol"); const tituloElem = item.querySelector(".poly-component__title"); if (precioElem && simboloElem) { const frontImage = frontImageElem ? frontImageElem.src : ""; const simbolo = simboloElem.textContent || ""; const precio = precioElem.textContent || ""; const titulo = tituloElem ? tituloElem.textContent || "Sin t\xEDtulo" : "Sin t\xEDtulo"; if (simbolo.includes("U$S") || simbolo.includes("USD") || simbolo.includes("US") || simbolo.includes("\u20AC") || simbolo.includes("\xA3")) { preciosFiltrados.push({ titulo, simbolo, precio, frontImage }); } } }); return preciosFiltrados; }); return preciosNoPesos; } finally { if (browser) await browser.close(); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { scrapeMercadoLibre });