Omar EldeebScrape product reviews from Walmart, Target, Amazon and Shopify stores: inputs, sort order, real review fields, site limits and a Python complaint summary.
To scrape product reviews, collect them from the product's own review source with a fixed sort and a cap: one row per review with its rating, text, date, verified flag and the variant bought. Walmart and Target expose every review page; Amazon shows only its top reviews (8–13) to signed-out visitors. Sort by "Lowest rated" to get complaints first.
This guide covers what each site lets you reach, the inputs of an Apify actor that does it, a real review row, and a short Python script that turns the lowest-rated reviews into complaint counts without a paid AI model. Everything below was run on 2026-10-20 unless a date says otherwise.
The table is from the actor's supported-sites list and our October 2026 cloud tests:
| Source | Reviews you get | Sort honored in our tests |
|---|---|---|
Walmart (walmart.com) |
All pages | Lowest rated, Most recent |
Target (target.com) |
All pages | Lowest rated, Most recent |
| Amazon (24 storefronts) | Only the top reviews on the product page, about 8 to 13 per product | No: Amazon's own order (sortApplied = "Most relevant") |
| Shopify stores with Yotpo, Judge.me, Okendo or Stamped | Reviews from the review widget | All five sorts on a Yotpo store; "Most recent" seen on Judge.me and Okendo stores |
| WooCommerce stores | From the store's own Store API | not tested |
| AliExpress (best-effort site) | All pages; some reviews are a rating with no text | No: fell back to "Most relevant" |
| Flipkart (best-effort site) | All pages | not tested |
| Mercado Libre (best-effort site) | Catalog URLs (/p/MLM…) only |
not tested |
Amazon's full review pages ask visitors to sign in. A scraper that respects that limit only gets the reviews printed on the product page. When Amazon shows "Sign in to see customer reviews" instead, the actor reports the product as restricted rather than as an empty success.
Not reachable with this actor: Google Shopping reviews, Loox and Reviews.io widgets (the page's structured reviews are used instead), and sites the actor marks unsupported, such as eBay, Best Buy, Home Depot and Etsy.
The E-commerce Product Scraper Pro actor has a review section with these fields:
| Field | What it does |
|---|---|
reviewDetailsUrls |
Product pages to read reviews from |
reviewListingUrls |
Category or search pages: reviews for the products listed on the first page |
keywordReviews + marketplacesReviews
|
A keyword searched on the chosen marketplaces; reviews for the products found on the first results page |
sortReview |
Most recent, Most relevant, Most helpful, Highest rated or Lowest rated
|
maxReviewResults |
Cap for the whole run |
maxItemsPerStartUrl |
Cap per input, so one product can't use up the run's cap |
additionalReviewProperties |
Adds extra per-site fields |
If a site doesn't support the sort you asked for, its default order is used. The row's sortApplied says which order the reviews really follow, and the input's status row says so too.
A keyword review search, as run today:
{
"keywordReviews": "usb c cable",
"marketplacesReviews": ["www.target.com", "www.walmart.com"],
"sortReview": "Lowest rated",
"maxItemsPerStartUrl": 2,
"maxReviewResults": 4
}
The status row for each marketplace explained what happened:
Keyword "usb c cable" on www.target.com: 24 product(s) found on the first page; reviews read for 1, 1 had reviews; 2 review(s) delivered. Sort applied per source — Target: Lowest rated. Stopped at maxItemsPerStartUrl (2) for this input. Only the first listing page is read for reviews.
Keyword "usb c cable" on www.walmart.com: 60 product(s) found on the first page (first 60 used); reviews read for 1, 1 had reviews; 2 review(s) delivered. Sort applied per source — Walmart: Lowest rated. Stopped at maxReviewResults (4). Only the first listing page is read for reviews.
A real Walmart row from today, with the reviewer's name removed:
{
"recordType": "review",
"productUrl": "https://www.walmart.com/ip/18928659757",
"inputUrl": "https://www.walmart.com/ip/ONN-10-C-C-BRD-WHT/18928659757",
"datePublished": "2026-10-09",
"reviewBody": "melted sparked barely got fire out but it melted the place on my phone where c plugs in",
"reviewRating": { "ratingValue": 1, "bestRating": 5 },
"additionalProperties": { "verified": true, "helpfulVotes": 0, "unhelpfulVotes": 0, "variant": "Multipack quantity: 1", "syndicatedFrom": "bazaarvoice" },
"reviewId": "443517198",
"rating": 1,
"title": null,
"verified": true,
"helpfulVotes": 0,
"images": [],
"variant": "Multipack quantity: 1",
"productId": "18928659757",
"productName": "Onn 10ft USB-C to USB-C Braided Charging Cable, USB-IF Certified, White - Compatible with iPhone, Samsung, Pixel, iPad Pro",
"position": 1,
"sortApplied": "Lowest rated",
"site": "walmart-us",
"source": "walmart",
"scrapedAt": "2026-10-20T09:30:03.526Z"
}
Fields worth knowing:
rating is on the scale in bestRating (5 on these sites).variant is the size, color or pack the reviewer bought, when the site says. It's how you tell whether complaints cluster on one variant. See scraping product variants for the variant data itself.datePublished keeps the precision the site gives. Walmart gives a day, Target a full timestamp, and relative dates like "3 months ago" become a month (2026-07), never an invented day.additionalProperties carries site extras: Target's incentivized and recommended flags, and Walmart's syndicatedFrom (reviews shown on Walmart but collected elsewhere).author holds the reviewer's display name. You rarely need it; drop it before you store reviews.This script collects the lowest-rated reviews of a Walmart product and a Target product, then counts complaint themes with keyword lists. There's no AI model involved, so it costs nothing beyond the run and gives the same answer every time.
import os
import re
from collections import Counter
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("constructive_calm/ecommerce-product-scraper-pro").call(run_input={
"reviewDetailsUrls": [
{"url": "https://www.walmart.com/ip/ONN-10-C-C-BRD-WHT/18928659757"},
{"url": "https://www.target.com/p/3-39-usb-c-to-usb-c-charging-cable-dealworthy-8482-white/-/A-89698753"},
],
"sortReview": "Lowest rated",
"maxItemsPerStartUrl": 3, # per product, so one product can't use up the run cap
"maxReviewResults": 5, # run-wide cap; raise both for real analysis
})
reviews = [r for r in client.dataset(run["defaultDatasetId"]).iterate_items()
if r.get("recordType") == "review"]
# Complaint themes: a keyword list per theme. Edit these for your category.
THEMES = {
"stopped working": r"stopp?ed working|no longer works?|didn.t work|doesn.t work|not working|died|dead",
"physical damage": r"crack|fray|broke|wires? (?:visible|showing|exposed)|fell apart",
"short lifespan": r"lasted|weeks?|months? ago|already",
"fit / length": r"\bfit\b|loose|too? short|length",
"overheating / safety": r"\bhot\b|overheat|melt|spark|smoke|fire",
"wrong item": r"wrong item|received a|not as described|different (?:item|product)|ordered .{0,40}received",
"general quality": r"cheap|flimsy|crap|junk|poor quality",
}
low = [r for r in reviews if (r.get("rating") or 5) <= 2]
counts = Counter()
for r in low:
text = f"{r.get('title') or ''} {r.get('reviewBody') or ''}".lower()
for theme, pattern in THEMES.items():
if re.search(pattern, text):
counts[theme] += 1
print(f"{len(reviews)} reviews, {len(low)} rated 1-2 stars")
for r in reviews:
print(f" {r['site']:<11}{r['rating']}* sort={r['sortApplied']:<13}{(r.get('reviewBody') or '')[:70]!r}")
print("Complaint themes in 1-2 star reviews:")
for theme, n in counts.most_common():
print(f" {theme:<26}{n}/{len(low)}")
Output on 2026-10-20 (pip install apify-client, APIFY_TOKEN set):
5 reviews, 5 rated 1-2 stars
target 1* sort=Lowest rated 'Bought 3 months ago and it’s already cracked with wires visible in mul'
target 1* sort=Lowest rated "piece of crap. don't buy!!"
target 1* sort=Lowest rated 'to short of a cord'
walmart-us 1* sort=Lowest rated 'melted sparked barely got fire out but it melted the place on my phone'
walmart-us 1* sort=Lowest rated 'Ordered Braided USB-C to USB Cable. Received Braided USB-C Cable'
Complaint themes in 1-2 star reviews:
physical damage 1/5
short lifespan 1/5
general quality 1/5
fit / length 1/5
overheating / safety 1/5
wrong item 1/5
Five reviews is a demonstration, not a finding. For a real read, raise maxItemsPerStartUrl to 100–200 per product. The Target product had 95 reviews and the Walmart one 38, so a few hundred covers them all. Then read a handful of reviews behind each count before you trust it. Keyword themes miss misspellings ("minths") and sarcasm, and one review can hit several themes.
Two ways to make the counts more useful:
variant. If most "too short" complaints are on the 3 ft version, that's a sizing problem, not a quality one.Most recent every week. A theme that grows in recent reviews points to a new batch or a supplier change, while the lowest-rated sort mostly shows the worst reviews of all time.Black Friday is Friday, November 27, 2026, and Cyber Monday is November 30. Before you feature a product in a promotion, or buy a heavily discounted one, pull its lowest-rated reviews and look for safety or failure themes. A deep discount on an item with a cluster of "melted" or "stopped working" reviews isn't a deal. If you sell, a weekly Most recent run through November and December catches new complaints while there's still time to act, for example by fixing a listing or pausing a promotion. The holiday sales calendar has the 2026–2027 sale dates. To check the discount itself, see how to spot fake Black Friday discounts.
Pay per event, from the actor's pricing table: one review row is $0.0016 on Apify's FREE plan tier and $0.00056 on GOLD, plus $0.005 per run start. The README's example of 500 Target reviews is 500 × $0.00056 + $0.005 = $0.285 on GOLD; on FREE it's 500 × $0.0016 + $0.005 = $0.805. Review pages that need a residential proxy add a per-MB traffic fee. Apify's free plan includes $5 of usage every month, with no credit card required. There's no free trial inside the actor.
The free e-commerce price tracker builder creates a ready-to-run input for the actor's product section and shows a fixed example of the output. For reviews, use the review fields above in the actor's input form on Apify.
Disclosure: I built the actor and this site.
Sources: actor runs on 2026-10-20 (review sort and status text), our cloud test runs between 2026-10-17 and 2026-10-20 (per-site sort behavior and Amazon review counts), and the actor's README (supported-sites table, limitations, pricing).