Back

How to Scrape Amazon Product Pages Without Getting Blocked in 2026

An illustratation for scraping Amazon product pages

How to Scrape Amazon Product Pages Without Getting Blocked in 2026

An illustratation for scraping Amazon product pages

Amazon is the richest source of product data on the internet. Pricing intelligence, competitor monitoring, review sentiment analysis, inventory tracking. It all flows through Amazon's product pages, and businesses that can collect it reliably have a structural advantage.

Amazon is also the hardest mainstream target to scrape. Its defense stack gets more aggressive every year, and most scrapers get blocked within hours, not because of bad code, but because of the wrong infrastructure.

This guide covers the full setup for developers, e-commerce operators, and data teams: tools, working code, anti-detection techniques, and the proxy infrastructure that makes the difference.

Key Takeaways

  • Amazon runs a multi-layer defense stack including AWS WAF, IP reputation scoring, TLS fingerprinting, browser fingerprinting, and CAPTCHA challenges. No single bypass is enough on its own
  • Datacenter proxy ranges, including those from well-known providers, are routinely flagged at the ASN level; residential proxies with genuine ISP-assigned IPs are the minimum viable starting point
  • curl_cffi with the impersonate parameter handles both TLS fingerprinting and browser headers automatically, with no manual header configuration needed
  • Scraping publicly available product pages sits in a legally defensible position under current case law, but Amazon's Terms of Service explicitly prohibit it. Ethical, rate-conscious scraping is non-negotiable

Tools You Need Before Scraping Amazon

Amazon scraping requires a layered toolkit. Each component solves a different problem, and skipping any one of them is usually what causes blocks.

HTTP Library: curl_cffi

For static product pages, curl_cffi is the right starting point. Unlike Python's standard requests library, curl_cffi impersonates real browser TLS and HTTP/2 fingerprints, including the correct headers for the browser version you specify.

When you set impersonate="chrome", it handles all of that automatically and Amazon sees a fingerprint identical to a real Chrome browser rather than a Python script.

You can install it with:

///

pip install curl_cffi --upgrade

///

For pages that load prices or availability via JavaScript, you also need a headless browser. Playwright is the current standard, compatible with playwright-stealth, which patches the automation signals headless browsers expose by default.

HTML Parser: BeautifulSoup

BeautifulSoup works well for Amazon product pages once you have clean HTML. For higher throughput, lxml is faster.

If you are building on Scrapy, its built-in Parsel parser handles CSS selectors and XPath natively. For large-scale crawls across thousands of ASINs, Scrapy also provides built-in middleware for retries, rate limiting, and proxy rotation.

Proxy Infrastructure

This is where most operations fail. Amazon pre-flags entire datacenter ASN ranges, so requests from known data center IPs arrive pre-scrutinized before your headers or behavior are even evaluated. You need residential proxies: IPs assigned by real ISPs to real devices.

GoProxies provides a pool of 80 million IPs, 30 million of which are residential, with the lowest fraud scores in the market, which is exactly what Amazon's WAF reputation scoring checks for. Pay-as-you-go pricing means no upfront commitment.

How to Scrape Amazon Product Pages (Step-by-Step)

The steps below walk through a complete working setup, from constructing target URLs to exporting data. Each step builds on the previous one.

Step 1: Identify Your Target URLs

Amazon product pages follow a predictable structure based on the ASIN (Amazon Standard Identification Number). Constructing direct product URLs is cleaner than crawling search results and avoids the more heavily monitored search result pages.

///

base_url = "https://www.amazon.com/dp/{asin}"

asins = ["B09XYZ1234", "B08ABC5678", "B07DEF9012"] urls = [base_url.format(asin=asin) for asin in asins]

///

Step 2: Set Up Your Environment

Install the core dependencies:

///

pip install curl_cffi beautifulsoup4 lxml

///

Create a dedicated virtual environment to keep dependencies isolated, especially if you are running multiple scrapers side by side.

Step 3: Make Requests With curl_cffi and GoProxies

curl_cffi accepts a proxy via the proxy parameter. Setting impersonate="chrome" matches the latest Chrome TLS fingerprint and headers automatically. Paired with a rotating residential proxy from GoProxies, each request arrives from a different ISP-assigned IP with a clean browser fingerprint.

///

from curl_cffi import requests

response = requests.get( "https://www.amazon.com/dp/B09XYZ1234", proxy="http://user:pass@proxy.goproxies.com:port", impersonate="chrome" )

