Salta al contenuto

Come eseguire il web scraping Walmart.com

Walmart è il più grande rivenditore al mondo con oltre 10,000 negozi in 24 paesi. Dato il suo enorme inventario e i ricchi dati sui prodotti, Walmart è un obiettivo estremamente prezioso per il web scraping.

In questa guida completa, spiegheremo come creare un web scraper per estrarre i dati dei prodotti Walmart su larga scala.

Panoramica

Ecco una rapida panoramica dei passaggi chiave che tratteremo:

  • Trovare prodotti da raschiare
    • Utilizzando l'API di ricerca Walmart
    • Analisi delle pagine delle categorie
    • Gestire i limiti dei risultati
  • Raschiare le pagine dei prodotti
    • Analisi dei dati del prodotto
    • Scraping di supporti, prezzi, specifiche, ecc.
  • Evitare il blocco
    • Ritardi randomizzati
    • Utilizzo di proxy
    • Imitare i browser reali
  • Putting It All Together
    • Cerca API → URL dei prodotti → scrape
    • Gestire set di risultati di grandi dimensioni

Alla fine, avrai uno scraper Walmart perfettamente funzionante in Python pronto per estrarre migliaia di prodotti. Iniziamo!

Impostare

Useremo Python insieme a diversi pacchetti chiave:

  • richieste – per effettuare richieste HTTP all'API e alle pagine Web di Walmart
  • bellazuppa4 – Analisi HTML
  • panda – per la manipolazione dei dati

Installali tramite pip:

pip install requests beautifulsoup4 pandas

Utilizzeremo anche proxy per evitare blocchi, che possono essere acquistati da diversi fornitori.

Trovare prodotti da raschiare

Il primo passo è scoprire gli URL o gli ID dei prodotti da inserire nel nostro raschietto. Esistono un paio di approcci che possiamo utilizzare:

Utilizzando l'API di ricerca

Walmart offre un'API di ricerca che restituisce dati JSON strutturati. Possiamo interrogare questa API per trovare prodotti che corrispondono a parole chiave.

Proviamolo per "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

Questa API restituisce risultati impaginati in un formato JSON strutturato contenente:

  • productId – l'ID Walmart per quel prodotto
  • title – nome del prodotto
  • description – breve descrizione testuale
  • price - prezzo attuale
  • E altre ancora...

Possiamo scorrere le pagine per raccogliere ID e dati.

Una limitazione è che l'API consente di recuperare solo fino a 1000 risultati. Per ottenere una maggiore copertura, dovremo utilizzare anche altri approcci.

Analisi delle pagine di categoria

Walmart fornisce anche pagine di categorie sfogliabili che possiamo analizzare:

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

Queste pagine contengono le griglie dei prodotti che vediamo sul sito Walmart.

Per estrarre i prodotti, utilizzeremo 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)

Questo analizza i prodotti della visualizzazione Griglia/Elenco, catturando il titolo e l'URL.

Possiamo quindi inserire gli URL nel nostro raschietto prodotto.

Le pagine di categoria possono contenere migliaia di prodotti su più pagine, quindi questo metodo ha un'ottima copertura.

Affrontare i limiti

Tra l'API di ricerca e le pagine delle categorie, possiamo scoprire decine di migliaia di prodotti. Ma ci sono alcuni limiti da considerare:

  • L'API di ricerca consente di recuperare solo 1000 risultati
  • Ogni pagina di categoria ha un massimo di 24 pagine, circa 50 prodotti per pagina

Quindi, per un resoconto completo, dovremo essere creativi:

  • Utilizza più query di ricerca con filtri restrittivi
  • Raschia su più pagine di categoria
  • Ampliare il campo di applicazione, ad es. raschiando tutti i laptop attraverso l'elettronica

Con un po' di iterazione, possiamo creare un ampio corpus di oltre 10,000 URL di prodotti adatti ad essere inseriti nel nostro scraper.

Raschiare le pagine dei prodotti

Una volta che abbiamo gli URL o gli ID dei prodotti, possiamo estrarre i dati dalle pagine dei prodotti stesse.

Le pagine dei prodotti Walmart contengono una ricca serie di informazioni che possiamo estrarre:

  • Descrizione del titolo
  • Immagini
  • Prezzo, dati di vendita
  • Specifiche
  • Informazioni sul venditore
  • Recensioni
  • Prodotti correlati
  • Disponibilità in magazzino

