Guía para el scraping de datos de Walmart con Python

Comentarios: 0

Web scraping es una poderosa manera de extraer datos de sitios web para diferentes propósitos, tales como análisis, investigación e inteligencia en los negocios. Este tutorial le ayuda a raspar la información del producto Walmart en Python con el foco en las estrategias y técnicas clave. Walmart scraping presenta un ejemplo donde podemos extraer detalles de productos como nombre, precio o reseñas encontradas en varias páginas bajo los sitios de Walmart.

Esta guía utilizará la librería requests para realizar peticiones HTTP y la librería lxml para parsear contenido HTML.

Cómo configurar el entorno

Antes de empezar, asegúrate de que tienes Python instalado en tu máquina. Puedes instalar las librerías necesarias usando pip:

pip install requests
pip install  lxml
pip install urllib3

A continuación, vamos a importar las librerías necesarias:

  • requests: para realizar peticiones HTTP para recuperar páginas web;
  • lxml: para analizar el contenido HTML;
  • csv: para escribir los datos extraídos en un archivo CSV;
  • random: para seleccionar proxies y cadenas User-Agent al azar.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Definir las URL de los productos

Lista de URLs de productos Walmart a raspar.

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

Cadenas de usuario-agente y proxies

Para hacer scraping de un sitio web, es muy importante utilizar las cabeceras correctas, especialmente la cabecera User-Agent, para imitar la petición de un navegador real. Además, se pueden evitar las restricciones impuestas por las medidas anti-bot de los propietarios de los sitios mediante servidores proxy rotativos. A continuación se muestran ejemplos de cadenas User-Agent junto con una descripción de cómo integrar servidores proxy que requieren autorización basada en la 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 para las solicitudes

Establece encabezados para imitar las peticiones del navegador y evitar ser detectado.

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

Crea una lista vacía para almacenar los detalles del producto.

product_details = []

El proceso de enumeración de páginas URL funciona de la siguiente manera: Para cada página URL, se envía una solicitud GET utilizando un User-Agent y un proxy seleccionados al azar. Al recibir la respuesta HTML, se analiza para extraer detalles como el nombre del producto, el precio y las reseñas. Los datos extraídos se almacenan en un diccionario, que posteriormente se añade a una lista creada anteriormente.

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()'))
   # Extraer el precio del producto
   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. Abre un nuevo archivo CSV para escribir.
  2. Defina los nombres de los campos (columnas) para el archivo CSV.
  3. Cree un objeto csv.DictWriter para escribir diccionarios en el archivo CSV.
  4. Escribir la fila de encabezado en el archivo CSV.
  5. Recorra la lista product_details y escriba cada diccionario de producto 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:

Aquí tienes el código completo con comentarios para que lo entiendas mejor:

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 a raspar
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)

Nuestro tutorial muestra cómo utilizar las bibliotecas de Python para extraer datos de productos de Walmart y guardarlos en formato CSV para su posterior análisis. El script proporcionado es fundamental y ofrece una base que puede mejorarse para aumentar la eficiencia del proceso de scraping. Las mejoras podrían incluir la introducción de retrasos aleatorios entre las solicitudes para imitar los patrones de navegación humana, la aplicación de User-Agent y la rotación de proxy para evitar la detección, y el desarrollo de un sistema de gestión de errores robusto para gestionar las posibles interrupciones o fallos de raspado.

Comentarios:

0 Comentarios