Sådan scraper du Walmart med Python i 2026 (og undgår at blive blokeret)

Sidst opdateret den April 28, 2026
Sådan scraper du Walmart med Python i 2026 (og undgår at blive blokeret)

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.

walmart_stats_670d06c6bd.png

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:

BrugssagHvem har brug for detHvad de udtrækker
Overvågning af konkurrentpriserE-handelsdrift, repriseringsværktøjerPriser, kampagner, MAP-overholdelse
Berigelse af produktkatalogSalgs- og merchandisingteamsBeskrivelser, billeder, specifikationer, varianter
Sporing af lagerstatusSupply chain, dropshippereLagerstatus, sælgerinformation
Markedsundersøgelser og trendanalyseMarketing, produktcheferBedømmelser, anmeldelser, kategorisortiment
LeadgenereringSalgsteamsSæ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å”.

walmart_antibot_3d67d0119c.png

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.

MetodePålidelighedDækning af dataAnti-bot-sværhedsgradVedligeholdelsesbyrde
HTML + BeautifulSoup⚠️ Lav (selektorer bryder ved hver deploy)ModeratHøjHøj
__NEXT_DATA__ JSON✅ GodHøjMiddel-højMiddel
Interception af interne API’er✅ BedstHøjest (varianter, lager, anmeldelser)Middel-højLav (struktureret JSON)
Thunderbit (no-code)✅ GodHøjLav (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:

DatafeltJSON-sti (under initialData)TypeNoter
Produktnavndata > product > nameStreng
Mærkedata > product > brandStreng
Aktuel pris (tal)data > product > priceInfo > currentPrice > priceFlydende talKan variere afhængigt af butiks-cookie
Aktuel pris (streng)data > product > priceInfo > currentPrice > priceStringStrengFormateret, f.eks. "$9.99"
Kort beskrivelsedata > product > shortDescriptionHTML-strengParse med BeautifulSoup for tekst
Lang beskrivelsedata > idml > longDescriptionHTML-strengLigger på idml, IKKE inde i product — det er fælden, ældre tutorials tager fejl i
Alle billederdata > product > imageInfo > allImagesArrayListe af {id, url}-objekter
Gennemsnitlig bedømmelsedata > product > averageRatingFlydende talNøglen er averageRating, ikke den gamle rating
Antal anmeldelserdata > product > numberOfReviewsHeltal
Varianterdata > product > variantCriteriaArrayValggrupper (størrelse, farve)
Tilgængeligheddata > product > availabilityStatusStrengIN_STOCK, OUT_OF_STOCK, LIMITED_STOCK
Sælgerdata > product > sellerDisplayNameStreng
Producentdata > product > manufacturerNameStreng

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:

  1. Åbn en Walmart-produktside i Chrome
  2. Åbn DevTools → Network-fanen, og filtrér efter “Fetch/XHR”
  3. Brows siden normalt — klik på varianter, scroll til anmeldelser, skift butikslokation
  4. Hold øje med requests til /orchestra/*-endpoints, der returnerer JSON med produktdata
  5. Højreklik på requesten → “Copy as cURL”
  6. 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_low og derefter &sort=price_high for at få cirka 50 siders dækning
  • Opdeling efter prisinterval: Tilføj &min_price=X&max_price=Y for 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 &amp; 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.

FaktorDIY Python (requests + proxies)Scraping-API (Oxylabs, Bright Data osv.)No-code-værktøj (Thunderbit)
Opsætningstid til første rækkeTimer15–60 minCa. 2 min
Opsætningstid til produktion40–80 timer4–16 timerCa. 30 min
Håndtering af anti-botDu håndterer det (svært)Håndteres af leverandørenHå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. requestHøjere pr. requestVarierer
TilpasningFuld kontrolAPI-parametreBegrænset af UI/felter
Løbende vedligehold4–8 timer/md.Næsten nulIngen (AI tilpasser sig)
Bedst tilUdviklere, der bygger custom pipelinesProduktion i mellemstor skalaForretningsbrugere, 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 er props.pageProps.initialData.data.product for PDP’er og searchResult.itemStacks for søgning/browse.
  • curl_cffi med impersonate="chrome124" er obligatorisk. Almindelige requests eller httpx kan 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

Shuai Guan
Shuai Guan
CEO hos Thunderbit | Ekspert i AI-drevet dataautomatisering Shuai Guan er CEO hos Thunderbit og uddannet ingeniør fra University of Michigan. Med næsten ti års erfaring inden for tech og SaaS-arkitektur har han specialiseret sig i at omsætte komplekse AI-modeller til praktiske, no-code værktøjer til dataudtræk. På denne blog deler han ærlige, gennemprøvede indsigter om webscraping og automatiseringsstrategier, så du kan bygge smartere, datadrevne arbejdsgange. Når han ikke optimerer dataflows, bruger han det samme skarpe blik for detaljer i sin passion for fotografi.
Indholdsfortegnelse

Hent en webside bare ved at spørge

Sig, hvad du har brug for, på helt almindeligt engelsk. Eller endnu bedre: sig ingenting.

Prøv Thunderbit gratis
Udtræk data med AI
Overfør nemt data til Google Sheets, Airtable eller Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week