E altro ancora.

Esaminiamo raschiando alcuni pezzi chiave.

Dettagli del prodotto raschiante

Le pagine dei prodotti contengono un oggetto JavaScript chiamato window.__WML_REDUX_INITIAL_STATE__ con gran parte dei dati strutturati:

<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>

Possiamo estrarlo e analizzare il JSON per ottenere campi come:

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" 

Questo campo JSON contiene la maggior parte delle informazioni principali sul prodotto che vorremmo estrarre.

Raschiatura dei supporti

I media del prodotto come le immagini sono contenuti in un altro blocco di 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>

Possiamo scorrere e scorrere le risorse per trovare URL di diverse dimensioni:

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"

Questo ci consente di ottenere tutte le immagini dei prodotti con risoluzioni diverse.

Raschiatura del prezzo e dell'inventario

Per i dettagli chiave come prezzi e disponibilità, i dati sono contenuti in un altro tag script:

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

Possiamo analizzare i campi dei prezzi:

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 allo stesso modo per lo stato delle scorte, contenuto nel file availabilityStatus:

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

Mettendo insieme tutto questo, possiamo creare scraper per dettagli di prodotto, media, prezzi, inventario e altro ancora!

Evitare i blocchi

Quando eseguiamo lo scraping di Walmart su larga scala, probabilmente incontreremo blocchi dovuti a troppe richieste. Ecco alcuni suggerimenti per evitare questo:

  • Limita il tasso di richiesta – attenersi a 2-3 richieste al secondo max

  • Randomizza i ritardi – inserire ritardi casuali di 2-5 secondi tra le richieste

  • Ruota gli agenti utente – falsificare diversi agenti utente del browser desktop

  • Usa i proxy – instradare il traffico attraverso servizi proxy residenziali

  • Riprova sui blocchi – se bloccato, sospendere la raschiatura per più di 30 minuti

Con queste precauzioni, possiamo raschiare migliaia di prodotti Walmart in sicurezza.

Alcuni servizi proxy a pagamento offrono anche IP e intestazioni rotanti avanzati per evitare blocchi. Questi possono aiutare per la raschiatura su larga scala.

Putting It All Together

Infine, colleghiamo insieme i componenti chiave in un web scraper Walmart completo.

Il flusso generale sarà:

  1. Scopri i prodotti utilizzando l'API di ricerca e le pagine delle categorie
  2. Raccogli gli URL dei prodotti
  3. Scorri gli URL per analizzare la pagina di ogni prodotto
  4. Estrai dettagli, media, prezzi, inventario, ecc.
  5. Salva i dati del prodotto raschiati in CSV/JSON

Ecco il codice di esempio:

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

Questo implementa i pezzi chiave che abbiamo trattato:

  • Generazione di URL di prodotti da inserire nello scraper
  • Analisi di ogni pagina di prodotto con BeautifulSoup
  • Estrazione di dettagli, media, prezzi, inventario
  • Aggiunta di proxy e ritardi casuali per evitare blocchi
  • Salvataggio dei dati raschiati su file

Con questa struttura, possiamo raschiare ed estrarre migliaia di prodotti Walmart in modo affidabile.

Il codice completo conterrebbe una gestione degli errori più avanzata, multithreading ecc. Ma questo copre la logica principale e il flusso di lavoro.

Sommario

In questa guida abbiamo illustrato la creazione di un web scraper completo per i dati dei prodotti Walmart utilizzando Python.

Le tecniche chiave includevano:

  • Utilizzo dell'API di ricerca e delle pagine delle categorie di Walmart per generare URL di prodotti
  • Analisi delle pagine dei prodotti ed estrazione di dettagli, media, prezzi e inventario
  • Evitare blocchi con proxy, ritardi e spoofing
  • Combinando ricerca → scrap del prodotto → salvataggio del flusso di lavoro

Questi approcci possono estrarre in modo affidabile migliaia di prodotti Walmart. I dati possono quindi essere utilizzati per il monitoraggio dei prezzi, ricerche di mercato, dropshipping e altro ancora.

Con alcuni miglioramenti come il multithreading e l'archiviazione di database, avrai una potente soluzione di scraping Walmart pronta per l'implementazione su larga scala.

Tag:

Partecipa alla conversazione

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *