Cómo construir un raspador de productos de Amazon con Node.js

 

 

 

  • Implemente rápidamente. Implementar inteligentemente
  • ¡Registro!

  • Índice
    1. Por qué debería extraer datos de productos de Amazon
    2. Los desafíos de extraer datos de productos de Amazon
    3. Cómo construir un raspador web para Amazon
      1. Busque los datos que necesitamos
      2. Obtenga las herramientas necesarias
      3. Inspeccionar la fuente de la página
      4. Obtener los datos
      5. Formatear los datos
    4. ¡Consejos adicionales!
      1. Raspado de aplicaciones de una sola página
      2. Configuración user-agentde encabezados
      3. Limitación de tasa
    5. Pensamientos finales
      1. Lectura relacionada

    La gran cantidad de datos que posee Amazon puede marcar una gran diferencia cuando se diseña un producto o se busca una ganga. Pero, ¿cómo puede un desarrollador obtener esos datos? Sencillo, utilizando un raspador web. Aquí se explica cómo crear su bot de extracción de datos con Node.js.

     

    ¿Alguna vez se ha encontrado en una posición en la que necesita conocer íntimamente el mercado de un producto en particular? Tal vez esté lanzando algún software y necesite saber cómo ponerle precio. O quizás ya tenga su propio producto en el mercado y quiera ver qué características agregar para obtener una ventaja competitiva. O tal vez simplemente quiera comprar algo para usted y asegurarse de obtener el mejor rendimiento por su inversión.

    Todas estas situaciones tienen una cosa en común: necesitas datos precisos para tomar la decisión correcta . En realidad, hay otra cosa que comparten. Todos los escenarios pueden beneficiarse del uso de un web scraper.

     

    El web scraping es la práctica de extraer grandes cantidades de datos web mediante el uso de software. Entonces, en esencia, es una forma de automatizar el tedioso proceso de presionar "copiar" y luego "pegar" 200 veces. Por supuesto, un bot puede hacer eso en el tiempo que te tomó leer esta oración, por lo que no sólo es menos aburrido sino también mucho más rápido.

    Pero la pregunta candente es: ¿ por qué alguien querría eliminar páginas de Amazon?

    ¡Estás a punto de descubrirlo! Pero antes que nada, me gustaría dejar algo claro ahora: si bien el acto de extraer datos disponibles públicamente es legal, Amazon tiene algunas medidas para evitarlo en sus páginas. Como tal, le insto a que siempre tenga en cuenta el sitio web mientras realiza el scraping, tenga cuidado de no dañarlo y siga las pautas éticas.

    Lectura recomendada : “ La guía para el scraping ético de sitios web dinámicos con Node.js y Puppeteer ” por Andreas Altheimer

    Por qué debería extraer datos de productos de Amazon

    Al ser el minorista en línea más grande del planeta, es seguro decir que si desea comprar algo, probablemente pueda conseguirlo en Amazon. Por lo tanto, no hace falta decir cuán grande es el tesoro de datos escondido en el sitio web.

    Al navegar por la web, su pregunta principal debería ser qué hacer con todos esos datos. Si bien existen muchas razones individuales, todo se reduce a dos casos de uso destacados: optimizar sus productos y encontrar las mejores ofertas.

    Comencemos con el primer escenario. A menos que haya diseñado un producto nuevo verdaderamente innovador, lo más probable es que ya pueda encontrar algo al menos similar en Amazon. Eliminar esas páginas de productos puede proporcionarle datos invaluables como:

    • La estrategia de precios de la competencia
      Para que usted pueda ajustar sus precios para ser competitivo y comprender cómo otros manejan las ofertas promocionales;
    • Opiniones de clientes
      Para ver qué es lo que más le importa a su futura base de clientes y cómo mejorar su experiencia;
    • Características más comunes
      Para ver qué ofrece tu competencia para saber qué funcionalidades son cruciales y cuáles puedes dejar para más adelante.

    En esencia, Amazon tiene todo lo que necesita para un análisis profundo del mercado y del producto. Estará mejor preparado para diseñar, lanzar y ampliar su línea de productos con esos datos.

    El segundo escenario puede aplicarse tanto a empresas como a personas comunes y corrientes. La idea es bastante similar a lo que mencioné anteriormente. Puede extraer los precios, las características y las reseñas de todos los productos que pueda elegir y, por lo tanto, podrá elegir el que ofrezca los mayores beneficios por el precio más bajo. Después de todo, ¿a quién no le gustan las buenas ofertas?

     

    No todos los productos merecen este nivel de atención al detalle, pero puede marcar una gran diferencia en compras costosas. Desafortunadamente, si bien los beneficios son claros, existen muchas dificultades para eliminar a Amazon.

    Los desafíos de extraer datos de productos de Amazon

    No todos los sitios web son iguales. Como regla general, cuanto más complejo y extendido sea un sitio web, más difícil será eliminarlo. ¿Recuerdas cuando dije que Amazon era el sitio de comercio electrónico más destacado? Bueno, eso lo hace extremadamente popular y razonablemente complejo.

    En primer lugar, Amazon sabe cómo actúan los robots de scraping, por lo que el sitio web cuenta con contramedidas. Es decir, si el raspador sigue un patrón predecible, enviando solicitudes a intervalos fijos, más rápido de lo que podría hacerlo un humano o con parámetros casi idénticos, Amazon notará y bloqueará la IP. Los servidores proxy pueden resolver este problema, pero no los necesitaba ya que no eliminaremos demasiadas páginas en el ejemplo.

    A continuación, Amazon utiliza deliberadamente diferentes estructuras de páginas para sus productos. Es decir, si inspeccionas las páginas en busca de diferentes productos, es muy probable que encuentres diferencias significativas en su estructura y atributos. La razón detrás de esto es bastante simple. Necesita adaptar el código de su raspador para un sistema específico y, si usa el mismo script en un nuevo tipo de página, tendrá que reescribir partes del mismo. Entonces, esencialmente te hacen trabajar más para obtener los datos.

    Por último, Amazon es un sitio web enorme. Si desea recopilar grandes cantidades de datos, ejecutar el software de raspado en su computadora puede llevar demasiado tiempo para sus necesidades. Este problema se agrava aún más por el hecho de que ir demasiado rápido bloqueará el raspador. Por lo tanto, si desea obtener una gran cantidad de datos rápidamente, necesitará un raspador realmente poderoso.

    Bueno, ya basta de hablar de problemas, ¡centrémonos en las soluciones!

    Cómo construir un raspador web para Amazon

    Para simplificar las cosas, adoptaremos un enfoque paso a paso para escribir el código. Siéntase libre de trabajar en paralelo con la guía.

    Busque los datos que necesitamos

    Entonces, he aquí un escenario: dentro de unos meses me mudaré a un lugar nuevo y necesitaré un par de estantes nuevos para guardar libros y revistas. Quiero conocer todas mis opciones y conseguir el mejor trato posible. Entonces, vayamos al mercado de Amazon, busquemos “estanterías” y veamos qué encontramos.

    La URL para esta búsqueda y la página que rastrearemos está aquí .

     

    En estos chicos malos caben tantos libros. (Fuente: ( vista previa grande )

    Ok, hagamos un balance de lo que tenemos aquí. Con solo echar un vistazo a la página, podemos hacernos una buena idea de:

    • cómo se ven los estantes;
    • qué incluye el paquete;
    • cómo los califican los clientes;
    • su precio;
    • el enlace al producto;
    • una sugerencia para una alternativa más barata para algunos de los artículos.

    ¡Eso es más de lo que podríamos pedir!

    Obtenga las herramientas necesarias

    Asegurémonos de tener todas las siguientes herramientas instaladas y configuradas antes de continuar con el siguiente paso.

    • Chrome
      lo podemos descargar desde aquí .
    • VSCode
      Siga las instrucciones de esta página para instalarlo en su dispositivo específico.
    • Node.js
      Antes de comenzar a usar Axios o Cheerio, necesitamos instalar Node.js y Node Package Manager. La forma más sencilla de instalar Node.js y NPM es obtener uno de los instaladores de la fuente oficial de Node.Js y ejecutarlo.

    Ahora, creemos un nuevo proyecto NPM. Cree una nueva carpeta para el proyecto y ejecute el siguiente comando:

    npm init -y

    Para crear el web scraper, necesitamos instalar un par de dependencias en nuestro proyecto:

    • Cheerio
      Una biblioteca de código abierto que nos ayuda a extraer información útil analizando el marcado y proporcionando una API para manipular los datos resultantes. Cheerio nos permite seleccionar etiquetas de un documento HTML mediante el uso de selectores: $("div"). Este selector específico nos ayuda a elegir todos divlos elementos de una página. Para instalar Cheerio, ejecute el siguiente comando en la carpeta de proyectos:
    npm install cheerio
    • Axios
      Una biblioteca de JavaScript utilizada para realizar solicitudes HTTP desde Node.js.
    npm install axios

    Inspeccionar la fuente de la página

    En los siguientes pasos, aprenderemos más sobre cómo se organiza la información en la página. La idea es comprender mejor lo que podemos extraer de nuestra fuente.

    Las herramientas de desarrollo nos ayudan a explorar de forma interactiva el modelo de objetos de documento (DOM) del sitio web. Usaremos las herramientas de desarrollador en Chrome, pero usted puede usar cualquier navegador web con el que se sienta cómodo. Todo sobre animales

    Abrámoslo haciendo clic derecho en cualquier lugar de la página y seleccionando la opción "Inspeccionar":

    El proceso es el mismo tanto para macOS como para Windows. ( Vista previa grande )

    Esto abrirá una nueva ventana que contiene el código fuente de la página. Como hemos dicho antes, buscamos extraer la información de cada estante.

    Esto puede parecer intimidante, pero en realidad es más fácil de lo que parece. ( Vista previa grande )

    Como podemos ver en la captura de pantalla anterior, los contenedores que contienen todos los datos tienen las siguientes clases:

    sg-col-4-of-12 s-result-item s-asin sg-col-4-of-16 sg-col sg-col-4-of-20

    En el siguiente paso, usaremos Cheerio para seleccionar todos los elementos que contienen los datos que necesitamos.

     

    Obtener los datos

    Después de instalar todas las dependencias presentadas anteriormente, creemos un nuevo index.jsarchivo y escribamos las siguientes líneas de código:

    const axios = require("axios");const cheerio = require("cheerio");const fetchShelves = async () = { try { const response = await axios.get('https://www.amazon.com/s?crid=36QNR0DBY6M7Jk=shelvesref=glow_clsrefresh=1sprefix=s%2Caps%2C309'); const html = response.data; const $ = cheerio.load(html); const shelves = []; $('div.sg-col-4-of-12.s-result-item.s-asin.sg-col-4-of-16.sg-col.sg-col-4-of-20').each((_idx, el) = { const shelf = $(el) const title = shelf.find('span.a-size-base-plus.a-color-base.a-text-normal').text() shelves.push(title) }); return shelves; } catch (error) { throw error; }};fetchShelves().then((shelves) = console.log(shelves));

    Como podemos ver, importamos las dependencias que necesitamos en las dos primeras líneas y luego creamos una fetchShelves()función que, usando Cheerio, obtiene todos los elementos que contienen la información de nuestros productos de la página.

    Itera sobre cada uno de ellos y lo envía a una matriz vacía para obtener un resultado con mejor formato.

    La fetchShelves()función solo devolverá el título del producto por el momento, así que obtengamos el resto de la información que necesitamos. Agregue las siguientes líneas de código después de la línea donde definimos la variable title.

    const image = shelf.find('img.s-image').attr('src')const link = shelf.find('a.a-link-normal.a-text-normal').attr('href')const reviews = shelf.find('div.a-section.a-spacing-none.a-spacing-top-micro div.a-row.a-size-small').children('span').last().attr('aria-label')const stars = shelf.find('div.a-section.a-spacing-none.a-spacing-top-micro div span').attr('aria-label')const price = shelf.find('span.a-price span.a-offscreen').text() let element = { title, image, link: `https://amazon.com${link}`, price, } if (reviews) { element.reviews = reviews } if (stars) { element.stars = stars }

    Y reemplácelo shelves.push(title)con shelves.push(element).

    Ahora estamos seleccionando toda la información que necesitamos y agregándola a un nuevo objeto llamado element. Luego, cada elemento se envía a la shelvesmatriz para obtener una lista de objetos que contienen solo los datos que estamos buscando.

    Así es como shelfdebería verse un objeto antes de agregarlo a nuestra lista:

     { title: 'SUPERJARE Wall Mounted Shelves, Set of 2, Display Ledge, Storage Rack for Room/Kitchen/Office - White', image: 'https://m.media-amazon.com/images/I/61fTtaQNPnL._AC_UL320_.jpg', link: 'https://amazon.com/gp/slredirect/picassoRedirect.html/ref=pa_sp_btf_aps_sr_pg1_1?ie=UTF8adId=A03078372WABZ8V6NFP9Lurl=%2FSUPERJARE-Mounted-Floating-Shelves-Display%2Fdp%2FB07H4NRT36%2Fref%3Dsr_1_59_sspa%3Fcrid%3D36QNR0DBY6M7J%26dchild%3D1%26keywords%3Dshelves%26qid%3D1627970918%26refresh%3D1%26sprefix%3Ds%252Caps%252C309%26sr%3D8-59-spons%26psc%3D1qualifier=1627970918id=3373422987100422widgetName=sp_btf', price: '$32.99', reviews: '6,171', stars: '4.7 out of 5 stars' }

    Formatear los datos

    Ahora que hemos logrado recuperar los datos que necesitamos, es una buena idea guardarlos como un .CSVarchivo para mejorar la legibilidad. Después de obtener todos los datos, usaremos el fsmódulo proporcionado por Node.js y guardaremos un nuevo archivo llamado saved-shelves.csven la carpeta del proyecto. Importe el fsmódulo en la parte superior del archivo y copie o escriba las siguientes líneas de código:

     

    let csvContent = shelves.map(element = { return Object.values(element).map(item = `"${item}"`).join(',')}).join("n")fs.writeFile('saved-shelves.csv', "Title, Image, Link, Price, Reviews, Stars" + 'n' + csvContent, 'utf8', function (err) { if (err) { console.log('Some error occurred - file either not saved or corrupted.') } else{ console.log('File has been saved!') }})

    Como podemos ver, en las tres primeras líneas formateamos los datos que hemos recopilado previamente uniendo todos los valores de un objeto shelve mediante una coma. Luego, usando el fsmódulo, creamos un archivo llamado saved-shelves.csv, agregamos una nueva fila que contiene los encabezados de las columnas, agregamos los datos que acabamos de formatear y creamos una función de devolución de llamada que maneja los errores.

    El resultado debería verse así:

    Datos dulces y organizados. ( Vista previa grande )

    ¡Consejos adicionales!

    Raspado de aplicaciones de una sola página

    El contenido dinámico se está convirtiendo en el estándar hoy en día, ya que los sitios web son más complejos que nunca. Para brindar la mejor experiencia de usuario posible, los desarrolladores deben adoptar diferentes mecanismos de carga de contenido dinámico , lo que complica un poco nuestro trabajo. Si no sabe lo que eso significa, imagine un navegador que carece de una interfaz gráfica de usuario. Afortunadamente, existe ✨Puppeteer✨ , la biblioteca mágica de Node que proporciona una API de alto nivel para controlar una instancia de Chrome a través del protocolo DevTools. Aún así, ofrece la misma funcionalidad que un navegador, pero debe controlarse mediante programación escribiendo un par de líneas de código. Veamos cómo funciona.

    En el proyecto creado anteriormente, instale la biblioteca Puppeteer ejecutando npm install puppeteer, cree un nuevo puppeteer.jsarchivo y copie o escriba las siguientes líneas de código:

    const puppeteer = require('puppeteer')(async () = { try { const chrome = await puppeteer.launch() const page = await chrome.newPage() await page.goto('https://www.reddit.com/r/Kanye/hot/') await page.waitForSelector('.rpBJOHq2PR60pnwJlUyP0', { timeout: 2000 }) const body = await page.evaluate(() = { return document.querySelector('body').innerHTML }) console.log(body) await chrome.close() } catch (error) { console.log(error) }})()

    En el ejemplo anterior, creamos una instancia de Chrome y abrimos una nueva página del navegador que se requiere para ir a este enlace . En la siguiente línea, le decimos al navegador sin cabeza que espere hasta que el elemento con la clase rpBJOHq2PR60pnwJlUyP0aparezca en la página. También hemos especificado cuánto tiempo debe esperar el navegador hasta que se cargue la página (2000 milisegundos).

     

    Usando el evaluatemétodo de la pagevariable, le indicamos a Puppeteer que ejecutara los fragmentos de Javascript dentro del contexto de la página justo después de que finalmente se cargara el elemento. Esto nos permitirá acceder al contenido HTML de la página y devolver el cuerpo de la página como resultado. Luego cerramos la instancia de Chrome llamando al closemétodo de la chromevariable. El trabajo resultante debería consistir en todo el código HTML generado dinámicamente. Así es como Puppeteer puede ayudarnos a cargar contenido HTML dinámico .

    Si no se siente cómodo usando Puppeteer, tenga en cuenta que existen un par de alternativas, como NightwatchJS, NightmareJS o CasperJS. Son ligeramente diferentes, pero al final el proceso es bastante similar.

    Configuración user-agentde encabezados

    user-agentes un encabezado de solicitud que le informa al sitio web que está visitando sobre usted, es decir, su navegador y sistema operativo. Esto se utiliza para optimizar el contenido de su configuración, pero los sitios web también lo utilizan para identificar bots que envían toneladas de solicitudes, incluso si cambian de IPS.

    Así es como user-agentse ve un encabezado:

    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36

    Para no ser detectado ni bloqueado, debe cambiar este encabezado periódicamente. Tenga especial cuidado de no enviar un encabezado vacío o desactualizado, ya que esto nunca debería sucederle a un usuario común y corriente y usted se destacará.

    Limitación de tasa

    Los web scrapers pueden recopilar contenido extremadamente rápido, pero debes evitar ir a máxima velocidad. Hay dos razones para esto:

    1. Demasiadas solicitudes en poco tiempo pueden ralentizar el servidor del sitio web o incluso hacerlo caer, causando problemas al propietario y a otros visitantes. Básicamente, puede convertirse en un ataque DoS.
    2. Sin proxies rotativos, es como anunciar en voz alta que estás usando un bot , ya que ningún ser humano enviaría cientos o miles de solicitudes por segundo.

    La solución es introducir un retraso entre sus solicitudes, una práctica llamada "limitación de velocidad". (¡ También es bastante sencillo de implementar! )

    En el ejemplo de Puppeteer proporcionado anteriormente, antes de crear la bodyvariable, podemos usar el waitForTimeoutmétodo proporcionado por Puppeteer para esperar un par de segundos antes de realizar otra solicitud:

    await page.waitForTimeout(3000);

    ¿ Dónde msestá la cantidad de segundos que le gustaría esperar?

    Además, si queremos hacer lo mismo para el ejemplo de axios, podemos crear una promesa que llame al setTimeout()método para ayudarnos a esperar la cantidad deseada de milisegundos:

    fetchShelves.then(result = new Promise(resolve = setTimeout(() = resolve(result), 3000)))

    De esta manera, puede evitar ejercer demasiada presión sobre el servidor de destino y también aportar un enfoque más humano al web scraping.

    Pensamientos finales

    ¡Y ahí lo tiene, una guía paso a paso para crear su propio raspador web para datos de productos de Amazon! Pero recuerde, esta fue sólo una situación. Si desea crear un sitio web diferente, deberá realizar algunos ajustes para obtener resultados significativos.

    Lectura relacionada

    Si aún desea ver más web scraping en acción, aquí tiene material de lectura útil:

    • “ La guía definitiva para el web scraping con JavaScript y Node.Js ”, Robert Sfichi
    • “ Raspado web avanzado Node.JS con Puppeteer ”, Gabriel Cioci
    • " Python Web Scraping: la guía definitiva para construir su scraper ", Raluca Penciuc

    (ks, vf, yk, il)Explora más en

    • Nodo.js
    • javascript
    • Herramientas





    Tal vez te puede interesar:

    1. ¿Deberían abrirse los enlaces en ventanas nuevas?
    2. 24 excelentes tutoriales de AJAX
    3. 70 técnicas nuevas y útiles de AJAX y JavaScript
    4. Más de 45 excelentes recursos y repositorios de fragmentos de código

    Cómo construir un raspador de productos de Amazon con Node.js

    Cómo construir un raspador de productos de Amazon con Node.js

    Implemente rápidamente. Implementar inteligentemente ¡Registro! Índice Por qué debería extraer datos

    programar

    es

    https://aprendeprogramando.es/static/images/programar-como-construir-un-raspador-de-productos-de-amazon-con-node-1126-0.jpg

    2024-04-04

     

    Cómo construir un raspador de productos de Amazon con Node.js
    Cómo construir un raspador de productos de Amazon con Node.js

    Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente

     

     

    Top 20