Walmart ændrer priserne på nogle varer flere gange om dagen. Hvis du nogensinde har prøvet at følge med programmatisk, kender du smerten: dit script virker i 20 minutter, og så begynder det stille og roligt at returnere CAPTCHA-sider, der er forklædt som almindelige 200 OK-svar.
Jeg har brugt rigtig meget tid på at arbejde mig gennem Walmarts anti-bot-forsvar som en del af vores dataudtræksarbejde hos Thunderbit, og jeg vil gerne dele alt det, jeg har lært — de metoder, der faktisk virker i 2025, de tavse fejl, der forgifter dine data, og de ærlige kompromiser mellem at skrive din egen scraper, betale for et scraping-API og bare bruge et no-code-værktøj. Denne guide gennemgår tre udtræksmetoder (HTML-parsing, __NEXT_DATA__ JSON og interception af interne API’er), produktionsklar fejlhåndtering, som de fleste tutorials springer helt over, og en nøgtern beslutningsramme til at vælge den rigtige tilgang. Der er noget her, uanset om du skriver Python eller bare vil have et regneark fuldt af priser inden frokost.
Hvorfor scrape Walmart med Python?
Walmart er verdens største detailhandler målt på omsætning — 680,985 milliarder dollars i regnskabsåret 2025 og har holdt #1-pladsen på Fortune Global 500 i 12 år i træk. Sitet rummer omkring 420 millioner aktive annoncer, og Walmarts CFO har omtalt "en halv milliard SKU’er" på markedspladsen. Omkring 95% af disse annoncer kommer fra tredjepartssælgere, hvilket betyder, at kataloget er meget dynamisk — sælgere forsvinder, varianter ændrer sig, og lagerstatus skifter dagligt.

Den ustabilitet er netop grunden til, at scraping er vigtigt. En kvartalsrapport kan ikke fange det, som en natlig scraping kan. Her er de mest almindelige use cases, jeg ser:
| Brugssag | Hvem har brug for det | Hvad de udtrækker |
|---|---|---|
| Overvågning af konkurrentpriser | E-handelsdrift, repriseringsværktøjer | Priser, kampagner, MAP-overholdelse |
| Berigelse af produktkatalog | Salgs- og merchandisingteams | Beskrivelser, billeder, specifikationer, varianter |
| Sporing af lagerstatus | Supply chain, dropshippere | Lagerstatus, sælgerinformation |
| Markedsundersøgelser og trendanalyse | Marketing, produktchefer | Bedømmelser, anmeldelser, kategorisortiment |
| Leadgenerering | Salgsteams | Sælgernavne, antal produkter, kategorier |
Markedet for software til overvågning af konkurrentpriser alene nåede 1,92 milliarder dollars i 2025 og forventes at vokse til 5,09 milliarder dollars i 2033. Forbrugeradfærd driver investeringen: 94% af kunder sammenligner priser, når de handler online, og 83% sammenligner på tværs af flere sider.
Python er standardsproget til det her arbejde. Apifys Infrastructure Report 2026 anslår, at Python står for 71,7% af al web scraping, og kernebiblioteket (requests) henter omkring 30 millioner downloads om ugen. Hvis du scraper i nogen som helst skala, gør du det næsten sikkert i Python.
Hvorfor Walmart er et af de sværeste sites at scrape
Walmart er særligt svært, fordi sitet kører to kommercielle anti-bot-produkter i serie: Akamai Bot Manager som edge WAF og TLS-fingeraftrykslag, og PerimeterX (omdøbt til HUMAN Security) som det adfærdsbaserede JavaScript-challenge-lag. Scrape.do kalder kombinationen “sjælden og ekstremt svær at omgå”.

