Ir para o conteúdo

Como raspar a Web no Walmart.com

O Walmart é o maior varejista do mundo, com mais de 10,000 lojas em 24 países. Dado seu enorme estoque e ricos dados de produtos, o Walmart é um alvo extremamente valioso para web scraping.

Neste guia abrangente, veremos como construir um web scraper para extrair dados de produtos do Walmart em grande escala.

Visão geral

Aqui está uma rápida visão geral das principais etapas que abordaremos:

  • Encontrando produtos para raspar
    • Usando a API de pesquisa do Walmart
    • Analisando páginas de categoria
    • Lidando com limites de resultados
  • Raspar páginas de produtos
    • Analisando dados do produto
    • Raspar mídia, preços, especificações, etc.
  • Evitando Bloqueio
    • Randomizando atrasos
    • Como usar proxies
    • Imitando navegadores reais
  • Juntando tudo
    • API de pesquisa → URLs de produtos → raspagem
    • Lidando com grandes conjuntos de resultados

No final, você terá um raspador Walmart totalmente funcional em Python, pronto para extrair milhares de produtos. Vamos começar!

instalação

Estaremos usando Python junto com vários pacotes principais:

  • pedidos – para fazer solicitações HTTP para API e páginas da web do Walmart
  • bela sopa 4 – Análise de HTML
  • pandas – para manipulação de dados

Instale-os via pip:

pip install requests beautifulsoup4 pandas

Também usaremos proxies para evitar bloqueios, que podem ser adquiridos em diversos fornecedores.

Encontrando produtos para raspar

A primeira etapa é descobrir URLs ou IDs de produtos para alimentar nosso scraper. Existem algumas abordagens que podemos usar:

Usando a API de pesquisa

O Walmart oferece uma API de pesquisa que retorna dados JSON estruturados. Podemos consultar esta API para encontrar produtos que correspondam a palavras-chave.

Vamos experimentar para "laptop":

import requests

api_url = "https://www.walmart.com/terra-firma/api/search"

params = {
  "query": "laptop", 
  "sort": "price_low",
  "page": 1,
  " affiliateId": "test",
}

response = requests.get(api_url, params=params)
data = response.json()

print(data["items"][0]["productId"])
# prints a product ID, e.g. 1GY23EA#ABA

Esta API retorna resultados paginados em um formato JSON estruturado contendo:

  • productId – o ID do Walmart para esse produto
  • title – nome do produto
  • description – breve descrição em texto
  • price - preço atual
  • E mais…

Podemos percorrer páginas para coletar IDs e dados.

Uma limitação é que a API só permite buscar até 1000 resultados. Para obter mais cobertura, teremos que usar outras abordagens também.

Analisando páginas de categoria

O Walmart também oferece páginas de categorias navegáveis ​​que podemos analisar:

https://www.walmart.com/browse/electronics/laptops/3944_3951_132959?povid=113750++2019-11-04+15%3A05%3A24.517-06%3A00&povid=113750++2019-11-04+15%3A05%3A24.517-06%3A00&affinityOverride=default

Essas páginas contêm as grades de produtos que vemos no site do Walmart.

Para extrair produtos, usaremos Beautiful Soup:

from bs4 import BeautifulSoup
import requests

url = "https://www.walmart.com/browse/electronics/laptops/3944_3951_132959"

response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

products = soup.select(".search-result-gridview-item")

for product in products:
  title = product.select_one(".search-result-product-title").text
  link = product.select_one(".search-result-product-title")["href"]

  print(title, link)

Isso analisa os produtos de visualização em grade/lista, obtendo o título e o URL.

Podemos então alimentar os URLs em nosso raspador de produto.

As páginas de categoria podem conter milhares de produtos em muitas páginas, portanto, esse método tem grande cobertura.

Lidando com Limites

