Product details, reviews and pricing pulled from live Amazon product pages into one flat record per ASIN.
Two samples, not one — because one sample proves nothing. Amazon serves several different detail-page layouts, and a scraper built against one returns nulls on another. These are deliberately from different categories:
| File | Product | What it demonstrates |
|---|---|---|
sample_B0DBR3DZWG.json |
Kingston NV3 1TB NVMe SSD | 10-row technical spec table, 27% promotion, price vs list_price |
sample_B0CFQ5T5F6.json |
LISEN USB-C cable 5-pack | different page layout, 5 spec rows |
Both captured from live pages. 10/10 reviews complete in each.
Reviews carry no reviewer identity — no name, profile link or ID. Only the rating, text, date and verified-purchase flag, because nothing else is needed to analyse a product and collecting it would mean holding personal data for no reason.
Each one produces a scraper that looks correct on the ASIN you tested and then quietly returns nulls across a real catalogue.
1. The price is in a hidden node.
The authoritative price lives in .a-offscreen, which is visually hidden.
Selenium's .text returns "" for anything not rendered, so it silently loses
the price on every product. textContent is required.
2. Spec cells contain inline JavaScript.
textContent walks every descendant including <script>, and Amazon inlines JS
inside detail-table cells — so spec values come back as minified JavaScript.
script/style/noscript have to be stripped from the DOM before reading.
3. The review hooks were renamed.
data-hook="review-title" and review-body became reviewTitle and
reviewText. Most published code still uses the old names and returns zero
reviews today. Both forms need querying, since Amazon A/B-tests between them.
4. Prices are localised by exit IP.
The same ASIN returns USD from a US IP and EUR from a European one — these
samples were captured from an EU host, hence EUR. On a scheduled job whose exit
location varies, you get silently mixed currencies in a single column and
nothing flags it. The exit region has to be pinned and currency recorded per
row.
Long spec cells are also rendered twice — full text plus a truncated copy ending in "… See more" — so naive reads return the value doubled.
A block page returns 200 OK. Parsed as data it yields "0 results" rather than
an error, and a daily feed quietly fills with gaps nobody notices for weeks.
Every response is classified before extraction — WAF challenge, captcha,
rate-limit, or un-hydrated shell — and only then does the run decide whether to
retry, rotate or log. That machinery is open source:
stealth-scrape.
Amazon's Terms of Service prohibit automated access. This repository contains
sample output only, to demonstrate field coverage and page-layout handling. It
reads public product pages and collects no personal data. Check the ToS and
robots.txt of any site before pointing a scraper at it.
Want a specific ASIN from your own catalogue in this format? Ask — it takes a few minutes and costs you nothing to verify.
{ "asin": "B0DBR3DZWG", "url": "https://www.amazon.com/dp/B0DBR3DZWG", "title": "Kingston NV3 1TB M.2 2280 NVMe SSD | PCIe 4.0 Gen 4x4 ...", "brand": "Kingston", "bullets": ["...", "..."], // feature bullets "specs": { "Digital Storage Capacity": "1 TB", ... }, "images": ["https://m.media-amazon.com/images/I/..."], "price": 135.84, "list_price": 186.89, "currency": "EUR", // recorded, never assumed — see below "promo_text": "-27%", "availability": "In Stock", "rating": 4.7, "review_count": 13524, "reviews": [ { "rating": 5.0, "title": "...", "body": "...", "date": "Reviewed in the United States on June 28, 2026", "verified": true } ], "scraped_at": "2026-08-10T05:03:00+00:00" }