Cómo raspar las reseñas de productos de Amazon detrás de un inicio de sesión

Cómo Extraer Comentarios de Productos de Amazon Detrás de un Inicio de Sesión

Amazon es el sitio web de comercio electrónico más popular para los scraper de la web, con miles de millones de páginas de productos siendo extraídas cada mes.

También alberga una vasta base de datos de reseñas de productos, que pueden ser muy útiles para la investigación de mercado y el monitoreo de competidores.

Puedes extraer datos relevantes del sitio web de Amazon y guardarlos en una hoja de cálculo o en formato JSON. Incluso puedes automatizar el proceso para actualizar los datos regularmente.

Scrapear las reseñas de productos de Amazon no siempre es sencillo, especialmente cuando se requiere inicio de sesión. En esta guía, aprenderás cómo scrapear las reseñas de productos de Amazon detrás de un inicio de sesión. Aprenderás el proceso de inicio de sesión, la extracción de datos de las reseñas y la exportación de las mismas a un archivo CSV.

Sin más preámbulos, empecemos.

Requisitos previos y configuración del proyecto

Utilizaremos la biblioteca Node.js Puppeteer para scrapear las reseñas de Amazon. Asegúrate de tener Node.js instalado en tu sistema. Si no lo tienes, ve al sitio web oficial sitio web de Node.js e instálalo.

Después de instalar Node.js, instala Puppeteer. Puppeteer es una biblioteca de Node.js que proporciona una API amigable de alto nivel para automatizar tareas e interactuar con páginas web dinámicas.

Ahora, instalemos y configuremos Puppeteer.

Abre una terminal y crea una nueva carpeta con el nombre que desees. (En mi caso, es amazon_reviews).

mkdir amazon_reviews

Cambia tu directorio actual a la carpeta creada anteriormente.

cd amazon_reviews

Genial, ahora estás en el directorio correcto. Ejecuta el siguiente comando para inicializar el archivo package.json:

npm init -y

Finalmente, instala Puppeteer usando el siguiente comando:

npm install puppeteer

Así es como se ve el proceso:

Captura de pantalla-2023-10-27-070530

Ahora, abre la carpeta en cualquier editor de código y crea un nuevo archivo JavaScript (index.js). Asegúrate de que la jerarquía se vea así:

Captura de pantalla-2023-10-27-070823
Jerarquía mostrando node_modules, index.js, package-lock.json y package.json

Todo está configurado correctamente. Ahora estamos listos para codificar el scraper.

Nota: Asegúrate de tener una cuenta en Amazon para poder seguir con el resto de este tutorial.

Paso 1: Obtener acceso a la página pública

Scrapearás las reseñas del producto que se muestra a continuación. Extraerás el nombre del autor, el título de la reseña y la fecha.

Aquí está la URL del producto: https://www.amazon.com/ENHANCE-Headphone-Customizable-Lighting-Flexible/dp/B07DR59JLP/

Captura de pantalla-2023-10-27-072923
El producto que estamos usando en el ejemplo: auriculares

Primero, iniciarás sesión en Amazon y luego te redirigirás a la URL del producto para scrapear las reseñas.

Paso 2: Scrapear detrás del inicio de sesión

El proceso de inicio de sesión en varias etapas de Amazon requiere que los usuarios ingresen su nombre de usuario o correo electrónico, hagan clic en un botón Continuar para ingresar su contraseña y finalmente la envíen. Tanto el campo de nombre de usuario como el de contraseña suelen estar en diferentes páginas.

Para ingresar la dirección de correo electrónico, usa el selector input[name=email].

Captura de pantalla-2023-10-27-082325
HTML del campo de inicio de sesión

Ahora, haz clic en el botón Continuar usando el selector input[id=continue].

Captura de pantalla-2023-10-27-083136
HTML del botón continuar

Ahora deberías estar en la siguiente página. Para ingresar la contraseña, utiliza el selector input[name=password].

Captura de pantalla-2023-10-27-083415
HTML del campo de contraseña

Finalmente, haz clic en el botón Iniciar sesión utilizando el selector input[id=signInSubmit].

Captura de pantalla-2023-10-27-083833
HTML del botón de inicio de sesión

Aquí está el código para el proceso de inicio de sesión:

const selectores = {  emailid: 'input[name=email]',  password: 'input[name=password]',  continuar: 'input[id=continue]',  iniciarSesion: 'input[id=signInSubmit]',};    await page.goto(signinURL);    await page.waitForSelector(selectores.emailid);    await page.type(selectores.emailid, "[email protected]", { delay: 100 });    await page.click(selectores.continuar);    await page.waitForSelector(selectores.password);    await page.type(selectores.password, "micontraseña", { delay: 100 });    await page.click(selectores.iniciarSesion);    await page.waitForNavigation();

Estamos siguiendo los mismos pasos que se discutieron anteriormente. Primero, vamos a la URL de inicio de sesión, ingresamos el correo electrónico y hacemos clic en el botón Continuar. Luego ingresamos la contraseña, hacemos clic en el botón Iniciar sesión y esperamos un momento para que se complete el proceso de inicio de sesión.

Después de que se complete el proceso de inicio de sesión, serás redirigido a la página del producto para raspar los comentarios.

Captura de pantalla-2023-10-27-072923-1
Página del producto

Paso 3: Analizar los datos de los comentarios

Has iniciado sesión con éxito y ahora estás en la página del producto que deseas raspar. Ahora analicemos los datos de los comentarios.