///

Note: using impersonate="chrome" without a pinned version keeps your fingerprint up to date as curl_cffi releases new browser targets.

See GoProxies rotating residential proxy plans. Pay-as-you-go, no credit card required.

Step 4: Parse Product Data With BeautifulSoup

Once you have clean HTML, extract the fields you need using CSS selectors. Always add null checks, as Amazon's page structure varies by product type and region.

The example below is adapted from the amzpy open-source Amazon scraper, which uses curl_cffi under the hood.

///

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, "lxml")

title = soup.select_one("#productTitle") price = soup.select_one(".a-price .a-offscreen") rating = soup.select_one("span[data-hook='rating-out-of-text']") review_count = soup.select_one("#acrCustomerReviewText") availability = soup.select_one("#availability span")

product = { "title": title.get_text(strip=True) if title else None, "price": price.get_text(strip=True) if price else None, "rating": rating.get_text(strip=True) if rating else None, "reviews": review_count.get_text(strip=True) if review_count else None, "availability": availability.get_text(strip=True) if availability else None, }

///

Step 5: Store and Export Your Data

Write to newline-delimited JSON for easy streaming and incremental processing. Track which ASINs have already been scraped to avoid duplicate requests on large runs.

///

import json

with open("products.json", "a") as f: json.dump(product, f) f.write("\n")

///

How to Avoid Being Blocked When Scraping Amazon

Getting past Amazon's defenses requires more than one fix. The sections below cover the key layers, each of which needs to be in place for consistent results.

Use Residential Proxies With Low Fraud Scores

The most common reason scrapers fail on Amazon is proxy quality. Amazon's WAF checks IP reputation at the ASN level, and large datacenter IP ranges from well-known providers are flagged.

Requests from those IPs arrive pre-scrutinized regardless of how clean your fingerprint looks.

Fraud score matters too. IPs with history in spam or credential stuffing carry reputation debt that follows them.

GoProxies maintains the lowest fraud scores in the market, which translates directly into higher success rates on Amazon. Check rotating residential proxy pricing here.

Headless Browsers With Stealth Patches

When scraping JavaScript-rendered pages, use Playwright with playwright-stealth to patch the signals headless browsers expose, primarily navigator.webdriver, WebGL renderer strings, and canvas fingerprints. The pattern below follows the approach in the luminati-io/curl_cffi-web-scraping reference implementation.

///

from playwright.sync_api import sync_playwright from playwright_stealth import stealth_sync

with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() stealth_sync(page) page.goto("https://www.amazon.com/dp/B09XYZ1234")

///

Add Human-Like Delays and Handle Errors

Uniform request intervals are a reliable bot signal. Randomize your delays and check for soft blocks before parsing. These are pages that return 200 but contain a robot check:

///

import time, random

def human_delay(): time.sleep(random.uniform(2.0, 5.5))

if "robot check" in response.text.lower() or "captcha" in response.text.lower(): human_delay() # rotate proxy and retry

///

Keep concurrent requests between 3 and 10 per proxy pool. Aggressive parallelization is one of the fastest ways to trigger rate-based blocks.

Main Challenges When Scraping Amazon

Amazon's defense stack is more sophisticated than most enterprise applications. Understanding each layer makes every configuration decision easier.

AWS WAF and IP Reputation Scoring

Amazon runs AWS WAF in front of its product pages, evaluating requests against IP reputation databases and continuously updated rule sets.

Requests from known datacenter ASNs are flagged at the network level before your headers or behavior are even evaluated, which is why proxy selection matters more than anything else.

TLS Fingerprinting

When your client initiates an HTTPS connection, it sends a Client Hello message before encryption begins. The cipher suites, TLS extensions, and elliptic curves it contains form a fingerprint unique to each library.

Python's requests has a measurably different fingerprint from real browsers, and Amazon uses JA3/JA4 hashing to act on this. curl_cffi with impersonate="chrome" resolves it.

Browser Fingerprinting

Amazon checks over 100 browser environment signals: User-Agent, screen resolution, installed fonts, WebGL renderer, canvas hash, and navigator.webdriver, a boolean that is true in any unpatched headless browser. playwright-stealth patches these before your session starts.

Behavioral Biometrics

Amazon analyzes mouse movement trajectories, scroll velocity, and click timing. Human movements have natural curves and micro-jitters; scripted movements follow straight paths at constant velocity. For Playwright scrapers, randomize scroll depth, add pauses, and avoid perfectly linear navigation sequences.

