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.
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:
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
Lista de URLs de productos Walmart a raspar.
product_urls = [
'link with https',
'link with https',
'link with https'
]
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>',
]
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',
}
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:
Precio:
Detalle de la revisión:
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)
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentarios: 0