Meteen naar de inhoud

Hoe Walmart.com op internet te schrapen

Walmart is 's werelds grootste retailer met meer dan 10,000 winkels in 24 landen. Gezien zijn enorme voorraad en rijke productgegevens is Walmart een uiterst waardevol doelwit voor webscraping.

In deze uitgebreide handleiding laten we zien hoe u een webschraper kunt bouwen om Walmart-productgegevens op grote schaal te extraheren.

Overzicht

Hier volgt een kort overzicht van de belangrijkste stappen die we behandelen:

  • Producten vinden om te schrapen
    • Met behulp van de Walmart-zoek-API
    • Categoriepagina's parseren
    • Omgaan met resultaatgrenzen
  • Productpagina's schrapen
    • Productgegevens parseren
    • Schrapende media, prijzen, specificaties enz.
  • Blokkeren vermijden
    • Willekeurige vertragingen
    • Proxy's gebruiken
    • Het nabootsen van echte browsers
  • Alles bij Elkaar
    • Zoek-API → product-URL's → scrape
    • Omgaan met grote resultatensets

Tegen het einde heb je een volledig functionerende Walmart-schraper in Python, klaar om duizenden producten te extraheren. Laten we beginnen!

Setup

We zullen gebruiken Python samen met verschillende belangrijke pakketten:

  • verzoeken – voor het doen van HTTP-verzoeken aan de API en webpagina's van Walmart
  • mooie soep4 – HTML-parsering
  • panda's – voor gegevensmanipulatie

Installeer ze via pip:

pip install requests beautifulsoup4 pandas

We zullen ook gebruiken proxies om blokkades te voorkomen, deze zijn bij verschillende aanbieders te koop.

Producten vinden om te schrapen

De eerste stap is het ontdekken van product-URL's of ID's die u in onze scraper kunt invoeren. Er zijn een aantal benaderingen die we kunnen gebruiken:

Met behulp van de zoek-API

Walmart biedt een zoek-API die gestructureerde JSON-gegevens retourneert. We kunnen deze API doorzoeken om producten te vinden die overeenkomen met trefwoorden.

Laten we het eens proberen voor "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

Deze API retourneert gepagineerde resultaten in een gestructureerd JSON-formaat met daarin:

  • productId – de Walmart-ID voor dat product
  • title – naam van het product
  • description – korte tekstbeschrijving
  • price - huidige prijs
  • En meer ...

We kunnen pagina's doorlopen om ID's en gegevens te verzamelen.

Eén beperking is dat de API slechts maximaal 1000 resultaten kan ophalen. Om meer dekking te krijgen, zullen we ook andere benaderingen moeten gebruiken.

Categoriepagina's parseren

Walmart biedt ook doorzoekbare categoriepagina's die we kunnen analyseren:

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

Deze pagina's bevatten de productrasters die we op de Walmart-site zien.

Om producten te extraheren, gebruiken we 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)

Hiermee worden de producten uit de raster-/lijstweergave geparseerd, waarbij de titel en URL worden opgehaald.

We kunnen de URL's vervolgens in onze productschraper invoeren.

Categoriepagina's kunnen duizenden producten op vele pagina's bevatten, dus deze methode heeft een grote dekking.

Omgaan met grenzen

Tussen de zoek-API en categoriepagina's kunnen we duizenden producten ontdekken. Maar er zijn enkele beperkingen waarmee u rekening moet houden:

  • Met de zoek-API kunnen slechts 1000 resultaten worden opgehaald
  • Elke categoriepagina heeft maximaal 24 pagina's, ~50 producten per pagina

Dus voor een uitgebreid overzicht moeten we creatief zijn:

  • Gebruik meerdere zoekopdrachten met verfijningsfilters
  • Schraap over meerdere categoriepagina's
  • Vergroot de reikwijdte, bijv. alle laptops door de elektronica schrappen

Met een beetje iteratie kunnen we een groot corpus van meer dan 10,000 product-URL's opbouwen die geschikt zijn om in onze scraper te verwerken.

Productpagina's schrapen

Zodra we product-URL's of ID's hebben, kunnen we de gegevens van de productpagina's zelf schrapen.

Walmart-productpagina's bevatten een rijke reeks informatie die we kunnen extraheren:

  • Titel beschrijving
  • Afbeeldingen
  • Prijs, verkoopgegevens
  • Specificaties
  • Verkoper info
  • Recensies
  • Vergelijkbare producten
  • Voorraad