CAPTCHA Challenges

When other detection layers flag a session, Amazon escalates to CAPTCHA, ranging from silent JavaScript environment checks to full image-based puzzles.

Prevention is the best strategy: clean IP reputation, correct TLS fingerprint, and realistic behavior means CAPTCHA rarely appears. When it does, rotating to a fresh proxy and clearing cookies is usually enough.

Dynamic JavaScript Rendering

Prices, availability, and add-to-cart states are increasingly loaded via JavaScript after the initial HTML response.

A scraper using curl_cffi alone receives the HTML shell without this content. For these fields, switch to Playwright and wait for the relevant elements to render before extracting.

Common Errors When Scraping Amazon and How to Fix Them

Even a well-configured scraper will run into errors on Amazon. Here are the most common ones and how to resolve them.

503 / "Robot Check" Page

Amazon has flagged your IP or session. The 503 may be a hard HTTP error or a soft block returning 200 with a robot-check body.

Check the response HTML for "robot check" or "captcha" strings, rotate your proxy, clear cookies, and retry after a randomized delay.

404 on Valid ASINs

The product exists but is not available in the geographic region your proxy IP maps to. Use GoProxies' geo-targeting to route requests through IPs matching your target domain. Use US IPs for amazon.com and UK IPs for amazon.co.uk.

Empty or Stale Price Fields

The price is loaded dynamically via JavaScript and is absent from the initial HTML response. Switch to Playwright and wait for the element to render before parsing:

///

page.goto(url) page.wait_for_selector(".a-price", timeout=10000) html = page.content()

///

CAPTCHA Loop

Your session is burned. Rotate to a completely fresh proxy IP, create a new browser context with fresh cookies and a new fingerprint profile, and restart from scratch. Do not try to solve your way out of a burned session.

Broken Selectors After Site Updates

Amazon regularly updates its HTML structure, breaking hard-coded CSS selectors. Build selector fallback chains: try multiple known selectors for each field and use the first that matches.

Anchor selectors to stable IDs like #productTitle rather than class names, which change more frequently.

Silent Throttling

Amazon rate-limits your IP without returning an error. Requests time out or return after unusually long delays with no error code.

Monitor response time as a metric. If it climbs significantly above baseline, pause the session, rotate the proxy, and reduce concurrency.

What You Can Extract From Amazon Product Pages

Amazon's public product pages contain a substantial amount of commercially valuable data, all accessible without a login:

  • Product title and ASIN
  • Current price, list price, and discount percentage
  • Star rating and total review count
  • Product description and bullet-point feature list
  • Category breadcrumb and Best Sellers Rank
  • Seller name and fulfillment method (FBA vs. FBM)
  • Stock and availability status
  • Product images and image URLs
  • Variation data (size, color, model options)
  • Customer Q&A section

For teams monitoring pricing across thousands of SKUs daily, consistent uptime at the proxy layer is what keeps your dataset complete. GoProxies' rotating residential proxies are built for this kind of sustained, high-volume operation.

Is It Legal to Scrape Amazon?

The short answer is: it depends on what you scrape and how. Here is what current law and Amazon's own policies say.

Public vs. Private Data

Scraping publicly accessible product pages, including prices, titles, ratings, and descriptions, sits in a legally defensible position under current case law.

The HiQ Labs v. LinkedIn case established that scraping non-password-protected, publicly available data does not violate the Computer Fraud and Abuse Act.

Private data is off-limits both legally and ethically, including anything behind a login wall such as order history or extended reviews.

Amazon's Terms of Service

Amazon's Conditions of Use explicitly prohibit automated access to its services. Violating ToS is not the same as breaking the law, but it does expose you to IP bans, account suspensions, and potential civil action.

Stick to public product data and respect rate limits.

Regional Compliance

If your scraping operation involves data that touches EU or California residents, GDPR and CCPA considerations apply. Stick to product-level data and avoid anything that could constitute personal data.

Using the Amazon Product Advertising API Instead of Scraping

Amazon offers the Product Advertising API for structured access to product data, but it requires an active Amazon Associates affiliate account and approval is not guaranteed.

Pros: Fully compliant, structured JSON responses, no blocks or CAPTCHAs, stable schema.

Cons: Affiliate account required, one request per second rate limit, limited data fields, no competitor seller data, no BSR history.