ScrapeOps giver Walmart 9/10 i samlet scraping-sværhedsgrad, med Akamai alene på 9/10. Efter min erfaring passer det meget godt.
Her er, hvad du faktisk står over for:
Akamai Bot Manager inspicerer dit TLS-fingeraftryk (JA3/JA4-hash), HTTP/2-rammernes rækkefølge, header-rækkefølge og store/små bogstaver samt sessionscookies (_abck, ak_bmsc). Et standard Python-requests-kald sender et TLS-fingeraftryk, som ingen rigtig browser producerer — Akamai markerer det, før din anmodning overhovedet når Walmarts servere.
PerimeterX/HUMAN kører efter Akamai og udfører JavaScript-fingerprinting (px.js), som tjekker navigator-egenskaber, canvas-rendering, WebGL, audio context og adfærdsbiometri (musebevægelser, scrollhastighed, tastetryk-dynamik). Det synlige resultat er den berygtede [“Press & Hold”]-challenge](https://oxylabs.io/blog/how-to-scrape-walmart-data) — en knap, du skal holde nede i cirka 10 sekunder, mens adfærds-signalerne bliver samplet. Oxylabs er kontant: “Walmart bruger ‘Press & Hold’-modellen for CAPTCHA, leveret af PerimeterX, som er kendt for at være næsten umulig at løse fra kode.”
Den virkelig farlige adfærd er den tavse blokering. Walmart returnerer HTTP 200 med en CAPTCHA-body i stedet for en 403. ScrapingBee bekræfter: “Walmart returnerer en 200 OK-statuskode, selv når den serverer en CAPTCHA-side. Du kan ikke stole på statuskoden alene for at vide, om din anmodning lykkedes.” Dit script parser gladeligt CAPTCHA-HTML som “produkt ikke fundet” og går videre. Halvdelen af dit dataset er skrammel, og du ved det ikke.
Så er der det butiksafhængige dataproblem. Walmarts priser og lagerstatus er lokationsbestemte og styres af cookies som locDataV3 og assortmentStoreId. Uden de rigtige cookies får du “standard national” data, som kan se komplet ud, men ikke matcher det, rigtige kunder ser. Manglende cookies giver ikke en blokside — de giver forkerte data uden synlig fejl, og det er værre.
Tre metoder til at udtrække data fra Walmart (og hvordan de sammenlignes)
Før trin-for-trin-guiden er her de tre primære udtræksmetoder. De fleste konkurrenttutorials dækker kun én eller to. Jeg gennemgår alle tre, så du kan vælge den, der passer til din situation.
| Metode | Pålidelighed | Dækning af data | Anti-bot-sværhedsgrad | Vedligeholdelsesbyrde |
|---|---|---|---|---|
| HTML + BeautifulSoup | ⚠️ Lav (selektorer bryder ved hver deploy) | Moderat | Høj | Høj |
__NEXT_DATA__ JSON | ✅ God | Høj | Middel-høj | Middel |
| Interception af interne API’er | ✅ Bedst | Højest (varianter, lager, anmeldelser) | Middel-høj | Lav (struktureret JSON) |
| Thunderbit (no-code) | ✅ God | Høj | Lav (håndteres af AI) | Ingen |
HTML-parsing er den dårligste løsning til Walmart — sitet leverer Next.js-bundler med hashede CSS-klassenavne, der ændrer sig ved hver deploy. __NEXT_DATA__-JSON-metoden er det pragmatiske valg, som alle seriøse open-source Walmart-scrapere fra 2024–2026 bruger. Interception af interne API’er er den mest kraftfulde metode, men kommer med forbehold, som de fleste tutorials glatter over. Og Thunderbit er det rigtige valg, når du slet ikke har brug for en custom pipeline.
Prøv Thunderbit til Walmart-scraping
Opsætning af dit Python-miljø til at scrape Walmart
Det skal du bruge:
- Sværhedsgrad: Mellem
- Tidsforbrug: Ca. 30 minutter til opsætning, plus kodning
- Det skal du have: Python 3.10+, pip, en kodeeditor og (til produktionsbrug) en proxyservice eller scraping-API
Opret din projektmappe og dit virtuelle miljø:
mkdir walmart-scraper && cd walmart-scraper
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
Installer de nødvendige biblioteker:
pip install curl_cffi parsel beautifulsoup4 lxml
curl_cffi er standarden i 2025 til scraping af hårde targets. Det er en libcurl-binding, der kan efterligne præcise browser-TLS-fingeraftryk. Bright Data forklarer: “Walmart bruger TLS-fingerprinting som en del af sin bot-detektion, og selv hvis du sætter User-Agent til at ligne en rigtig browser, omgår du det ikke.” Almindelige requests eller httpx kan ikke passere Akamai, uanset hvilke headers du sætter. curl_cffi med impersonate="chrome124" er det, der gør forskellen.
Du vil også have json (indbygget), csv (indbygget), time, random og logging til de produktionsmønstre, vi gennemgår senere.
Trin for trin: Scrape Walmarts produktsider med Python
Trin 1: Hent Walmarts produktside
Din første opgave er at lave en HTTP-anmodning, der ikke bliver blokeret med det samme. Her er det klassiske sæt headers, som bruges på tværs af Scrapfly, Scrapingdog, Oxylabs og ScrapeOps i 2024–2026:
from curl_cffi import requests
HEADERS = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/124.0.0.0 Safari/537.36"
),
"Accept": (
"text/html,application/xhtml+xml,application/xml;q=0.9,"
"image/avif,image/webp,*/*;q=0.8"
),
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Referer": "https://www.google.com/",
}
session = requests.Session(impersonate="chrome124")
url = "https://www.walmart.com/ip/Apple-AirPods-Pro-2nd-Generation/1752657021"
response = session.get(url, headers=HEADERS)
Parameteren impersonate="chrome124" gør det tunge arbejde her. Den fortæller curl_cffi, at den skal matche Chrome 124’s præcise TLS ClientHello, HTTP/2-frame-rækkefølge og pseudo-header-sekvens. Uden den ser Akamai en Python-specifik JA3-hash og blokerer dig, før din anmodning overhovedet når Walmarts applikationslag.
Sådan ser et blokeret svar ud: Hvis du ser "Robot or human?" i sidetitlen i HTML-svaret, eller hvis svaret omdirigerer til walmart.com/blocked, er du blevet fanget. Det tricky er, at Walmart ofte returnerer en 200-statuskode med CAPTCHA-bodyen — så det er ikke nok at tjekke response.ok.
Ved al produktion eller gentagen brug skal du bruge residential proxies. Datacenter-IP’er bliver brændt med det samme af Akamais IP-reputationssystem. Jeg gennemgår den fulde fejlhåndtering og proxystrategi i produktionsafsnittet nedenfor.
Trin 2: Parse produktdata fra __NEXT_DATA__ JSON
Walmart.com er en Next.js-applikation, og den server-renderede HTML indlejrer hele hydration-payloaden i én enkelt script-tag: <script id="__NEXT_DATA__" type="application/json">. Det er guldkassen.
Scrapflys guide fra 2026 bekræfter: “I 2026 bruger Walmart Next.js med struktureret JSON i __NEXT_DATA__-script tags, hvilket gør udtræk af skjulte data mere pålideligt end traditionel parsing med CSS-selektorer.” Alle højtprofilerede open-source Walmart-scrapere — Scrapflys, Oxylabs’, python-scrapy-playbooks — bruger denne metode.
Sådan udtrækker du det:
import json
from parsel import Selector
sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})
De fleste tutorials stopper her. Nedenfor er et fuldt JSON-path-kort for de felter, du faktisk har brug for — verificeret mod live Walmart-sider i 2024–2026:
| Datafelt | JSON-sti (under initialData) | Type | Noter |
|---|---|---|---|
| Produktnavn | data > product > name | Streng | — |
| Mærke | data > product > brand | Streng | — |
| Aktuel pris (tal) | data > product > priceInfo > currentPrice > price | Flydende tal | Kan variere afhængigt af butiks-cookie |
| Aktuel pris (streng) | data > product > priceInfo > currentPrice > priceString | Streng | Formateret, f.eks. "$9.99" |
| Kort beskrivelse | data > product > shortDescription | HTML-streng | Parse med BeautifulSoup for tekst |
| Lang beskrivelse | data > idml > longDescription | HTML-streng | Ligger på idml, IKKE inde i product — det er fælden, ældre tutorials tager fejl i |
| Alle billeder | data > product > imageInfo > allImages | Array | Liste af {id, url}-objekter |
| Gennemsnitlig bedømmelse | data > product > averageRating | Flydende tal | Nøglen er averageRating, ikke den gamle rating |
| Antal anmeldelser | data > product > numberOfReviews | Heltal | — |
| Varianter | data > product > variantCriteria | Array | Valggrupper (størrelse, farve) |
| Tilgængelighed | data > product > availabilityStatus | Streng | IN_STOCK, OUT_OF_STOCK, LIMITED_STOCK |
| Sælger | data > product > sellerDisplayName | Streng | — |
| Producent | data > product > manufacturerName | Streng | — |
Stien longDescription er den fælde, der fanger folk. Et indlæg fra ScrapeHero i 2023 placerede den på product.longDescription, men kilder fra 2024+ lægger den konsekvent på det søsterfelt, idml. Læs altid idml.longDescription først og fald tilbage til product.longDescription på ældre sider.
Her er det sikre udtræksmønster med .get()-kæder:
def extract_product(data):
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})
price_info = product.get("priceInfo", {})
current_price = price_info.get("currentPrice", {})
image_info = product.get("imageInfo", {})
return {
"name": product.get("name"),
"brand": product.get("brand"),
"price": current_price.get("price"),
"price_string": current_price.get("priceString"),
"short_desc": product.get("shortDescription"),
"long_desc": idml.get("longDescription", product.get("longDescription")),
"images": [img.get("url") for img in image_info.get("allImages", [])],
"rating": product.get("averageRating"),
"review_count": product.get("numberOfReviews"),
"variants": product.get("variantCriteria"),
"availability": product.get("availabilityStatus"),
"seller": product.get("sellerDisplayName"),
"manufacturer": product.get("manufacturerName"),
}
For brugere, der slet ikke vil arbejde med JSON-path-navigation, identificerer og strukturerer Thunderbits AI disse felter automatisk — ingen manuel path-mapping nødvendig. Du klikker på “AI Suggest Fields”, den læser siden, og du får en tabel. Men hvis du bygger en custom pipeline, er kortet ovenfor din reference.
Trin 3: Intercept Walmarts interne API-endpoints for mere data
Ingen konkurrerende artikel dækker denne metode ordentligt. Det er den mest kraftfulde udtræksvej — og den mest komplicerede.
Walmarts frontend kalder et federeret GraphQL-backend bygget på Apollo Gateway. Endpoints ligger under www.walmart.com/orchestra/*:
/orchestra/pdp/graphql/...— hydration af produktdetaljer + skift mellem varianter/orchestra/snb/graphql/...— pagination til søg-og-browse/orchestra/reviews/graphql/...— paginerede anmeldelser
Disse returnerer ren, struktureret JSON med data, som __NEXT_DATA__ nogle gange afkorter — pris på varianteniveau, lagerstatus i realtid, fuld pagination af anmeldelser.
Finten, som blogindlæg danser omkring: Walmart bruger Apolos persisted queries. Request-bodyen sender kun en SHA-256-hash (persistedQuery.sha256Hash), ikke selve query-teksten. Hvis hash’en ikke er kendt af serveren, får du PersistedQueryNotFound. Walmart roterer disse hashes ved deploys. Derfor publicerer ingen af de højtprofilerede open-source Walmart-scrapere kopiér-og-indsæt-venlig /orchestra/-kode.
Den praktiske og ærlige version af metoden er en DevTools-øvelse:
- Åbn en Walmart-produktside i Chrome
- Åbn DevTools → Network-fanen, og filtrér efter “Fetch/XHR”
- Brows siden normalt — klik på varianter, scroll til anmeldelser, skift butikslokation
- Hold øje med requests til
/orchestra/*-endpoints, der returnerer JSON med produktdata - Højreklik på requesten → “Copy as cURL”
- Konvertér cURL-kommandoen til Python med
curl_cffi
Sådan ser et genspillet API-kald ud:
import json
from curl_cffi import requests
session = requests.Session(impersonate="chrome124")
# Først: varm sessionen op ved at besøge produktsiden
session.get("https://www.walmart.com/ip/some-product/1234567", headers=HEADERS)
# Derefter: genspil det interne API-kald (kopieret fra DevTools)
api_url = "https://www.walmart.com/orchestra/pdp/graphql"
api_headers = {
**HEADERS,
"accept": "application/json",
"content-type": "application/json",
"referer": "https://www.walmart.com/ip/some-product/1234567",
"wm_qos.correlation_id": "your-copied-correlation-id",
}
payload = {
# Indsæt den præcise request-body fra DevTools
"variables": {"productId": "1234567"},
"extensions": {
"persistedQuery": {
"version": 1,
"sha256Hash": "the-hash-you-copied"
}
}
}
api_response = session.post(api_url, headers=api_headers, json=payload)
api_data = api_response.json()
Trinnet med at varme sessionen op er kritisk. Walmarts PerimeterX-cookies (_px3, _pxhd, ACID) skal sættes ved den første HTML-hentning, før API-kaldet kan lykkes. Uden dem får du en 412 eller 403.
Hvornår skal du bruge metoden: Når du har brug for data, som __NEXT_DATA__ ikke indeholder — dyb variantprissætning, paginerede anmeldelser ud over den første batch eller lagerantal i realtid. Til de fleste use cases er __NEXT_DATA__ tilstrækkeligt og langt simplere.
Scraping af Walmarts søgeresultater og flere sider
Søgeresultater følger et lignende __NEXT_DATA__-mønster, men med en anden JSON-sti:
search_url = "https://www.walmart.com/search?q=laptops&page=1"
response = session.get(search_url, headers=HEADERS)
sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)
search_result = data["props"]["pageProps"]["initialData"]["searchResult"]
items = search_result["itemStacks"][0]["items"]
# Filtrér sponsorerede produkter fra
organic_items = [i for i in items if i.get("__typename") == "Product"]
for item in organic_items:
print(item.get("name"), item.get("priceInfo", {}).get("currentPrice", {}).get("price"))
Pagination fungerer ved at øge page-parameteren: &page=1, &page=2 osv. Men her er den udokumenterede grænse: Walmart begrænser søgeresultater til 25 sider uanset det faktiske totale antal. Scrapfly bekræfter: “Walmart sætter det maksimale antal resultatsider, der kan tilgås, til 25, uanset det samlede antal tilgængelige sider.”
Workarounds til dybere dækning:
- Skift sorteringsrækkefølge: Kør samme søgning med
&sort=price_lowog derefter&sort=price_highfor at få cirka 50 siders dækning - Opdeling efter prisinterval: Tilføj
&min_price=X&max_price=Yfor at bryde kataloget op i mindre vinduer - Opdeling efter kategori: Søg inden for specifikke kategorier i stedet for på tværs af hele sitet
Bemærk, at itemStacks er et array. Scrapfly hardcoder [0] i deres repo, men kategori- og browse-sider indeholder nogle gange flere stacks (“Top picks,” “More results”). Det robuste mønster itererer over alle stacks:
for stack in search_result.get("itemStacks", []):
for item in stack.get("items", []):
if item.get("__typename") == "Product":
# behandl item
pass
Det er også værd at bemærke, at Walmarts robots.txt forbyder /search. Produktsider (/ip/...) og de fleste kategorisider (/cp/...) er ikke forbudt. Hvis du er bekymret for compliance, så start med produktsider og kategoritræer i stedet for søgning.
Lad ikke tavse blokeringer ødelægge dine data: Produktionsklar fejlhåndtering
De fleste tutorials falder fra hinanden her. De viser dig, hvordan du henter én side, parser ét produkt og kalder det en dag. I produktion henter du tusindvis af sider, og Walmart prøver aktivt at stoppe dig. Forskellen mellem en demo-scraper og en scraper, der faktisk virker, er, hvordan den håndterer fejl.
Opdag tavse blokeringer, før de korrumperer dine data
Den vigtigste funktion i en Walmart-scraper er block-detektoren. Baseret på konsensus på tværs af ScrapingBee, Scrapingdog, Oxylabs og Decodo, har du brug for fire uafhængige checks:
BLOCK_MARKERS = (
"Robot or human",
"Press & Hold",
"Press & Hold",
"px-captcha",
"perimeterx",
)
def is_walmart_blocked(response) -> bool:
# 1. Omdirigering til det dedikerede blok-endpoint
if "/blocked" in str(response.url):
return True
# 2. Hårde statuskoder
if response.status_code in (403, 412, 428, 429, 503):
return True
# 3. 200 OK med CAPTCHA-body (tilfældet med tavs blokering)
body = response.text or ""
if any(m.lower() in body.lower() for m in BLOCK_MARKERS):
return True
# 4. Rimelighedstjek på svarlængde — rigtige PDP’er er 300–900 KB
if len(response.content) < 50_000 and "/ip/" in str(response.url):
return True
return False
Det fjerde tjek — svarlængde — fanger de tilfælde, hvor Walmart returnerer en afskallet side, der ikke indeholder nogen åbenlyse CAPTCHA-markører, men heller ikke de produktdata, du har brug for.
Retry-logik med eksponentiel backoff og jitter
Når en anmodning fejler, skal du ikke hamre Walmart med det samme. Standardmønsteret bruger eksponentiel backoff med jitter for at desynkronisere retries:
import time
import random
import logging
from curl_cffi import requests as cffi_requests
log = logging.getLogger("walmart")
def fetch_with_retry(session, url, max_retries=5, base_delay=2, max_delay=60):
for attempt in range(max_retries):
try:
response = session.get(url, headers=HEADERS, timeout=15)
if response.status_code in (429, 503):
raise Exception(f"Throttled: {response.status_code}")
if is_walmart_blocked(response):
raise Exception("Tavs blokering opdaget")
return response
except Exception as e:
if attempt == max_retries - 1:
raise
wait = min(max_delay, base_delay * (2 ** attempt)) + random.uniform(0, 3)
log.warning(f"Forsøg {attempt + 1} fejlede: {e}. Prøver igen om {wait:.1f}s")
time.sleep(wait)
return None
Jitteren (random.uniform(0, 3)) er ikke kosmetisk — den desynkroniserer workers, så en hel flok scrapers ikke pulserer ind i det samme sekund og udløser Akamais hastighedsdetektorer.
Rate limiting
Både Thunderbit og Scrape.do lander på en tilfældig forsinkelse på 3–6 sekunder pr. anmodning for Walmart: “begræns dine requests ved at vente 3–6 sekunder mellem sideindlæsninger og randomisér dine forsinkelser.”
import time
import random
def rate_limited_fetch(session, url):
response = fetch_with_retry(session, url)
time.sleep(random.uniform(3.0, 6.0))
return response
I stor skala kan du overveje aiolimiter til asynkron rate limiting:
from aiolimiter import AsyncLimiter
limiter = AsyncLimiter(max_rate=10, time_period=60) # 10 requests per minut
Datavalidering
Selv når svaret ikke er blokeret, kan de parserede data stadig være forkerte (forkert butik, degraderet payload). Validér før du skriver til output:
def validate_product(product):
"""Returnerer True, hvis produktdata ser legitime ud."""
if not product.get("name"):
return False
price = (product.get("priceInfo") or {}).get("currentPrice", {}).get("price")
if not isinstance(price, (int, float)) or price <= 0:
return False
if product.get("availabilityStatus") not in ("IN_STOCK", "OUT_OF_STOCK", "LIMITED_STOCK"):
return False
return True
Sessionslogning
Track din succesrate pr. session. Når den falder under 80% i 10 minutter, er der sket noget — enten er din IP brændt, dine cookies er udløbet, eller Walmart har udrullet en ny anti-bot-regel.
class ScrapeMetrics:
def __init__(self):
self.total = 0
self.success = 0
self.blocks = 0
self.errors = 0
def record(self, result):
self.total += 1
if result == "success":
self.success += 1
elif result == "blocked":
self.blocks += 1
else:
self.errors += 1
@property
def success_rate(self):
return (self.success / self.total * 100) if self.total > 0 else 0
def check_health(self):
if self.total > 20 and self.success_rate < 80:
log.critical(f"Succesraten faldt til {self.success_rate:.1f}% — overvej at rotere proxies eller sætte pause")
Ikke glamourøst. Men det er det, der holder dine data rene.
DIY Python vs. scraping-API vs. no-code: Vælg den rigtige måde at scrape Walmart på
Mange udviklere kaster sig direkte ud i at skrive en custom scraper uden først at spørge, om det faktisk er det rigtige valg. ScrapeOps giver Walmart 9/10 i sværhedsgrad. Forumbrugere beskriver det som “dybest set 9/10” og spørger, om et dedikeret web-scraping-API ville være overkill. Svaret afhænger af volumen, budget og engineering-kapacitet.
| Faktor | DIY Python (requests + proxies) | Scraping-API (Oxylabs, Bright Data osv.) | No-code-værktøj (Thunderbit) |
|---|---|---|---|
| Opsætningstid til første række | Timer | 15–60 min | Ca. 2 min |
| Opsætningstid til produktion | 40–80 timer | 4–16 timer | Ca. 30 min |
| Håndtering af anti-bot | Du håndterer det (svært) | Håndteres af leverandøren | Håndteres automatisk |
| Pris i lille skala (<1K sider/md.) | Lav (proxyomkostninger ca. $4–8/GB) | Startpakker på $40–$49/md. | Gratis–$15/md. |
| Pris i skala (100K+ sider/md.) | Lavere pr. request | Højere pr. request | Varierer |
| Tilpasning | Fuld kontrol | API-parametre | Begrænset af UI/felter |
| Løbende vedligehold | 4–8 timer/md. | Næsten nul | Ingen (AI tilpasser sig) |
| Bedst til | Udviklere, der bygger custom pipelines | Produktion i mellemstor skala | Forretningsbrugere, hurtige engangsudtræk |
Hvornår DIY Python giver mening
DIY vinder, når du allerede har en proxykontrakt, har brug for streng kontrol over headers, postnummer-targeting eller sælgergrupper, indekserer millioner af sider om måneden, hvor API-omkostninger pr. record bliver store, eller har brug for on-prem eller compliance-garantier. Kompromiset er reel engineering-tid: En produktionsklar Scrapy-spider med pagination, retries, proxy rotation, TLS-impersonation og flere schemas for sidetyper tager 40–80 timers senior Python-arbejde, plus 4–8 timer om måneden til vedligeholdelse, når Walmart roterer fingeraftryk.
Hvornår et scraping-API sparer dig tid
Scraping-API’er håndterer anti-bot-laget, så du slipper. ScrapeOps’ benchmarks viser succesrater på 99% for Zyte API og 98% for Scrape.do på Walmart. Startpriser ligger på $40–$49/måned for værktøjer som ScraperAPI, Oxylabs og Scrapingdog. Hvis I er et team på 2–5 ingeniører, og scrapingvolumen er 10K–1M sider om måneden, er et API næsten altid det rigtige valg. Du bytter omkostning pr. request for nul vedligehold.
Hvornår no-code er det rigtige valg
Thunderbit passer til en helt anden profil. Hvis du er PM, analytiker eller e-handelsansvarlig og har brug for Walmart-produktdata i et regneark i eftermiddag — ikke i næste sprint — er et no-code-værktøj det ærlige svar.
Arbejdsflowet: Installer Thunderbit Chrome Extension, gå til en Walmart-produkt- eller søgeside, klik på “AI Suggest Fields”, og Thunderbits AI læser siden og foreslår kolonner (produktnavn, pris, bedømmelse osv.). Klik på “Scrape”, og dataene udfyldes i en tabel. Eksportér til Excel, Google Sheets, Airtable eller Notion — alt sammen gratis, uden betalingsmur.
Thunderbit håndterer anti-bot i skyen, så du slipper for CAPTCHA’er, proxies og TLS-fingerprinting. AI’en tilpasser sig automatisk layoutændringer, så der er ingen vedligeholdelse. For brugere, der slet ikke vil arbejde med JSON-path-navigation, er dette den mindst besværlige vej.
Ærlige begrænsninger: Thunderbit er ikke bygget til 100K+ sider om dagen. Kreditbudgetter og cloud-lofter gør højvolumen-ingest økonomisk ufordelagtig sammenlignet med rå API’er. Du kan heller ikke fastlåse et bestemt postnummer eller ASN, medmindre værktøjet understøtter det. Til løbende pipelines med høj volumen er DIY eller et scraping-API stadig vejen frem.
Prisoverslag: 1.000 Walmart-produktrækker i Thunderbit koster omtrent 2.000 credits (ca. $0,60–$1,10 på Starter/Pro-planer). Det er sammenligneligt med Oxylabs’ Walmart API og billigere end de fleste hobby-tier scraping-API’er ved lav volumen. Tjek Thunderbits priser for aktuelle detaljer.
Scrape Walmart-produktdata med AI Get Started Free
Eksport af dine scraped Walmart-data
Når du har dataene, skal de et sted hen, hvor de er brugbare. Tre formater dækker de fleste behov:
CSV — det laveste fælles format, som analytikere faktisk åbner:
import csv
def export_csv(products, filename="walmart_products.csv"):
fieldnames = ["name", "price", "availability", "rating", "review_count", "seller", "url"]
with open(filename, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames, quoting=csv.QUOTE_MINIMAL)
writer.writeheader()
for p in products:
writer.writerow({k: p.get(k) for k in fieldnames})
Brug utf-8-sig-encoding for kompatibilitet med Excel. BOM-markøren forhindrer Excel i at ødelægge specialtegn.
JSONL — produktionsformatet til scraping-pipelines:
import json
import gzip
def export_jsonl(products, filename="walmart_products.jsonl.gz"):
with gzip.open(filename, "at", encoding="utf-8") as f:
for p in products:
f.write(json.dumps(p, ensure_ascii=False) + "\n")
JSONL er crash-sikkert (en afbrudt skrivning mister kun den sidste linje), kan streames med konstant hukommelse og bevarer nestede data som varianter og anmeldelser intakte.
Excel — til engangsleverancer til analytikere:
from openpyxl import Workbook
def export_excel(products, filename="walmart_products.xlsx"):
wb = Workbook(write_only=True)
ws = wb.create_sheet("Produkter")
ws.append(["Navn", "Pris", "Tilgængelighed", "Bedømmelse", "Anmeldelser", "Sælger"])
for p in products:
ws.append([p.get("name"), p.get("price"), p.get("availability"),
p.get("rating"), p.get("review_count"), p.get("seller")])
wb.save(filename)
Thunderbit dækker eksportdelen for ikke-Python-brugere: ét klik til Google Sheets, Airtable, Notion, Excel, CSV og JSON — alt gratis på basisniveauet. Til løbende monitorering kan Thunderbits scheduled scraper-funktion køre gentagne udtræk automatisk.
Ét forbehold om planlægning: brug ikke GitHub Actions til Walmart-scraping. GitHub Actions-runnere ligger på Azure-IP-ranges, som Walmarts anti-bot blokerer med det samme. Brug APScheduler på en VPS, eller send al trafik gennem residential proxies.
Juridiske og etiske retningslinjer for scraping af Walmart
Forumbrugere udtrykker dette bekymring meget direkte: “Jeg er okay med kat-og-mus med udviklerne, men tilbageholdende med at lege med deres juridiske team.”
Walmarts vilkår for brug forbyder udtrykkeligt brug af “any robot, spider… or other manual or automatic device to retrieve, index, 'scrape,' 'data mine' or otherwise gather any Materials” uden “express prior written consent.”
Walmarts robots.txt forbyder /search, /account, /api/ og snesevis af interne endpoints. Produktsider (/ip/...) og anmeldelser (/reviews/product/) er ikke forbudt.
Præcedensen hiQ v. LinkedIn (9th Circuit, 2022) fastslog, at scraping af offentligt tilgængelige data sandsynligvis ikke overtræder den føderale CFAA. Men samme domstol fastslog senere, at hiQ brød LinkedIns brugeraftale og indgik en dom på 500.000 dollars ved samtykke mod det. Mere nylige afgørelser fra 2024 (Meta v. Bright Data, X Corp. v. Bright Data) begrænsede CFAA yderligere og skabte copyright-preemption-forsvar, men de afgørelser afhang af specifikke ToU-formuleringer, som ikke uden videre overføres til Walmart.
Praktiske retningslinjer: Overbelast ikke servere. Respekter rate limits. Scrape ikke personlige data eller brugerdata. Brug data ansvarligt. At scrape offentlige Walmart-produktsider i et moderat tempo til personlig research er en helt anden risikoprofil end scraping i kommerciel skala mod Walmarts vilkår. Hvis du bygger et produkt på Walmart-data, så tal med en advokat og se nærmere på Walmarts officielle affiliate- og sælger-API’er.
Ansvarsfraskrivelse: Dette er undervisningsinformation, ikke juridisk rådgivning.
Konklusion og vigtigste pointer
At scrape Walmart med Python er en 9/10-sværhedsudfordring på grund af det dobbelte Akamai + PerimeterX anti-bot-stack. Ikke umuligt — men du har brug for de rigtige værktøjer og mønstre.
Vigtigste pointer:
__NEXT_DATA__JSON-udtræk er det pragmatiske valg til de fleste use cases. Det er det, alle seriøse open-source Walmart-scrapere fra 2024–2026 bruger. Basestien erprops.pageProps.initialData.data.productfor PDP’er ogsearchResult.itemStacksfor søgning/browse.curl_cffimedimpersonate="chrome124"er obligatorisk. Almindeligerequestsellerhttpxkan ikke passere Akamais TLS-fingerprinting, uanset headers.- Tavse blokeringer er den reelle fare. Walmart returnerer 200 OK med CAPTCHA-bodyer. Tjek responsindhold, ikke kun statuskoder.
- Produktionsscrapere har brug for mere end happy-path-kode. Eksponentiel backoff med jitter, block-detektion på fire signaler, rate limiting på 3–6 sekunder pr. request, datavalidering og overvågning af sessionens sundhed er alle essentielle.
- Interception af interne API’er via
/orchestra/*er kraftfuld, men skrøbelig. Brug den som en DevTools-øvelse til specifikke databehov, ikke som din primære udtræksmetode. - Walmart sætter en grænse på 25 søgeresultatsider. Kom bredere ud med skift i sorteringsrækkefølge og opdeling efter prisinterval.
- Vælg din tilgang ærligt: DIY Python til udviklere med specialbehov og høj volumen. Scraping-API’er til mellemstore teams uden en scraping-ingeniør. Thunderbit til forretningsbrugere, der vil have data i Google Sheets i eftermiddag.
Hvis du vil prøve no-code-vejen, har Thunderbit Chrome Extension en gratis plan — du kan scrape en håndfuld Walmart-sider og se resultaterne selv. Hvis du går Python-vejen, er kode-mønstrene i denne artikel produktionstestede. Uanset hvad har du nu et kort over Walmarts forsvar og tre veje gennem dem.
For mere om web scraping-teknikker, se vores guides om hvordan man scraper web med Python, de bedste automatiserede web scraping-værktøjer og web scraping uden at blive blokeret. Du kan også se tutorials på Thunderbit YouTube-kanalen.
FAQ
Er det lovligt at scrape Walmarts produktdata?
Walmarts vilkår for brug forbyder automatiseret scraping uden skriftligt samtykke. 9th Circuits hiQ v. LinkedIn-afgørelse (2022) fastslog, at den føderale CFAA næppe finder anvendelse på scraping af offentlige sider, men samme sag endte med en dom for kontraktbrud på 500.000 dollars mod scrapersiden. Scraping af offentlige produktsider i moderat tempo til personlig research har en meget anden risikoprofil end kommerciel udtrækning. Tal med en advokat, hvis du bygger en forretning på Walmart-data.
Hvorfor bliver min Walmart-scraper ved med at blive blokeret?
De mest almindelige årsager er: brug af almindelige requests eller httpx (som sender et Python-specifikt TLS-fingeraftryk, som Akamai straks markerer), manglende eller forkerte headers, ingen proxy-rotation, request-hastigheder hurtigere end 3–6 sekunder pr. side og manglende sessionscookies (_px3, _abck, locDataV3). Skift til curl_cffi med impersonate="chrome124", brug residential proxies, og implementér de block-detektion- og retry-mønstre, der beskrives i denne artikel.
Hvilke data kan jeg scrape fra Walmart med Python?
Produktnavne, priser (aktuelle og rollback), billeder, korte og lange beskrivelser, bedømmelser, antal anmeldelser, lagerstatus, sælgernavne, producentoplysninger, variantmuligheder (størrelse, farve) og kategoriplacering. Med __NEXT_DATA__-metoden er alt dette tilgængeligt som struktureret JSON. Interception af interne API’er kan desuden returnere pris på varianteniveau, lagerantal i realtid og paginerede anmeldelsesdata.
Har jeg brug for proxies for at scrape Walmart?
Ja, ved enhver produktion eller gentagen brug. Walmarts anti-bot-systemer blokerer konsekvent almindelige requests — selv med perfekte headers vil en ikke-residential IP blive markeret af Akamais IP-reputationssystem. Residential eller mobile proxies er nødvendige. Datacenter-IP’er bliver brændt næsten med det samme. Budgettér cirka $3–$17 pr. 1.000 sider afhængigt af din proxy-leverandør og plan.
Kan jeg scrape Walmart uden at skrive kode?
Ja. Thunderbit er en AI-drevet Chrome-udvidelse, der scraper Walmart i to klik: “AI Suggest Fields” til automatisk at finde kolonner med produktdata og derefter “Scrape” til at udtrække dataene. Den håndterer anti-bot-challenges i skyen og eksporterer direkte til Excel, Google Sheets, Airtable eller Notion — helt gratis. Den er bedst til analytikere, PM’er og forretningsbrugere, der hurtigt har brug for data uden at bygge en custom pipeline. Til scraping i høj volumen eller med meget høj tilpasning er Python eller et scraping-API stadig det bedste valg.
Prøv Thunderbit til AI-baseret Walmart-scraping Get Started Free
Lær mere


