Ir al contenido

La guía definitiva para raspar Amazon con Python (2023)

Extraer datos de Amazon, una de las mayores plataformas de comercio electrónico, puede proporcionar información valiosa. Ya sea que esté buscando comparar precios, analizar opiniones de clientes o rastrear la disponibilidad de productos, el web scraping puede ser una herramienta útil. Esta guía proporciona instrucciones detalladas y ejemplos de código de Python para raspar Amazon.

Ética del Web Scraping

Antes de sumergirnos, es importante tener en cuenta que el raspado debe hacerse de manera responsable para minimizar la demanda en los servidores del sitio web. Una forma de hacerlo es centrándose en la página de búsqueda de Amazon, donde puede extraer datos básicos del producto, como el nombre, el precio, la URL de la imagen, la calificación y la cantidad de reseñas. Este enfoque reducirá significativamente la cantidad de solicitudes que debe realizar a Amazon, lo que hará que su raspador sea más rápido y económico de ejecutar..

Bibliotecas de raspado web de Python

Python ofrece una gran cantidad de bibliotecas para web scraping, y elegir la correcta depende de sus necesidades específicas y su nivel de comodidad con Python. Estas son algunas de las bibliotecas más utilizadas:

  1. Solicitudes: una popular biblioteca de Python para realizar solicitudes HTTP. Abstrae las complejidades de realizar solicitudes detrás de una API simple, lo que le permite enviar solicitudes HTTP/1.1 con varios métodos como GET, POST y otros.
  2. BeautifulSoup: se utiliza para analizar documentos HTML y XML y extraer datos. Crea un árbol de análisis a partir del código fuente de la página que se puede usar para extraer datos de una manera jerárquica y más legible.
  3. Scrapy: un marco Python de código abierto diseñado específicamente para web scraping. Es un marco versátil que puede manejar una amplia gama de tareas de extracción y es capaz de extraer grandes conjuntos de datos.
  4. Selenio: Una poderosa herramienta para controlar un navegador web a través del programa. Es muy útil para el web scraping porque puede manejar todo tipo de contenido de sitios web, incluido el contenido generado por JavaScript. También permite la interacción del usuario como hacer clic, desplazarse, etc.
  5. parcela: se utiliza para extraer datos de HTML y XML mediante selectores XPath y CSS. Está construido sobre la biblioteca lxml, lo que lo hace flexible y fácil de usar.

Extraer datos de productos de las páginas de búsqueda de Amazon

El primer paso para raspar Amazon es extraer datos de las páginas de búsqueda. Las bibliotecas Python Requests y Parsel se pueden usar para esta tarea. Aquí hay un script de ejemplo que extrae datos de productos de todas las páginas de búsqueda de Amazon disponibles para una palabra clave determinada (por ejemplo, 'iPad'):

solicitudes de importación del selector de importación parsel de urllib.parse import urljoin keyword_list = ['ipad'] product_overview_data = [] para palabra clave en keyword_list: url_list = [f'https://www.amazon.com/s?k={keyword} &page=1'] for url in url_list: try: respuesta = solicitudes.get(url) if respuesta.status_code == 200: sel = Selector(text=response.text) # Extraer página de producto search_products = sel.css("div .s-result-item[data-component-type=s-search-result]") para producto en search_products: URL_relativa = producto.css("h2>a::attr(href)").get() asin = URL_relativa.split('/')[3] if len(URL_relativa.split('/')) >= 4 else Ninguno URL_del_producto = urljoin('https://www.amazon.com/', URL_relativa).split( "?")[0] product_overview_data.append( { "keyword": palabra clave, "asin": asin, "url": product_url, "ad": True if "/slredirect/" in product_url else False, "title": producto.css("h2>a>span::texto").get(), "price-data-a-size=xl .a-offscreen::text").get(), "real_price": producto. css(".a-price[data-a-size=b] .a-offscreen::text").get(), "rating": (producto.css("span[aria-label~=estrellas]: :attr "rating_count": product.css("span[aria-label~=estrellas] + span::attr(aria-label)").get(), "thumbnail_url": product.xpath("//img[ has-class('s-image')]/@src").get(), } ) # Obtener todas las páginas si "&page=1" en url: available_pages = sel.xpath( '//a[has-class ("s-pagination-item")][not(has-class("s-pagination-separator"))]/text()' ).getall() for page in available_pages: search_url_paginated = f'https:// www.amazon.com/s?k={keyword}&page={page}' url_list.append(search_url_paginated) excepto Excepción como e: print("Error", e)

Este script recopilará una serie de datos de productos, cada uno representado como un diccionario con las siguientes claves:

  • keyword: La palabra clave de búsqueda utilizada (p. ej., 'iPad')
  • asin: El número de identificación estándar único de Amazon del producto
  • url: La URL del producto
  • ad: valor booleano que indica si el producto es un anuncio
  • title: El título del producto
  • price: El precio del producto
  • real_price: El precio original del producto antes de cualquier descuento
  • rating: La calificación del producto
  • rating_count: El número de valoraciones que ha recibido el producto.
  • thumbnail_url: la URL de la imagen en miniatura del producto