Choose the API for low-volume, compliance-critical use cases. Choose scraping for scale, breadth of data, or any field the API does not provide, which covers most serious commercial use cases.

Can You Scrape Amazon for Free?

Technically yes. At any meaningful scale, no.

Free proxy IPs are shared across thousands of users, carry burned reputations, and get flagged by Amazon's WAF before the first request completes. Free scraping tools cap requests, lack proxy rotation, and have no CAPTCHA handling.

The real cost is engineering time spent debugging blocks instead of working on the actual data problem. GoProxies offers pay-as-you-go plans with no minimums or contracts, so you only pay for what you use.

Conclusion

Scraping Amazon in 2026 is genuinely hard. The operations that succeed share the same foundation: residential proxies with clean reputation, TLS fingerprint spoofing via curl_cffi, and stealth-patched headless browsers for JavaScript-rendered content.

Realistic request timing and disciplined error handling with session rotation round out the stack.

The proxy layer is where most operations fall down, and it is also the easiest variable to fix.

See GoProxies rotating residential proxy plans: 30 million ethically sourced residential IPs, the lowest fraud scores in the market, and pay-as-you-go pricing with no credit card required.

GoProxies Research Team is a group of analysts and writers focused on web data, online privacy, and proxy technology. They produce practical, research-backed content that helps readers understand digital trends, tools, and best practices.

Turn data insights into growth with GoProxies
Millions of IPs are just a click away!

What’s a Rich Text element?

The rich text element allows you to create and format headings, paragraphs, blockquotes, images, and video all in one place instead of having to add and format them individually. Just double-click and easily create content.

Static and dynamic content editing

A rich text element can be used with static or dynamic content. For static content, just drop it into any page and begin editing. For dynamic content, add a rich text field to any collection and then connect a rich text element to that field in the settings panel. Voila!

How to customize formatting for each rich text

Headings, paragraphs, blockquotes, figures, images, and figure captions can all be styled after a class is added to the rich text element using the "When inside of" nested selector system.

FAQ

What Are Rotating Residential Proxies?
Rotating Residential Proxies offer you the best solution for scaling your scraping without getting blocked.

Rotating proxies provide a different IP each time you make a request. With this automated rotation of IPs, you get unlimited scraping without any detection. It provides an extra layer of anonymity and security for higher-demand web scraping needs.

IP addresses change automatically, so after the initial set up you’re ready to scrape as long and much as you need. IPs may shift after a few hours, a few minutes or after each session depending on your configuration. We do this by pulling legitimate residential IPs from our pool.
Why Do You Need Rotating Residential Proxies?
There are a number of use cases for rotating residential proxies. One of the most common ones is bypassing access limitations.

Some websites have specific measures in place to block IP access after a certain number of requests over an extended period of time.

This limits your activity and hinders scalability. With rotating residential IP addresses, it's almost impossible for websites to detect that you are the same user, so you can continue scraping with ease.
When to Use Static Residential Proxies Instead?
There are particular cases where static residential proxies may be more useful for your needs, such as accessing services that require logins.

Rotating IPs might lead to sites not functioning well if they are more optimised for regular use from a single IP.

Learn if our static residential proxies are a better fit for your needs.
Can I choose the IP location by city?
Yes. GoProxies has IPs spread across almost every country and city worldwide.
Can I choose the IP location by country state?
Yes. GoProxies has IPs spread across X countries with localised IPs in every state.

Is it legal to scrape Amazon product pages?

Scraping publicly available Amazon product pages is generally permissible under current case law. HiQ v. LinkedIn established that accessing non-password-protected public data does not violate the CFAA. However, it violates Amazon's Terms of Service, which can result in IP bans or civil action. Limit scraping to public product data and avoid anything behind a login wall.

What is the best proxy type for scraping Amazon?

Residential proxies are the most effective type for scraping Amazon. They use IPs assigned by real ISPs to consumer devices, making them appear as legitimate users to Amazon's WAF. Datacenter proxies are cheaper, but their IP ranges are flagged at the ASN level by Amazon's reputation scoring systems regardless of how clean your headers or behavior look.

How do I fix the Amazon robot check page?

The robot check page means your IP or session has been flagged. Rotate to a fresh residential proxy IP, clear all cookies and session data, wait a randomized delay, and retry. If it persists across multiple fresh IPs, the issue is likely your TLS fingerprint. Make sure you are using curl_cffi with impersonate="chrome" rather than Python's standard requests library.