How to Scrape Amazon Product Data (Titles, Prices, ASINs)

How to scrape Amazon product data, live-tested 2026: titles, ASINs, prices, ratings, review counts, features, and the fingerprint fix for stripped pages.

MMotherlode Lab10 min read
Magpie title card: How to Scrape Amazon Product Data, over the HTML source of product cards with a rating highlighted

Ask two tools for the same product URL and Amazon may hand one a complete 1.4 MB product page and the other a stripped shell. I ran that experiment six times today from a home connection, and this guide is the scorecard: which fields come back (title, ASIN, price, rating, review count, features), the two flags that flipped my failures into full records, and the places every method breaks. Scrape Amazon product data in 2026 and the parsing is the easy part; getting served the page at all is the fight. One ground rule first: Amazon’s terms bar automated access, its robots.txt permits /dp/ pages, and I stay on public pages at polite rates. Not legal advice.

What Amazon hands a scraper, and what its rules say

Product pages are old-fashioned server-rendered HTML. No login, no JavaScript required for the core data, no API key. That is why data scraping from amazon.com product pages has survived twenty years of redesigns: the fields sit in stable DOM hooks, unchanged even when the page cosmetics change.

The written rules cut both ways. robots.txt does not disallow /dp/ for User-agent: * (I checked the live file); it blocks /dp/shipping/, /dp/twister-update/, and a few submit endpoints, but the product pages themselves are fair game by that measure. The Terms of Use say otherwise for automated access, and Amazon enforces with rate limits, IP challenges, and page stripping rather than lawyers for small volumes. Amazon webscraping in 2026 is therefore not a parsing problem. It is a fingerprint and pacing problem, and everything below follows from that.

Six fields per product, and where each one hides

These are the hooks an Amazon product data scraper needs, and they are the same ones Magpie’s amazon_product vertical uses internally (verified in vertical/amazon.go, not read off a blog):

Field DOM hook The gotcha
ASIN The URL: /dp/{asin} or /gp/product/{asin} Never parse it from the page; take it from the URL
Title #productTitle Includes edition suffixes and, in the <title> tag, an “Amazon.com:” prefix you must strip
Price .a-price .a-offscreen, excluding the .basisPrice strikethrough Session-gated: see below
Rating span[data-hook="rating-out-of-text"], fallback #acrPopover title “4.6 out of 5”, not a number
Review count #acrCustomerReviewText “(11,893)” with commas and parentheses
Features #feature-bullets li span.a-list-item Includes the LEGAL DISCLAIMERS bullets; book pages have none

Two of those six bit me today. First, price: my AirTag fetch came back as a complete 1.4 MB page with zero .a-price blocks anywhere in the HTML. Not a challenge page: a real page where Amazon simply does not render the buy-box price until your session has a delivery zip. The same fetch of a book page carried 263 price blocks. Plan for price being absent on 2 out of 3 electronics pages and you will not design a pipeline that silently ships nulls.

Second, currency: Amazon localizes prices by IP, and my connection is geolocated to Thailand, so the book page rendered THB1,540.45. Magpie’s record stored {"amount": 1540.45} and dropped the currency. If you assume dollars, you just listed a $45 paperback at $1,540. Check the raw page once per market before you trust any amount field.

How to scrape Amazon product pages in one command

For scraping Amazon product data one command at a time, the fastest route I know is Magpie, a local Go binary whose zero-LLM verticals are typed extractors with the hooks above baked in. amazon_product auto-fires on amazon.com/dp/{asin} and /gp/product/{asin} URLs and needs no API key and no LLM credits:

magpie scrape "https://www.amazon.com/dp/0135957052" --vertical amazon_product

Real output from my run today, 15.9 seconds wall time (abridged):

{
  "vertical": "amazon_product",
  "record": {
    "asin": "0135957052",
    "availability": "In Stock",
    "list_price": { "amount": 1842.71 },
    "price": { "amount": 1540.45 },
    "rating": 4.8,
    "reviews": 3661,
    "title": "The Pragmatic Programmer: Your Journey To Mastery, 20th Anniversary Edition (2nd Edition)",
    "url": "https://www.amazon.com/dp/0135957052"
  }
}

