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.