En meer.

Laten we eens kijken naar het schrapen van enkele belangrijke stukken.

Productdetails schrapen

Productpagina's bevatten een JavaScript-object genaamd window.__WML_REDUX_INITIAL_STATE__ met veel van de gestructureerde gegevens:

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

We kunnen dit extraheren en de JSON parseren om velden te krijgen zoals:

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" 

Dit JSON-veld bevat de meeste kernproductinformatie die we eruit zouden willen halen.

Media schrapen

De productmedia zoals afbeeldingen zijn opgenomen in een ander scriptblok, imageAssets:

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

We kunnen de items doorzoeken en herhalen om de URL's van verschillende groottes te vinden:

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"

Hierdoor kunnen we alle productafbeeldingen in verschillende resoluties krijgen.

Prijs en voorraad schrappen

Voor belangrijke details zoals prijzen en beschikbaarheid zijn de gegevens opgenomen in nog een andere scripttag:

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

We kunnen de prijsvelden ontleden:

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

En hetzelfde geldt voor de voorraadstatus, opgenomen in de availabilityStatus:

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

Als we dit allemaal bij elkaar optellen, kunnen we schrapers bouwen voor productdetails, media, prijzen, inventaris en meer!

Blokken vermijden

Wanneer we Walmart op grote schaal schrappen, zullen we waarschijnlijk blokkades tegenkomen van te veel verzoeken. Hier zijn enkele tips om dit te voorkomen:

  • Beperk het verzoekpercentage – houd je aan maximaal 2-3 verzoeken per seconde

  • Willekeurige vertragingen – voeg willekeurige vertragingen van 2-5 seconden in tussen verzoeken

  • Roteer user-agents – verschillende gebruikersagenten van desktopbrowsers vervalsen

  • Gebruik proxy's – verkeer routeren via residentiële proxydiensten

  • Probeer opnieuw op blokken – indien geblokkeerd, pauzeer het schrapen gedurende 30+ minuten

Met deze voorzorgsmaatregelen kunnen we duizenden Walmart-producten veilig schrapen.

Sommige betaalde proxydiensten bieden ook geavanceerde roterende IP’s en headers om blokkades te voorkomen. Deze kunnen helpen bij het schrapen op grotere schaal.

Alles bij Elkaar

Laten we tot slot de belangrijkste componenten samenvoegen tot een complete Walmart-webschraper.

De algemene stroom zal zijn:

  1. Ontdek producten met behulp van de zoek-API en categoriepagina's
  2. Verzamel product-URL's
  3. Herhaal URL's om elke productpagina te schrapen
  4. Extraheer details, media, prijzen, inventaris etc.
  5. Sla geschraapte productgegevens op in CSV/JSON

Hier is een voorbeeldcode:

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

Hiermee worden de belangrijkste onderdelen geïmplementeerd die we hebben behandeld:

  • Product-URL's genereren om in de scraper te voeren
  • Parseren van elke productpagina met BeautifulSoup
  • Extraheren van details, media, prijzen, inventaris
  • Proxy's en willekeurige vertragingen toevoegen om blokkades te voorkomen
  • Geschrapte gegevens opslaan in bestand

Met deze structuur kunnen we duizenden Walmart-producten robuust schrapen en extraheren.

De volledige code zou meer geavanceerde foutafhandeling, multithreading enz. bevatten. Maar dit omvat de kernlogica en de workflow.

Samengevat

In deze handleiding hebben we met Python een uitgebreide webschraper voor Walmart-productgegevens gebouwd.

De belangrijkste technieken omvatten:

  • De zoek-API en categoriepagina's van Walmart gebruiken om product-URL's te genereren
  • Productpagina's parseren en details, media, prijzen en voorraad extraheren
  • Blokkades met proxy's, vertragingen en spoofing vermijden
  • Zoekopdracht aan elkaar koppelen → product schrapen → workflow opslaan

Deze benaderingen kunnen duizenden Walmart-producten op robuuste wijze extraheren. De gegevens kunnen vervolgens worden gebruikt voor prijsmonitoring, marktonderzoek, dropshipping en meer.

Met een paar verbeteringen, zoals multithreading en databaseopslag, beschikt u over een krachtige Walmart-scraping-oplossing die klaar is voor grootschalige implementatie.

Tags:

Doe mee aan het gesprek

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd *