Guía sobre cómo scrapear datos de Walmart con Python

Comentarios: 0

La inteligencia empresarial, la investigación y el análisis son sólo algunas de las infinitas posibilidades que ofrece el web scraping. Una entidad empresarial de pleno derecho como Walmart nos proporciona una estructura perfecta para recopilar la información necesaria. Podemos raspar fácilmente datos de Walmart como el nombre, el precio y la información de reseñas de su multitud de sitios web utilizando diversas técnicas de raspado.

En este artículo vamos a desglosar el proceso de: cómo scrapear datos de Walmart. Usaremos requests para enviar peticiones HTTP y lxml para analizar los documentos HTML devueltos.

¿Por qué utilizar Python para extraer datos de Walmart?

Cuando se trata de extraer datos de productos en varios sitios de venta al por menor, Python es una de las opciones más eficaces que existen. A continuación te explicamos cómo se integra a la perfección en los proyectos de extracción:

  1. Bibliotecas avanzadas. La existencia de peticiones para la interacción web y de lxml para el análisis sintáctico de HTML permite raspar vastos catálogos en línea con la máxima facilidad y eficacia.
  2. Facilidad de uso. Con una sintaxis fácil de usar, los usuarios pueden programar procesos de recuperación de datos con poca o ninguna experiencia previa y, de este modo, ponerse manos a la obra.
  3. Apoyo de la comunidad. La complejidad que entrañan los sitios web de venta al por menor significa que hay una plétora de recursos cualificados y apoyo de la comunidad para ayudarle a resolver los problemas que surjan.
  4. Tratamiento de datos. Análisis en profundidad. Con la ayuda de Pandas para el manejo de datos y Matplotlib para la representación visual, Python permite al usuario analizar datos a una escala más amplia, como la recopilación y el análisis.
  5. Gestión de contenidos dinámicos. Con Selenium, la interacción con los elementos web dinámicos se hace posible, lo que garantiza una amplia recopilación de datos, incluso de páginas cargadas con JavaScript.
  6. Escalado eficaz. Con la capacidad de gestionar conjuntos de datos masivos y diminutos, Python rinde extraordinariamente bien durante largos periodos de tiempo, incluso cuando se le somete a extensas actividades de extracción de datos.

El uso de este tipo de lenguaje para proyectos en el sector minorista no sólo descomplica el aspecto técnico, sino que también aumenta la eficacia y el alcance del análisis, lo que lo convierte en la mejor opción para los expertos que desean obtener un conocimiento profundo del mercado. Estos aspectos pueden ser especialmente útiles cuando se decide extraer datos de Walmart.

Ahora, vamos a empezar con la construcción de una herramienta de raspado web Walmart.

Configuración del entorno para extraer datos de Walmart

Para empezar, asegúrese de que Python está instalado en su ordenador. Las bibliotecas necesarias se pueden descargar usando pip:


pip install requests
pip install  lxml
pip install urllib3

Ahora vamos a importar bibliotecas como:

  • requests - para recuperar páginas web a través de HTTP;
  • lxml - para la generación de árboles de documentos HTML;
  • CSV - para escribir los datos recogidos en archivos CSV;
  • random - para la selección de cadenas de proxy y agente de usuario.

import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Definir URL de productos

La lista de URL de productos para raspar los datos de Walmart se puede añadir así.


product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

Cadenas User-Agent y proxies

Cuando se hace web scraping en Walmart, es crucial presentar las cabeceras HTTP correctas, especialmente la cabecera User-Agent, para imitar un navegador real. Además, los sistemas anti-bot del sitio también pueden eludirse utilizando servidores proxy rotativos. En el siguiente ejemplo, se presentan las cadenas User-Agent junto con las instrucciones para añadir la autorización del servidor proxy por dirección IP.


user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]

Cabeceras de las solicitudes

Las cabeceras de las peticiones deben configurarse de forma que parezcan proceder del navegador del usuario. Ayudará mucho cuando se trate de scrapear datos de Walmart. Aquí hay un ejemplo de cómo se vería:


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'dnt': '1',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
}

Inicializar el almacenamiento de datos

El primer paso consiste en crear una estructura que acepte información sobre los productos.


product_details = []

La enumeración de páginas URL funciona de la siguiente manera: Para cada página URL, se inicia una solicitud GET con un User-Agent y un proxy elegidos al azar. Cuando se recibe una respuesta HTML, se analizan los detalles del producto, incluidos el nombre, el precio y las opiniones. Los detalles relevantes se guardan en la estructura de datos del diccionario, que posteriormente se añade a la lista creada previamente.


for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Enviar una solicitud HTTP GET a la URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Analiza el contenido HTML con lxml
   parser = html.fromstring(response.text)
   # Extraer el título del producto
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Extraer el precio del producto
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Detalles de la revisión de extractos
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Almacenar los datos extraídos en un diccionario
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Añadir detalles del producto a la lista
   product_details.append(product_detail)

Título:

1.png

Precio:

2.png

Detalle de la revisión:

3.png

Guardar datos en CSV

  1. Cree un nuevo archivo especificando CSV como tipo de archivo y configúrelo en modo de escritura.
  2. Especifique los nombres de los campos (columnas) del archivo CSV.
  3. Para escribir diccionarios en el archivo CSV, cree un objeto csv.DictWriter.
  4. Escribe la fila de cabecera del archivo CSV.
  5. Para cada diccionario en product_details, realice un bucle y escriba el diccionario como una fila en el archivo CSV.

with open('walmart_products.csv', 'w', newline='') as csvfile:
    fieldnames = ['title', 'price', 'review_details']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for product_detail in product_details:
        writer.writerow(product_detail)

Código completo

Cuando web scraping Walmart, Python script completo se verá como el que se proporciona a continuación. Aquí también hay algunos comentarios para que sea más fácil para usted para entender cada sección.


import requests
from lxml import html
import csv
import random
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# Lista de URL de productos para raspar los datos de Walmart
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# Cadenas User-Agent aleatorias para el anonimato
user_agents = [
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

# Lista de proxy para la rotación de IP
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# Cabeceras para imitar las peticiones del navegador
headers = {
   'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
   'accept-language': 'en-IN,en;q=0.9',
   'dnt': '1',
   'priority': 'u=0, i',
   'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
   'sec-ch-ua-mobile': '?0',
   'sec-ch-ua-platform': '"Linux"',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'none',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
}

# Inicializar una lista vacía para almacenar los detalles del producto
product_details = []

# Recorrer cada URL de producto
for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Enviar una solicitud HTTP GET a la URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Analiza el contenido HTML con lxml
   parser = html.fromstring(response.text)
   # Extraer el título del producto
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Extraer el precio del producto
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Detalles de la revisión de extractos
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Almacenar los datos extraídos en un diccionario
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Añadir detalles del producto a la lista
   product_details.append(product_detail)

# Escribir los datos extraídos en un archivo CSV
with open('walmart_products.csv', 'w', newline='') as csvfile:
   fieldnames = ['title', 'price', 'review_details']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for product_detail in product_details:
       writer.writerow(product_detail)

Sugerencias adicionales

Para aquellos que utilizan Python para interactuar con la API de raspado de Walmart, es crucial desarrollar métodos robustos que raspen eficazmente los precios de Walmart y los resultados de las reseñas de Walmart. Esta API proporciona una vía directa a una gran cantidad de datos de productos, lo que facilita el análisis en tiempo real de los precios y las opiniones de los clientes.

El empleo de estas estrategias específicas mejora la precisión y el alcance de la información recopilada, lo que permite a las empresas adaptarse rápidamente a los cambios del mercado y a las tendencias de los consumidores. Mediante la aplicación estratégica de la API de Walmart en Python, las empresas pueden optimizar sus procesos de recopilación de datos, garantizando un análisis exhaustivo del mercado y una toma de decisiones informada.

Conclusión

En este tutorial, explicamos cómo utilizar las bibliotecas de Python para scrapear datos de Walmart y guardarlos en un archivo CSV para su posterior análisis. El script dado es básico, y sirve como punto de partida que puedes modificar para mejorar la eficiencia del proceso de scraping. Las mejoras pueden incluir la adición de intervalos de tiempo aleatorios entre las solicitudes para simular la navegación humana, el uso de usuarios-agentes y proxies para enmascarar el bot, y la implementación de la gestión avanzada de errores para hacer frente a las interrupciones o fallos de raspado.


Comentarios:

0 Comentarios