El script también identifica todas las páginas disponibles para la palabra clave de búsqueda y las agrega a la url_list para raspar【9†fuente】.

Extraer datos de productos de las páginas de productos de Amazon

Una vez que tenga una lista de URL de productos de Amazon, puede extraer todos los datos de productos de cada página individual de productos de Amazon. Aquí hay un script de ejemplo que usa las bibliotecas Python Requests y Parsel para hacer esto:

Importar solicitudes de reimportación desde parsel Selector de importación de urllib.parse import urljoin product_urls = [ 'https://www.amazon.com/2021-Apple-10-2-inch-iPad-Wi-Fi/dp/B09G9FPHY6/ref= sr_1_1', ] product_data_list = [] for product_url in product_urls: try: respuesta = solicitudes.get(producto_url) if respuesta.status_code == 200: sel = Selector(text=response.text) image_data = json.loads(re.findall (r"colorImages':.*'initial':\s*(\[.+?\])},\n", response.text)[0]) variant_data = re.findall(r'dimensionValuesDisplayData"\s *:\s* ({.+?}),\n', respuesta.texto) feature_bullets = [bullet.strip() for bullet in sel.css("#feature-bullets li ::text").getall( )] precio = sel.css('.a-price span[aria-hidden="true"] ::text').get("") if not price: price = sel.css('.a-price . a-offscreen ::text').get("") product_data_list.append({ "name": sel.css("#productTitle::text").get("").strip(), "price": precio, "estrellas": sel.css("i[data-hook=promedio-calificación-de-estrellas] ::texto").get("").strip(), "rating_count": sel.css("div[ data-hook=total-review-count] ::text").get("").strip(), "feature_bullets": feature_bullets, "images": image_data, "variant_data": variant_data, }) excepto Excepción como e : imprimir("Error",e)

Este script recopila una matriz de datos de productos, con cada producto representado como un diccionario con las siguientes claves:

  • name: El nombre del producto
  • price: El precio del producto
  • stars: La calificación de estrellas del producto
  • rating_count: El número total de reseñas que ha recibido el producto.
  • feature_bullets: una lista de las viñetas de características del producto
  • images: Una lista de imágenes de alta resolución del producto
  • variant_data: Datos sobre las variantes del producto (por ejemplo, diferentes colores o tamaños disponibles)

Vale la pena señalar que este script está diseñado para extraer datos de páginas de productos con un diseño específico. Si Amazon cambia el diseño de las páginas de sus productos, es posible que sea necesario actualizar el script【11†fuente】.

Consideraciones adicionales

Si bien las secuencias de comandos anteriores proporcionan un punto de partida para raspar Amazon, existen consideraciones adicionales a tener en cuenta para una solución de raspado completa y sólida:

1. Manejo de contenido dinámico

Algunas páginas de productos de Amazon utilizan contenido dinámico, que requiere JavaScript para cargarse. Si intenta raspar estas páginas con los métodos descritos anteriormente, es posible que falten algunos de los datos que desea. En estos casos, deberá usar una herramienta que pueda generar JavaScript, como Selenium o Puppeteer.

2. Respetando a los robots.txt

Amazon's robots.txt El archivo le dice a los rastreadores web qué páginas pueden visitar. Si bien este archivo no es legalmente vinculante, ignorarlo podría provocar la prohibición de su dirección IP. Lo mejor es respetar robots.txt archivo para evitar posibles problemas.

3. Limitación de velocidad

Amazon podría limitar la cantidad de solicitudes que puede realizar en un período de tiempo determinado. Si realiza demasiadas solicitudes demasiado rápido, Amazon podría prohibir su dirección IP, es posible que necesite proxy para Amazon. Para evitar esto, puede usar técnicas como limitar sus solicitudes o direcciones IP rotativas.

4. Consideraciones éticas

El raspado web puede generar una demanda significativa en el servidor de un sitio web, por lo que es importante raspar de manera responsable. Si puede obtener los datos que necesita de menos páginas, es más ético hacerlo. Por ejemplo, si solo necesita datos básicos del producto (nombre, precio, URL de la imagen, calificación, número de reseñas, etc.), puede extraer estos datos de las páginas de búsqueda en lugar de las páginas del producto, lo que reduce la cantidad de solicitudes que necesita. hacer por un factor de 20.


En conclusión, si bien el web scraping puede ser una herramienta poderosa para extraer datos de sitios web como Amazon, es importante usar estas técnicas de manera responsable y con respecto a los términos de servicio del sitio web y las demandas que impone a sus servidores.

Únase a la conversación

Su dirección de correo electrónico no será publicada. Las areas obligatorias están marcadas como requeridas *