That is Amazon product scraping reduced to one call: clean types, review count as an integer, rating as a float, strikethrough list price separated from the sale price. It runs in 5–16 seconds per page from a home connection, which is slower than raw requests but includes fetch, polite throttling, and the quality gate. The binary is free to download with 5 free runs per install, then $49/month; the core is AGPL-3.0-or-later or a commercial license, so you can also read every selector you just ran.

The honest limits, same day: review text never comes back, only the count; that data lives on a different, harder-to-reach page type. The vertical matches amazon.com only; amazon.de and co.uk need the DIY route below. And it detects bot challenges without bypassing them, by design. If you want a fuller mental model of the fetch, clean, and extract stages, how to scrape data from any website covers the general case.

When Amazon serves you a stripped page

Now the part most tutorials skip, because it did not happen in their screenshot. I fed the same vertical six product URLs with default settings, and four came back with Error: vertical: amazon_product: no product data at …. The pages were alive: the same URLs fetched fine with plain curl and a browser user-agent, so Amazon was filtering by fingerprint, not by IP ban.

Magpie exposes the two dials that matter: --browser (a TLS-impersonating fingerprint: chrome, firefox, safari, edge) and --header-profile (a matching header bundle). With both set to chrome, the failures flipped:

Product page Default fetch --browser chrome --header-profile chrome
Pragmatic Programmer (0135957052) Full record, 15.9 s —
AirPods Pro 3 (B0FQFB8FMG) Full record, no price —
AirTag 2nd gen (B0GJTFXNRX) Refused, twice Full record: 4.6★, 11,893 reviews, 10 features
EarPods USB-C (B0DCH8VDXF) Refused, twice Full record: 4.5★, 19,062 reviews, 5 features
Blink Plus plan (B08JHCVHTY) Refused Still refused (subscription page, different DOM)
Echo Dot 4th gen (B08N5WRWNW) Refused Dead ASIN: Amazon 404s a 1,147-byte stub

Two lessons in that table. The cheap-looking one: TLS alone was not enough when I tested --browser chrome by itself; the header profile had to match. The deeper one: “no product data” is doing useful work. A dead ASIN, a subscription product, and a challenge page all produce the same loud refusal instead of a record full of nulls, and a pipeline that fails loudly is worth more than one that fails quietly.

I keep pacing manual: a few seconds of sleep between hits, low concurrency, stop when errors cluster. When the refusals start, adding flags is step two; waiting an hour is step one. There is no CAPTCHA bypass in this toolkit and I would not trust one that claims it.

Scrape product data from Amazon ASIN lists without getting throttled

Lists of ASINs are the real workload: a supplier catalog, a competitor set, a wishlist. Magpie’s batch command takes URL lists but has no --vertical flag (checked --help today), so for typed records the pattern is a loop with your own pacing and your own resume logic:

mkdir -p asins && while read -r asin; do
  [ -s "asins/$asin.json" ] && continue          # resume: skip existing
  magpie scrape "https://www.amazon.com/dp/$asin" \
    --vertical amazon_product \
    --browser chrome --header-profile chrome \
    --out "asins/$asin.json" || echo "$asin" >> dead.txt
  sleep 5
done < asin-list.txt

Five seconds between requests, one file per ASIN, failures collected in dead.txt instead of killing the run. At 12 products a minute you can do 1,400 in an afternoon; a same-domain crawl of that many pages would have been blocked in the first hundred. Validate the results before they reach a spreadsheet: empty price fields are normal, and the checks in how to clean scraped data catch the rest. For overnight scheduling, the patterns in automated web scraping slot straight in.

Don’t point a web crawler at amazon.com

Search web crawler amazon and you get tools promising site-wide discovery. That is the wrong tool twice over. Amazon lists hundreds of millions of products, so a same-domain crawl is millions of requests for data you do not need, and every request is a ticket in Amazon’s lottery. Discovery works the other direction: harvest ASINs from a category page, a search-results page, or a list you already have, then fetch product pages one at a time from that list. Crawl the small enumeration pages, scrape the individual products. Never both at site scale.

