Walmart Reviews Scraper: Photos & Text Review Filtering
Pricing
from $3.99 / 1,000 results
Walmart Reviews Scraper: Photos & Text Review Filtering
Walmart Reviews Scraper: Photos & Text Review Filtering extracts Walmart reviews with text, photos, ratings, reviewer details, dates, and product data. Filter reviews by rating, keywords, media, and other criteria for product research, sentiment analysis, and competitor insights.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Walmart Reviews Scraper — Extract Reviews, Photos & Content Summaries
Walmart Reviews Scraper: Photos & Text Review Filtering pulls customer reviews straight from Walmart.com product pages and returns typed JSON — no HTML parsing required. Point it at a product URL, a Walmart search URL, or a plain keyword, and it returns individual review rows (rating, title, text, photos, verified-purchase badge, helpful votes) plus one per-product content-summary row disclosing the product's real total review count and how many of those carry written text. Two content filters — photos-only and written-text-only — isolate the reviews that matter for a given workflow instead of a raw, unsorted feed. This guide covers every input, every output field, and how teams deploy it for enrichment, monitoring, and dataset builds.
🧭 What Does Walmart Reviews Scraper: Photos & Text Review Filtering Do?
This Actor fetches Walmart's own public product-review pages and parses the review data embedded directly in the page's __NEXT_DATA__ JSON — the same data Walmart's front end renders from. It returns one row per review plus an optional per-product summary row. No Walmart account or login is required: every request uses a standard browser-style header set against Walmart's public pages, with no authenticated session anywhere in the flow.
- 🔎 Accepts product URLs, Walmart search URLs, or plain keywords, mixed freely in one run
- 🖼️ Isolates reviews that carry at least one real customer photo (
photosOnly) - ✍️ Isolates reviews with full written text, excluding bare star-only entries (
writtenReviewsOnly) - 📊 Adds a per-product content-summary row reporting the product's real total review count, written-review count, and whether it's effectively rating-only
- 🔀 Supports Walmart's own five review sort orders (relevancy, newest, most helpful, highest rating, lowest rating)
- 🛡️ Escalates its connection strategy automatically when a request is blocked, starting from your own
proxyConfiguration - 🏷️ Resolves numeric
reviewAspectsIDs to their human-readable names using the same page's own lookup table — no extra request
⚡ Features & Capabilities
The Actor's capabilities split into three areas: what it extracts, how it stays connected to Walmart's front end, and where it fits alongside the rest of the Scrapio catalog.
Core features
- 📷 Photo-only filtering —
photosOnly: truereturns only reviews wherehasPhotosistrue, each with a structuredreviewPhotosarray (normalUrl,thumbnailUrl,mediaType) - ✍️ Written-text-only filtering —
writtenReviewsOnly: trueexcludes any review wherehasWrittenTextisfalse - 📊 Honest content-summary row — one row per product (
type: "contentSummary") carrying the platform's owntotalReviewCountandwrittenReviewCount, plus a computedratingOnlyProductflag andphotoCoveragePct - 🏷️ Review aspect resolution —
reviewAspects[].nameis resolved from Walmart's numeric aspect IDs to a readable label with apolarityvalue, using the same review page's own aspect-definition list - 🧹 Clean product URLs — sponsored search-result placements wrap the real product path in a tracking redirect;
productUrlis the resolved, tracking-free/ip/{slug}/{id}link - ⏭️ Disclosed zero-review handling — a product with genuinely zero reviews either produces no rows at all (
skipProductsWithoutReviews: true) or one summary row that statestotalReviewCount: 0explicitly — never a silently missing row - 🌐 Your own proxy strategy, honored as-is —
proxyConfigurationdrives the starting connection; no proxy is used by default unless you select one
Walmart Reviews Scraper within the Scrapio data stack
Walmart Reviews Scraper: Photos & Text Review Filtering is currently Scrapio's only Walmart Actor — there is no separate Scrapio Actor for Walmart product listings, pricing, or seller data today. For the same entity type (customer reviews) on other platforms, Scrapio also publishes ../../Facebook-Reviews-Scraper, ../../airbnb-review-scraper, and ../../Udemy-Course-Reviews-Scraper. For adjacent e-commerce data on a different retailer, see ../../amazon-product-details-scraper, ../../amazon-search-scraper, ../../Amazon-Price-Tracker, and ../../eBay-Product-Listing-Scraper.
Why do developers and data teams scrape Walmart?
🏢 E-commerce brands, sellers & marketplace analysts
Brands selling on or competing with Walmart.com use this Actor to pull the review set for their own listings or a competitor's, filtered to writtenReviewsOnly for qualitative feedback and photosOnly for real customer photos worth reusing in marketing. The contentSummary row's ratingOnlyProduct and photoCoveragePct fields answer a question a raw review dump can't: how much of this product's review base is actually substantive, at a glance, across a whole catalog of SKUs.
📊 AI training data and RAG indexing
The text field is the high-information field for RAG indexing — full written customer reviews, unescaped and ready to embed, with title, rating, and reviewAspects[].name as retrievable metadata for filtering and re-ranking. For training data, every review row shares the same 30-key schema regardless of product, so a dataset built across thousands of products needs no per-record normalization: hasWrittenText, hasPhotos, verifiedPurchase, and rating are typed primitives from the first row to the last.
📱 Competitive and market intelligence
Track photoCoveragePct and writtenReviewCount against totalReviewCount on a competitor's product line over successive scheduled runs to see whether customer engagement is rising or falling. rating distribution across the collected review set flags a product sliding toward a rating problem before it shows up in aggregate storefront metrics.
🔬 Research and academic use
The Actor returns only what Walmart's own product-review pages already display publicly — no login, no private data. That makes it suitable for academic studies of consumer sentiment, review-helpfulness dynamics (helpfulVotes / notHelpfulVotes), or verified-purchase behavior, scoped to public data only.
🎥 Product and SaaS development
Review-analytics dashboards, review-monitoring tools, and UGC-sourcing products can build directly on the typed rows — no scraping infrastructure of your own, no HTML to maintain against Walmart's front-end changes.
🍚 Input Parameters
| Parameter | Required | Type | Constraints | Description |
|---|---|---|---|---|
reviewTargets | No | array | editor: stringList | 🎯 Walmart URLs, Keywords, or Search Terms. One item per line: a product URL (https://www.walmart.com/ip/product-name/123456), a search URL (https://walmart.com/search?q=tshirt), or a keyword (tshirt). Same value as the legacy startUrls field — set either one. Prefill: ["https://walmart.com/search?q=tshirt"] |
reviewCap | No | integer | min 1, max 1000, prefill 15 | 🧾 Maximum Reviews Per Product. Max reviews to extract per product. When a content filter is active, this caps the number of MATCHING reviews returned, not the raw pages scanned. Same value as the legacy maxComments field — set either one. Default is 15. |
maxProductsPerStartUrl | No | integer | default 10, min 0, max 1000 | 📦 Maximum Products Per Start URL. For search URLs, limits how many products are processed from each input URL. |
sortOrder | No | string | default "relevancy", enum: "relevancy", "submission-desc", "helpful", "rating-desc", "rating-asc" | 🔀 Review Sort Order — relevancy (most relevant), submission-desc (newest first), helpful (most helpful), rating-desc (highest rating first), rating-asc (lowest rating first). |
skipProductsWithoutReviews | No | boolean | default true | ⏭️ Skip Products Without Any Reviews. If enabled, a product with zero reviews produces no output row at all for that product. If disabled, a zero-review product still gets one summary row disclosing that it has zero reviews. |
startUrls | No | array | editor: stringList | 🎯 Walmart URLs, Keywords, or Search Terms (legacy). Legacy alias of reviewTargets, kept for backward compatibility. Used only when reviewTargets is empty. |
maxComments | No | integer | min 1, max 1000 | 🧾 Maximum Reviews Per Product (legacy). Legacy alias of reviewCap. Used only when reviewCap is not set. |
photosOnly | No | boolean | default false | 🖼️ Only Reviews With Customer Photos. When enabled, only reviews that carry at least one real customer photo are returned. Photo coverage is product-dependent — some products have none. |
writtenReviewsOnly | No | boolean | default false | 📝 Only Reviews With Written Text. When enabled, bare star-only entries are excluded. Some products are rating-only on the platform itself — filtering to written text can return zero rows for those. |
includeContentSummary | No | boolean | default true | 📊 Include Per-Product Content Summary Row. When enabled, one extra summary row per product is added reporting the product's real total review count, how many carry written text, and whether the product is rating-only. |
proxyConfiguration | No | object | editor: proxy, prefill {"useApifyProxy": false} | 🌐 Proxy Configuration. Your own proxy strategy is used as-is for every request this run makes. Starts with no proxy by default; selecting Apify Proxy groups/country is honored for the actual requests. |
No parameter is required — an empty run fails at runtime with "No 'reviewTargets' (or legacy 'startUrls') value was provided" rather than at schema validation.
JSON input example
{"reviewTargets": ["https://www.walmart.com/ip/George-Men-s-Big-Men-s-V-Neck-Short-Sleeve-Tee-Sizes-S-3XL/11628120951","https://walmart.com/search?q=running+shoes","wireless earbuds"],"reviewCap": 100,"maxProductsPerStartUrl": 20,"sortOrder": "submission-desc","skipProductsWithoutReviews": true,"photosOnly": false,"writtenReviewsOnly": true,"includeContentSummary": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Supported URL types and input formats
- Product URL —
https://www.walmart.com/ip/product-name/123456. The Actor extracts the numeric product ID and fetches that single product's reviews directly. - Search URL —
https://walmart.com/search?q=tshirt. The Actor paginates the search results, collects product URLs (deduplicated, tracking redirects resolved), and processes up tomaxProductsPerStartUrlof them. - Plain keyword —
tshirt. Any entry that isn't a URL is URL-encoded and converted into a Walmart search URL (https://www.walmart.com/search?q=tshirt) automatically, then handled the same way as a search URL.
reviewTargets and startUrls can hold any mix of the three formats in the same run, one entry per line.
📦 Output Format
Every run pushes typed JSON rows to the same Apify dataset, with a consistent 30-key schema across both row types — fields that don't apply to a given row type are always present and explicitly null, never omitted. Two type values share the dataset: review and contentSummary.
Output for a review row
{"type": "review","id": "423520482","itemType": "Review","productUrl": "https://www.walmart.com/ip/George-Men-s-Big-Men-s-V-Neck-Short-Sleeve-Tee-Sizes-S-3XL/11628120951","rating": 5,"title": "Basic design with limited styling details","text": "Good quality shirt for the price, fits true to size.","reviewDate": "2026-06-12","hasWrittenText": true,"hasPhotos": true,"reviewPhotos": [{ "normalUrl": "https://i5.walmartimages.com/asr/photo1.jpeg", "thumbnailUrl": "https://i5.walmartimages.com/asr/photo1-thumb.jpeg", "mediaType": "image" }],"verifiedPurchase": true,"recommended": true,"helpfulVotes": 12,"notHelpfulVotes": 1,"authorNickname": "shopper123","totalReviewCount": null,"writtenReviewCount": null,"ratingOnlyProduct": null,"photoCoveragePct": null,"reviewId": "423520482","submittedAt": "2026-06-12","isVerifiedPurchase": true,"unhelpfulVotes": 1,"reviewAspects": [{ "name": "Fit", "polarity": "positive" }],"reviewedItemId": "11628120951","reviewedItemName": "George Men's Big Men's V-Neck Short Sleeve Tee, Sizes S-3XL","soldBy": "Walmart.com","fulfilledBy": "Walmart","scrapedAt": "2026-08-11T10:15:22.123456+00:00"}
Output for a content-summary row
{"type": "contentSummary","id": "summary-11628120951","itemType": "ContentSummary","productUrl": "https://www.walmart.com/ip/George-Men-s-Big-Men-s-V-Neck-Short-Sleeve-Tee-Sizes-S-3XL/11628120951","rating": null,"title": null,"text": null,"reviewDate": null,"hasWrittenText": null,"hasPhotos": null,"reviewPhotos": null,"verifiedPurchase": null,"recommended": null,"helpfulVotes": null,"notHelpfulVotes": null,"authorNickname": null,"totalReviewCount": 4700,"writtenReviewCount": 923,"ratingOnlyProduct": false,"photoCoveragePct": 26.7,"reviewId": null,"submittedAt": null,"isVerifiedPurchase": null,"unhelpfulVotes": null,"reviewAspects": null,"reviewedItemId": null,"reviewedItemName": null,"soldBy": null,"fulfilledBy": null,"scrapedAt": "2026-08-11T10:15:40.654321+00:00"}
totalReviewCount and writtenReviewCount on the summary row are Walmart's own figures for that product, read from the same review page's embedded data — not counted from the rows this run happened to collect. photoCoveragePct, by contrast, is measured only over the reviews this run actually scanned, so it moves with reviewCap and the active content filters.
Schema stability and export options
Two field pairs carry duplicate values under different names — reviewDate/submittedAt, notHelpfulVotes/unhelpfulVotes, and verifiedPurchase/isVerifiedPurchase — the second name in each pair is kept for compatibility with the base Walmart Reviews Scraper's original field names, so downstream code written against either naming convention keeps working. Because every row — review or summary — carries the same 30 keys, adding a new content filter or a new summary metric in a future version extends the schema rather than reshaping it. Results are available from the Apify Console's Output tab, or exported as JSON, CSV, Excel (XLSX), HTML table, RSS, or XML through the dataset's built-in export options, and programmatically through the Apify API or apify-client.
💡 Walmart Reviews Scraper: Photos & Text Review Filtering Strategy Guide
🎯 Strategy 1: Real-time enrichment pipeline
Trigger a run from your product-catalog pipeline whenever a new Walmart SKU is added, passing its product URL as the sole reviewTargets entry. Read back ratingOnlyProduct, photoCoveragePct, and the writtenReviewCount/totalReviewCount pair from the contentSummary row, and append them as enrichment columns on the source product record — a lightweight, per-SKU signal of review substance without pulling every review row.
🎯 Strategy 2: Scheduled monitoring and alerting
Run the Actor on an Apify schedule (daily or weekly) against a fixed watchlist of product URLs, with includeContentSummary: true. Diff each run's totalReviewCount, writtenReviewCount, and photoCoveragePct against the previous run's values for the same productUrl, and alert when the delta on totalReviewCount or a sudden drop in average rating across new review rows crosses a threshold you define.
🎯 Strategy 3: Bulk dataset build
Feed a long list of search URLs or keywords into reviewTargets, one per line, with maxProductsPerStartUrl and reviewCap set to bound the run. The Actor scans no more than 40 review pages per product regardless of reviewCap — a fixed internal safety bound — so extremely high reviewCap values on a low-review-volume product simply exhaust the available pages rather than looping indefinitely. Launch several runs in parallel through the Apify API for large product lists, then aggregate the resulting datasets to CSV or a database for analysis.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | Per-SKU review signal on catalog ingest | Single-product run, triggered on demand | JSON row appended to source record |
| Scheduled monitoring | Tracking review-volume and sentiment drift | Recurring Apify schedule against a fixed URL list | Dataset diffed run-over-run |
| Bulk dataset build | Research or training datasets across many products | Parallel runs via the Apify API | Aggregated dataset exported to CSV |
🌴 Related Walmart Scrapers & Tools
| Scraper name | What it extracts |
|---|---|
| ../../Facebook-Reviews-Scraper | Reviews and ratings from Facebook Pages |
| ../../airbnb-review-scraper | Guest reviews from Airbnb listings |
| ../../Udemy-Course-Reviews-Scraper | Learner reviews and ratings from Udemy courses |
| ../../amazon-product-details-scraper | Product listing details from Amazon |
| ../../amazon-search-scraper | Search-result product data from Amazon |
| ../../Amazon-Price-Tracker | Price and availability tracking on Amazon listings |
| ../../eBay-Product-Listing-Scraper | Product listing data from eBay |
Walmart does not offer a general-purpose public API for third-party review access — its Reviews API (developer.walmart.com/us-marketplace) is restricted to sellers enrolled in its Marketplace Review Accelerator Program, not open to arbitrary read access on any product (checked 2026-08-15). This Actor is the practical path to structured review data outside that program.
How to integrate Walmart Reviews Scraper: Photos & Text Review Filtering with your stack
Walmart Reviews Scraper: Photos & Text Review Filtering works with any language or tool that can make an HTTP request through the Apify API, or with Apify's official client libraries.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"reviewTargets": ["https://www.walmart.com/ip/George-Men-s-Big-Men-s-V-Neck-Short-Sleeve-Tee-Sizes-S-3XL/11628120951",],"reviewCap": 200,"sortOrder": "helpful","writtenReviewsOnly": True,"includeContentSummary": True,}run = client.actor("<YOUR_USERNAME>/walmart-reviews-scraper-photos-and-text-review-filtering").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())reviews = [r for r in rows if r["type"] == "review"]with open("walmart_reviews.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=list(reviews[0].keys()))writer.writeheader()writer.writerows(reviews)print(f"Collected {len(reviews)} written reviews")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const input = {reviewTargets: ['https://walmart.com/search?q=running+shoes'],reviewCap: 50,photosOnly: true,maxProductsPerStartUrl: 10,};const run = await client.actor('<YOUR_USERNAME>/walmart-reviews-scraper-photos-and-text-review-filtering').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();const photoReviews = items.filter((row) => row.type === 'review');console.log(`Collected ${photoReviews.length} photo reviews`);
Async and scheduled pipelines
For large product lists, call .start() instead of .call() and poll the run status through apify_client, or set up a recurring Apify schedule directly in the Apify Console to run this Actor on a fixed interval against a saved input. Either path fits a fire-and-forget large job better than waiting synchronously on a single run.
🎯 Who Needs Walmart Reviews Scraper: Photos & Text Review Filtering? (Use Cases & Industries)
🏢 E-commerce brands, sellers & marketplace analysts
A brand manager tracking a product line pulls photosOnly reviews to source real customer photos for a listing refresh, and checks ratingOnlyProduct across the catalog to flag SKUs where customers rate but never explain why.
📊 AI / RAG and analytics teams
A RAG pipeline indexes the text field from writtenReviewsOnly runs, tagging each chunk with rating and reviewAspects[].name so a support or shopping assistant can answer "what do customers say about the fit" with cited review text.
📱 Competitive intelligence teams
An analyst runs the Actor weekly against a competitor's top SKUs, tracking totalReviewCount growth and rating trend across newly collected review rows to catch a quality problem before it appears in a quarterly report.
🔬 Researchers
A consumer-behavior researcher builds a dataset of helpfulVotes/notHelpfulVotes ratios against verifiedPurchase status across hundreds of products, scoped entirely to publicly visible review data.
🎥 Product and SaaS development
A review-monitoring SaaS ingests the per-product contentSummary row on a schedule as the input to its own change-detection and alerting layer, without building or maintaining its own Walmart-facing scraper.
Is it legal to scrape Walmart?
Scraping publicly accessible web pages is generally lawful in the United States. In hiQ Labs, Inc. v. LinkedIn Corp. (9th Cir. 2019), the Ninth Circuit held that scraping data from a public website does not violate the Computer Fraud and Abuse Act. In Meta Platforms, Inc. v. Bright Data Ltd. (N.D. Cal., Jan. 23, 2024), the court granted summary judgment for Bright Data, finding that scraping logged-out, publicly accessible pages did not breach the platform's own Terms of Service, because those terms bind account holders, not visitors browsing public pages.
That leaves three separate questions. Scraping public data is generally on solid legal footing per the precedent above. Violating a platform's Terms of Service is a contract question — a civil risk between you and Walmart, not a criminal one, and Walmart's ToS may still restrict automated access even where scraping itself is lawful. Data protection law is a narrower concern here: this Actor's primary output is product review content and metadata, not personal profile data, though the authorNickname field carries a public display name a reviewer chose to attach to their review — not a verified real name or contact detail.
Walmart Reviews Scraper: Photos & Text Review Filtering returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications involving personal data.
❓ Frequently asked questions
Does Walmart Reviews Scraper: Photos & Text Review Filtering work without a Walmart account?
Yes. The Actor fetches Walmart's public product and review pages using standard browser-style HTTP headers — no Walmart login, session, or account credentials are used or required anywhere in the code.
How does it handle Walmart's anti-scraping measures?
The Actor retries failed requests up to 3 times with increasing delay, and escalates its connection strategy when a request is refused (HTTP 403/444) or when a response body contains phrases like "access denied," "unusual traffic," "captcha," "rate limit," or "forbidden": from no proxy, to a standard Apify Proxy connection, to a residential Apify Proxy connection (US), retrying the fetch at each step. Requests are also spaced with a randomized delay (1–5 seconds depending on the request type) between pages and products rather than fired back to back.
Can I run it at scale without getting blocked?
The Actor scans up to 40 review pages per product as a fixed internal safety bound, regardless of reviewCap, and processes up to maxProductsPerStartUrl products per search URL (max 1000). No uptime or success-rate figure is published for this Actor — actual throughput depends on your proxy configuration and Walmart's response behavior on the day of the run.
How fresh is the data it returns?
Fully live. Every run fetches the current state of Walmart's product-review pages at request time; nothing is cached or reused from a previous run. scrapedAt on every row records exactly when that row was fetched.
Which fields work best for AI training and RAG indexing?
text is the high-information field for RAG chunking — full written review content. title, rating, and reviewAspects[].name/polarity make useful retrievable metadata for filtering results. For training data, hasWrittenText, hasPhotos, and verifiedPurchase are consistent boolean fields across every row, and all fields return as typed primitives (strings, numbers, booleans, or null) requiring no additional normalization.
Does the output contain any personal data?
authorNickname carries the reviewer's public display name as shown on Walmart's own review page — a name the reviewer chose to attach to a public review, not a verified identity. No email address, phone number, or account identifier is collected anywhere in the output. The Actor returns publicly available data; lawful basis for any further storage or use of that data sits with you.
Does it work with Claude, ChatGPT, and other AI agent tools?
Yes, as an HTTP endpoint callable by any agent framework through the Apify API — no MCP server is documented for this Actor. Every response is typed JSON, ready to pass directly into an LLM context window without an HTML-parsing step.
What's the difference between reviewCap and maxProductsPerStartUrl?
reviewCap limits reviews per product (max 1000); maxProductsPerStartUrl limits how many products a single search URL or keyword expands into (max 1000, default 10). A search-based run with both set high can still produce a very large dataset — set both deliberately for predictable run size.
Why might photosOnly or writtenReviewsOnly return zero rows for a product?
Photo coverage and written-text coverage are genuinely product-dependent on Walmart itself — some products have no photo reviews at all, and some are effectively rating-only, with every review a bare star with no text. The contentSummary row's ratingOnlyProduct and photoCoveragePct fields disclose this honestly rather than the filter silently returning nothing with no explanation.
ℹ️ Disclaimer
Walmart Reviews Scraper: Photos & Text Review Filtering extracts only publicly available data from Walmart.com. This tool is intended for lawful use cases only. Users are responsible for complying with Walmart's terms of service and applicable data protection laws in their jurisdiction.