En la página, encontrarás varios comentarios. Estos comentarios se encuentran dentro de un div principal con el ID cm-cr-dp-review-list, que contiene todos los comentarios en la página actual. Si deseas acceder a más comentarios, deberás navegar a la siguiente página utilizando el proceso de paginación.

Este div principal tiene varios divs secundarios, y cada div secundario contiene un comentario. Para extraer los comentarios, puedes utilizar el selector #cm-cr-dp-review-list div.review.

const selectores = {  todosLosComentarios: '#cm-cr-dp-review-list div.review',  nombreAutor: 'div[data-hook="genome-widget"] span.a-profile-name',  tituloComentario: '[data-hook=review-title]>span:not([class])',  fechaComentario: 'span[data-hook=review-date]',};

Este selector indica que primero vas al elemento con el ID cm-cr-dp-review-list, luego buscas todos los elementos div con el data-hook review.

imagen_annotada
Datos del comentario con nombre del autor, título del comentario, descripción, etc.

El siguiente fragmento de código muestra que debes ir primero a la URL del producto, esperar a que se cargue el selector y luego raspar todos los comentarios y almacenarlos en la variable elementosComentario.

await page.goto(productURL);await page.waitForSelector(selectores.todosLosComentarios);const elementosComentario = await page.$$(selectores.todosLosComentarios);

Ahora, extraigamos el nombre del autor, el título del comentario y la fecha.

Captura de pantalla-2023-10-27-091701
Seleccionando el nombre del autor, título del comentario y fecha

Para analizar el nombre del autor, puedes usar el selector div[data-hook="genome-widget"] span.a-profile-name. Este selector nos indica que primero debemos buscar el elemento div con el atributo data-hook establecido en genome-widget, porque los nombres están dentro de este elemento div. Luego, busca el elemento span con el nombre de clase a-profile-name. Este es el elemento que contiene el nombre del autor.

const author = await reviewElement.$eval(selectors.authorName, (element) => element.textContent);

Para analizar el título de la reseña, puedes usar el selector CSS [data-hook="review-title"] > span:not([class]). Este selector nos indica que busquemos el elemento span que es un hijo directo del elemento [data-hook="review-title"] y que no tiene un atributo de clase.

const title = await reviewElement.$eval(selectors.reviewTitle, (element) => element.textContent);

Para analizar la fecha, puedes usar el selector CSS span[data-hook="review-date"]. Este selector nos indica que busquemos el elemento span que tiene el atributo data-hook establecido en review-date. Este es el elemento que contiene la fecha de la reseña.

const rawReviewDate = await reviewElement.$eval(selectors.reviewDate, (element) => element.textContent);

Ten en cuenta que obtendrás todo el texto, incluida la ubicación, en lugar de solo la fecha completa. Por lo tanto, debes usar un patrón de expresión regular para extraer la fecha del texto.

Luego, combina todos los datos en reviewData y luego agrégalo a la lista final reviewsData.

const datePattern = /(\w+\s\d{1,2},\s\d{4})/;      const match = rawReviewDate.match(datePattern);      const reviewDate = match ? match[0].replace(',', '') : "Fecha no encontrada";      const reviewData = {        author,        title,        reviewDate,      };      reviewsData.push(reviewData);    }

El proceso anterior se ejecutará hasta que analice todas las reseñas en la página actual. Aquí tienes el fragmento de código para analizar los datos:

for (const reviewElement of reviewElements) {      const author = await reviewElement.$eval(selectors.authorName, (element) => element.textContent);      const title = await reviewElement.$eval(selectors.reviewTitle, (element) => element.textContent);      const rawReviewDate = await reviewElement.$eval(selectors.reviewDate, (element) => element.textContent);      const datePattern = /(\w+\s\d{1,2},\s\d{4})/;      const match = rawReviewDate.match(datePattern);      const reviewDate = match ? match[0].replace(',', '') : "Fecha no encontrada";      const reviewData = {        author,        title,        reviewDate,      };      reviewsData.push(reviewData);    }

¡Genial! Has analizado correctamente los datos relevantes, que ahora están en formato JSON, como se muestra a continuación:

Captura de pantalla-2023-10-27-095917
Datos extraídos en formato JSON

Paso 4: Exportar reseñas a un CSV

Has analizado las reseñas en formato JSON, que es legible para los humanos. Puedes convertir estos datos al formato CSV para que sean más legibles y más fáciles de usar para otros fines.

Hay muchas formas de convertir datos JSON a CSV, pero usaremos un enfoque simple y efectivo. Aquí tienes un sencillo código para convertir JSON a CSV:

let csvContent = "Autor,Título,Fecha\nfor (const review of reviewsData) {      const { author, title, reviewDate } = review;      csvContent += `${author},"${title}",${reviewDate}\n`;    }const csvFileName = "amazon_reviews.csv";await fs.writeFileSync(csvFileName, csvContent, "utf8");

Este es el resultado del archivo CSV.

Captura de pantalla-2023-10-27-102705
Datos JSON convertidos al formato CSV

¡Y ahí lo tienes!

Puedes encontrar el código completo subido en GitHub aquí.

Conclusión

En esta guía, aprendiste cómo extraer reseñas de productos de Amazon detrás de un inicio de sesión utilizando Puppeteer. Aprendiste cómo iniciar sesión, analizar datos relevantes y guardarlos en un archivo CSV.

Para practicar más, puedes extraer todas las reseñas de todas las páginas utilizando paginación.


Leave a Reply

Your email address will not be published. Required fields are marked *