Entre a API de pesquisa e as páginas de categoria, podemos descobrir milhares de produtos. Mas existem alguns limites a serem considerados:

  • A API de pesquisa permite obter apenas 1000 resultados
  • Cada página de categoria tem no máximo 24 páginas, aproximadamente 50 produtos por página

Portanto, para uma análise abrangente, teremos que ser criativos:

  • Use várias consultas de pesquisa com filtros restritivos
  • Raspe em várias páginas de categoria
  • Expanda o escopo, por exemplo. raspando todos os laptops em eletrônicos

Com um pouco de iteração, podemos construir um grande corpus de mais de 10,000 URLs de produtos adequados para alimentar nosso scraper.

Raspar páginas de produtos

Assim que tivermos URLs ou IDs dos produtos, podemos extrair os dados das próprias páginas dos produtos.

As páginas de produtos do Walmart possuem um rico conjunto de informações que podemos extrair:

  • Descrição do título
  • Imagens
  • Preço, dados de vendas
  • Especificações
  • Informação do vendedor
  • Opinões
  • Produtos relacionados
  • Disponibilidade de estoque

E mais.

Vamos analisar algumas peças-chave.

Raspar detalhes do produto

As páginas de produtos contêm um objeto JavaScript chamado window.__WML_REDUX_INITIAL_STATE__ com muitos dos dados estruturados:

<script>
  window.__WML_REDUX_INITIAL_STATE__ = {
    "product": {
      "id": "1GY23EA#ABA",
      "usItemId": "497219257", 
      "name": "HP 14-inch Laptop, Intel Core i3-1005G1, 4GB SDRAM, 128GB SSD, Pale Gold, Windows 10 Home",
      "description": "A laptop with the performance you need and..."
      ...
    }
    ...
  }
</script>

Podemos extrair isso e analisar o JSON para obter campos como:

import json
import requests
from bs4 import BeautifulSoup

product_url = "https://www.walmart.com/ip/497219257" 

response = requests.get(product_url)
soup = BeautifulSoup(response.text, ‘html.parser‘)

data = soup.find("script", {"id": "__WML_REDUX_INITIAL_STATE__"})
product_data = json.loads(data.contents[0])["product"]

title = product_data["name"]
walmart_id = product_data["usItemId"]
description = product_data["description"]

print(title)
# "HP 14-inch Laptop, Intel Core i3-1005G1, 4GB SDRAM, 128GB SSD, Pale Gold, Windows 10 Home" 

Este campo JSON contém a maioria das informações principais do produto que gostaríamos de extrair.

Raspagem de mídia

A mídia do produto, como imagens, está contida em outro bloco de script, imageAssets:

<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.imageAssets = [
  {
    "assetSize": "medium",
    "assetUrl": "https://i5.walmartimages.com/...", 
    "baseAsset": {...},
    "thumbnailUrl": "https://i5.walmartimages.com/..." 
  },
  {...}
];
</script>

Podemos vasculhar e iterar pelos ativos para encontrar URLs de tamanhos diferentes:

images = []

for asset in product_data["imageAssets"]:
  img_url = asset["assetUrl"]
  images.append(img_url)

print(images[0])
# "https://i5.walmartimages.com/asr/e95444a3-2e8b-41d2-a585-4f3ea9fc51b6.345fba144e9df8a6d290b2ed3857e90b.jpeg"

Isso nos permite obter todas as imagens do produto em diferentes resoluções.

Preço de raspagem e estoque

Para detalhes importantes como preço e disponibilidade, os dados estão contidos em outra tag de script:

