Guides / Scrape Walmart

How to Scrape Walmart in 2026

Walmart uses Akamai anti-bot protection, JavaScript-rendered product pages, CAPTCHA challenges, and geo-restrictions. Scraping it yourself means dealing with one of the most aggressive bot detection systems on the web. With Browser7, you get fully rendered search results and product data in a single API call.

What makes Walmart hard to scrape

Akamai anti-bot protection

Walmart uses Akamai Bot Manager, one of the most sophisticated anti-bot systems available. It uses advanced browser fingerprinting, behavioral analysis, sensor data collection, and machine learning to detect automated traffic. Datacenter IPs are blocked instantly, and even residential proxies are flagged if the browser fingerprint is not perfect.

JavaScript rendering

Walmart renders product cards, prices, ratings, and availability using client-side JavaScript. A simple HTTP request returns an empty page shell. You need a real browser with full JavaScript execution to see any product data.

CAPTCHA challenges

Walmart serves CAPTCHA challenges frequently, even to traffic that passes initial fingerprinting checks. At any meaningful scraping volume, you will encounter CAPTCHAs that must be solved before accessing product pages.

Geo-restrictions

Walmart shows different prices, product availability, and delivery options based on the visitor's location. Some products are only available in specific regions, and store pickup options vary by ZIP code.

Scrape Walmart search results

Browser7 handles Akamai bypass, proxy rotation, CAPTCHA solving, and JavaScript rendering automatically. This example scrapes laptop search results and returns the fully rendered HTML with all product cards.

from browser7 import Browser7

client = Browser7(
    api_key="b7_your_api_key",
    base_url="https://ca-api.browser7.com/v1"
)

result = client.render(
    "https://www.walmart.com/search?q=laptop",
    country_code="US",
)

print(result.html)

That is the complete code. No proxy configuration, no Akamai bypass logic, no CAPTCHA handling. The response contains the fully rendered HTML of the Walmart search results page, including all product cards with titles, prices, ratings, and reviews.

Data you can extract

The rendered HTML contains all the data Walmart shows to a real visitor. Common data points to extract:

Product details

  • Product title and brand
  • Product description
  • Category and subcategory
  • Product images and gallery URLs
  • Item ID and UPC

Pricing

  • Current price
  • Was/list price
  • Savings amount and percentage
  • Rollback and clearance indicators
  • Price per unit (where applicable)

Reviews and ratings

  • Overall star rating
  • Total review count
  • Rating distribution
  • Individual review text
  • Verified purchase indicators

Search metadata

  • Total results count
  • Search result positions
  • Sponsored vs organic results
  • Available filters and facets
  • Related search suggestions

Complete example: render and parse product data

Here is a complete example that renders Walmart search results and extracts structured data from the HTML. Product cards are identified by the data-item-id attribute. Titles are inside links with a link-identifier attribute, and ratings follow the "X out of 5 Stars. Y reviews" text pattern.

from browser7 import Browser7
from bs4 import BeautifulSoup
import re
import json

client = Browser7(
    api_key="b7_your_api_key",
    base_url="https://ca-api.browser7.com/v1"
)

result = client.render(
    "https://www.walmart.com/search?q=laptop",
    country_code="US",
)

soup = BeautifulSoup(result.html, "html.parser")

products = []
for i, card in enumerate(soup.select("div[data-item-id]")):
    product = {
        "position": i + 1,
        "title": None,
        "price": None,
        "rating": None,
        "reviews": None,
    }

    # Title from link with link-identifier attribute
    title_link = card.select_one("a[link-identifier] span")
    if title_link:
        product["title"] = title_link.get_text(strip=True)

    # Price - look for "current price" text pattern
    for span in card.select("span"):
        text = span.get_text(strip=True)
        if "current price" in text.lower():
            price_match = re.search(r"\$[\d,.]+", text)
            if price_match:
                product["price"] = price_match.group(0)
            break

    # Rating and reviews from "X out of 5 Stars. Y reviews" pattern
    for span in card.select("span"):
        text = span.get_text(strip=True)
        rating_match = re.search(
            r"([\d.]+)\s*out of 5 Stars\.\s*(\d+)\s*reviews", text
        )
        if rating_match:
            product["rating"] = rating_match.group(1)
            product["reviews"] = int(rating_match.group(2))
            break

    products.append(product)

print(json.dumps(products[:5], indent=2))

CSS selectors may change if Walmart updates their page structure. Inspect the current page if any fields return null.

Sample output:

[
  {
    "position": 1,
    "title": "HP 15.6 inch Laptop PC, Intel Core i5, 8GB RAM, 256GB SSD...",
    "price": "$399.00",
    "rating": "4.3",
    "reviews": 2847
  },
  {
    "position": 2,
    "title": "Lenovo IdeaPad 1 15.6 inch Laptop, AMD Ryzen 5, 8GB RAM...",
    "price": "$349.00",
    "rating": "4.5",
    "reviews": 1923
  },
  ...
]

Scrape page 2 and beyond

Walmart search results use the &page= parameter for pagination. Page 2 is &page=2, page 3 is &page=3, and so on.

from browser7 import Browser7
from bs4 import BeautifulSoup
import re

client = Browser7(
    api_key="b7_your_api_key",
    base_url="https://ca-api.browser7.com/v1"
)

# Page 2: add &page=2
result = client.render(
    "https://www.walmart.com/search?q=laptop&page=2",
    country_code="US",
)

soup = BeautifulSoup(result.html, "html.parser")
for card in soup.select("div[data-item-id]"):
    title = card.select_one("a[link-identifier] span")
    price_text = ""
    for span in card.select("span"):
        text = span.get_text(strip=True)
        if "current price" in text.lower():
            match = re.search(r"\$[\d,.]+", text)
            if match:
                price_text = match.group(0)
            break
    if title:
        print(f"{title.get_text(strip=True)[:80]} - {price_text}")

Take a screenshot of search results

Capture Walmart search results as an image for price monitoring dashboards, competitive analysis reports, or tracking product availability and pricing trends over time.

import base64
from browser7 import Browser7

client = Browser7(
    api_key="b7_your_api_key",
    base_url="https://ca-api.browser7.com/v1"
)

result = client.render(
    "https://www.walmart.com/search?q=laptop",
    country_code="US",
    block_images=False,
    include_screenshot=True,
    screenshot_full_page=True,
    screenshot_format="png"
)

# Save the screenshot
with open("walmart-search.png", "wb") as f:
    f.write(base64.b64decode(result.screenshot))

print("Screenshot saved")

What this costs

Every Walmart page render costs $0.01 - the same as any other website. Akamai bypass, residential proxies, JavaScript rendering, CAPTCHA solving, and screenshots are all included. There are no per-domain surcharges, no credit multipliers, and no bandwidth fees.

10,000 Walmart search pages costs $100. No per-domain surcharges, no credit multipliers, no bandwidth fees.

Try it yourself

100 free renders - enough to test Walmart scraping with no payment required.