If your actual goal is a price that moves, a watcher beats a repeated scrape: the setup in the Amazon price scraper guide covers what watch mode does and what it refuses to do (any-change alerts, not “below X” triggers). And if your catalog lives on a hosted store rather than Amazon, those platforms are friendlier targets; the Shopify guide and the ecommerce product scraper walkthrough show the JSON-endpoint difference.

The free Amazon scraper options, ranked

Free means three different things here, and I have run all three this week.

DIY: requests + BeautifulSoup. Free forever, twenty lines, and the selectors are the same ones from the field table:

import requests
from bs4 import BeautifulSoup

url = "https://www.amazon.com/dp/0135957052"
html = requests.get(url, timeout=30, headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0 Safari/537.36",
}).text
soup = BeautifulSoup(html, "html.parser")
print(soup.select_one("#productTitle").get_text(strip=True))
price = soup.select_one(".a-price .a-offscreen")
print(price.get_text(strip=True) if price else "no price in HTML")

I verified every selector in that script against a saved Amazon page today; it pulled the title, THB1,540.45, “4.8 out of 5”, and “(3,661)” reviews. What it does not have: pacing, resume, fingerprint escalation, or the loud-failure gate. It will run for months, then one Tuesday it starts saving challenge pages as if they were products, and you will not notice for a week.

Magpie’s free tier. Five full runs per install, no account. Enough to test ten product URLs across two days, which is exactly the right size for deciding whether this article’s approach fits your data. After that it is $49/month, or the AGPL source if you would rather own it.

Freemium cloud scrapers. The Amazon data scraper products with free tiers (ScraperAPI, Octoparse, ScrapeStorm) give you free credits to test with, which is genuine value on one-off jobs. The trap is per-credit pricing: every stripped page and challenge retry burns credits you pay for, and Amazon retries a lot. As Amazon scraper software goes, the free tiers are good trials and expensive habits.

When to pay for an API instead

Three cases, and they are common enough that pretending otherwise would be dishonest. Scale past a few thousand products per day. Regional marketplaces: the DIY selectors port to amazon.de with format changes, but you inherit the fingerprint war, and the commercial Amazon data extractor APIs (Oxylabs, Bright Data, ScraperAPI) price proxy rotation in by default; ScraperAPI’s entry tier runs about $69 for 66,700 successful requests per Proxyway’s 2026 pricing review. And review text: the local routes here never fetch it, while Amazon-data APIs treat it as a standard field.

The sanctioned route also exists: Amazon’s SP-API for sellers, and the affiliate PA-API, which Amazon’s own docs deprecate on May 15, 2026 in favor of the Creators API. If you are building on Amazon rather than studying it, an official key beats an arms race. If you are doing market research on a few hundred products a week, everything above stands.

FAQ

Is scraping Amazon legal? Public product data at polite rates is the accepted baseline, but Amazon’s terms prohibit automated access and it actively enforces. hiQ v. LinkedIn narrowed CFAA exposure for public data without settling ToS disputes. Not legal advice; commercial reuse of the data raises copyright questions of its own.

Will Amazon block my IP for scraping? At low volume with pacing, my home connection ran all day without an IP ban; Amazon filtered some requests by fingerprint instead. At high volume, expect challenges, stripped pages, then IP blocks, roughly in that order.

How do I get Amazon review text, not just the count? Not with a local scraper; review pages are the most aggressively protected part of the site. Use a commercial Amazon API that includes reviews, or accept the count and rating summary.

Does this work on amazon.de, amazon.co.uk, or amazon.co.jp? The amazon_product vertical is amazon.com-only by design. The DOM hooks are similar on regional TLDs, but price formats, currency, and layout differ, so budget a day of re-verification per market.

How do I know the article’s commands still work? The live tests here ran October 16, 2026, from a residential connection. Amazon changes its DOM and defenses without notice; re-run one product URL before trusting any of it in production.

Start with five product URLs you actually care about and the fingerprint pair from the stripped-page section. If all five come back typed and clean, you have a pipeline; if not, the failure mode will tell you which of the paid routes you actually need.

Stop renting credits.

One flat price, your machine, your keys.

Download free for Windows, macOS and Linux

Windows · macOS · Linux $49/mo flat, cancel anytime