<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.priceInfo =  {
  "priceDisplayCodes": {
    "rollback": true,
    "reducedPrice": true    
  },
  "currentPrice": {
    "currencyUnit": "USD", 
    "price": 399
  }
  ...

Podemos analisar os campos de preços:

price_data = product_data["priceInfo"]

regular_price = price_data["wasPrice"]["price"] # 499 
sale_price = price_data["currentPrice"]["price"] # 399
on_sale = "rollback" in price_data["priceDisplayCodes"] # True

print(f"On sale for {sale_price}, regular {regular_price}")

E da mesma forma para o status do estoque, contido no availabilityStatus:

in_stock = product_data["availabilityStatus"] == "IN_STOCK"

Juntando tudo isso, podemos construir scrapers para detalhes de produtos, mídia, preços, estoque e muito mais!

Evitando Bloqueios

Ao explorar o Walmart em grande escala, provavelmente encontraremos bloqueios devido a muitas solicitações. Aqui estão algumas dicas para evitar isso:

  • Limitar taxa de solicitação – atenha-se a 2 a 3 solicitações por segundo no máximo

  • Randomizar atrasos – insira atrasos aleatórios de 2 a 5 segundos entre solicitações

  • Alternar agentes de usuário – falsificar diferentes agentes de usuário do navegador de desktop

  • Usar proxies – rotear o tráfego através de serviços de proxy residencial

  • Tentar novamente em blocos – se bloqueado, pause a raspagem por mais de 30 minutos

Com essas precauções, podemos raspar milhares de produtos do Walmart com segurança.

Alguns serviços de proxy pagos também oferecem IPs e cabeçalhos rotativos avançados para evitar bloqueios. Isso pode ajudar na raspagem em maior escala.

Juntando tudo

Finalmente, vamos reunir os principais componentes em um web scraper completo do Walmart.

O fluxo geral será:

  1. Descubra produtos usando API de pesquisa e páginas de categoria
  2. Colete URLs de produtos
  3. Iterar por URLs para extrair cada página de produto
  4. Extraia detalhes, mídia, preços, inventário, etc.
  5. Salve os dados do produto copiados em CSV/JSON

Aqui está um exemplo de código:

from bs4 import BeautifulSoup
import requests, json, time, random

# Product URL extraction functions...

def scrape_search_api(query):
  # Search API logic...

def scrape_category_pages(url):
  # Category parsing logic...  

product_urls = []

product_urls.extend(scrape_search_api("laptops"))
product_urls.extend(scrape_category_pages("https://www...")) 

# Add proxies here...

for url in product_urls:

  response = requests.get(url)

  soup = BeautifulSoup(response.text, ‘html.parser‘)

  # Extract product data...

  product = {
    "name": name,
    "description": description,
    "price": price,
    "images": images,
    "in_stock": in_stock
  }

  # Save product to CSV, database, etc...

  # Random delay  
  time.sleep(random.uniform(2, 5))

Isso implementa as principais peças que abordamos:

  • Gerando URLs de produtos para alimentar o scraper
  • Analisando cada página de produto com BeautifulSoup
  • Extraindo detalhes, mídia, preços, inventário
  • Adicionando proxies e atrasos aleatórios para evitar bloqueios
  • Salvando dados copiados em arquivo

Com essa estrutura, podemos raspar e extrair milhares de produtos do Walmart de forma robusta.

O código completo conteria tratamento de erros mais avançado, multithreading, etc. Mas isso cobre a lógica central e o fluxo de trabalho.

Resumo

Neste guia, percorremos a construção de um web scraper abrangente para dados de produtos do Walmart usando Python.

As principais técnicas incluíram:

  • Usando a API de pesquisa e páginas de categoria do Walmart para gerar URLs de produtos
  • Analisar páginas de produtos e extrair detalhes, mídia, preços e inventário
  • Evitando bloqueios com proxies, atrasos e falsificações
  • Unindo pesquisa → raspagem de produto → salvar fluxo de trabalho

Essas abordagens podem extrair milhares de produtos do Walmart de forma robusta. Os dados podem então ser usados ​​para monitoramento de preços, pesquisa de mercado, dropshipping e muito mais.

Com algumas melhorias, como multithreading e armazenamento de banco de dados, você terá uma poderosa solução de raspagem do Walmart pronta para implantação em larga escala.

Tags:

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *