A tested walkthrough for Amazon Product Data -- the right proxy type, 87% tested success rate, working code, and what to avoid to stay compliant.
Amazon product titles, prices, ratings, and availability are scrapable with residential rotating proxies routed through US IPs. Amazon runs a custom WAF with interstitial CAPTCHA challenges, and KnoxProxy residential IPs held an 87% success rate on product-page requests during the last test cycle. This Amazon scraper setup works for one-off price checks and continuous monitoring pipelines alike.
| Anti-bot system | Custom WAF with CAPTCHA challenges |
| Challenge types | Interstitial "Enter the characters you see" CAPTCHA, JavaScript fingerprint checks on page load, TLS and HTTP/2 header fingerprinting, IP reputation scoring across the datacenter/residential split |
| Rate limit behavior | Escalates from soft throttling to a full CAPTCHA wall after roughly 15-20 rapid requests from a single IP; repeat offenders receive temporary IP-level blocks that can last several hours. |
| Tested success rate | 87% |
"""
KnoxProxy scraper for Amazon product pages.
Extracts title, price, rating, review count, and availability from a
public Amazon product detail page (ASIN-based URL).
"""
import random
import time
import requests
from bs4 import BeautifulSoup
PROXY_HOST = "proxy.knoxproxy.com"
PROXY_PORT = 10000 # residential rotating
PROXY_USER = "your_username"
PROXY_PASS = "your_password"
HEADERS = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
),
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
}
def build_proxy_url(country: str = "us") -> str:
user = f"{PROXY_USER}-country-{country}"
return f"http://{user}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
def fetch_amazon_product(asin: str, country: str = "us", max_retries: int = 3) -> dict:
url = f"https://www.amazon.com/dp/{asin}"
proxy_url = build_proxy_url(country)
proxies = {"http": proxy_url, "https": proxy_url}
for attempt in range(1, max_retries + 1):
try:
resp = requests.get(url, headers=HEADERS, proxies=proxies, timeout=20)
if resp.status_code == 200 and "captcha" not in resp.text.lower():
return parse_amazon_page(resp.text, asin)
print(f"Attempt {attempt}: status {resp.status_code}, retrying with a new IP")
except requests.exceptions.RequestException as exc:
print(f"Attempt {attempt}: request failed ({exc})")
time.sleep(random.uniform(2, 5))
raise RuntimeError(f"Failed to fetch Amazon ASIN {asin} after {max_retries} attempts")
def parse_amazon_page(html: str, asin: str) -> dict:
soup = BeautifulSoup(html, "html.parser")
title_el = soup.select_one("#productTitle")
price_el = soup.select_one(".a-price .a-offscreen")
rating_el = soup.select_one("span.a-icon-alt")
review_count_el = soup.select_one("#acrCustomerReviewText")
availability_el = soup.select_one("#availability span")
return {
"asin": asin,
"title": title_el.get_text(strip=True) if title_el else None,
"price": price_el.get_text(strip=True) if price_el else None,
"rating": rating_el.get_text(strip=True) if rating_el else None,
"review_count": review_count_el.get_text(strip=True) if review_count_el else None,
"availability": availability_el.get_text(strip=True) if availability_el else None,
}
if __name__ == "__main__":
asins = ["B0BSHF7WHW", "B08N5WRWNW"]
for asin in asins:
print(fetch_amazon_product(asin))
time.sleep(random.uniform(2, 5)) # pace requests between ASINs
{
"asin": "B0BSHF7WHW",
"title": "Echo Dot (5th Gen) Smart Speaker with Alexa",
"price": "$29.99",
"rating": "4.7 out of 5 stars",
"review_count": "89,412",
"availability": "In Stock"
}Install requests and BeautifulSoup for HTTP requests and HTML parsing.
pip install requests beautifulsoup4Set your residential gateway credentials and target country as environment-friendly constants.
PROXY_HOST = "proxy.knoxproxy.com"
PROXY_PORT = 10000 # residential rotating
PROXY_USER = "your_username"
PROXY_PASS = "your_password"Fetch the product detail page for a given ASIN through the rotating proxy with a realistic browser User-Agent.
Extract fields with BeautifulSoup and retry with a fresh IP whenever a CAPTCHA page is returned instead of product data.
Amazon Product Data runs custom WAF with CAPTCHA challenges. The tested setup is residential rotating proxies, targeting uS residential IPs for amazon.com; match the proxy country to the marketplace TLD (co.uk, de, in, co.jp) you are targeting, with this rotation: New IP every 1-2 requests, or a fresh IP per ASIN page. That combination held a 87% success rate on the Jul 1, 2026 test run.
The proxy is half the job — new IP every 1-2 requests, or a fresh IP per ASIN page is what turns a working request into a repeatable one.
New IP every 1-2 requests, or a fresh IP per ASIN page.
US residential IPs for amazon.com; match the proxy country to the marketplace TLD (co.uk, de, in, co.jp) you are targeting.
Amazon Product Data leans on interstitial "Enter the characters you see" CAPTCHA. Escalates from soft throttling to a full CAPTCHA wall after roughly 15-20 rapid requests from a single IP; repeat offenders receive temporary IP-level blocks that can last several hours.
Our legality guide and AUP cover the boundaries in full — staying inside them is what keeps a scraping program durable.
Amazon's robots.txt permits crawling of most product pages, but its Conditions of Use separately prohibit automated data collection. Most Amazon price scraper tools and price-tracking dashboards scrape public listing pages anyway, managing risk with pacing and proxy rotation rather than relying on explicit permission.
Residential rotating proxies work best because Amazon's WAF scores datacenter IP ranges far more aggressively. Rotating on every request, or every two requests, keeps any single IP below the threshold that triggers a CAPTCHA wall.
Pace requests to 1-3 per second, randomize delays, rotate residential IPs per request, and send realistic browser headers including a current User-Agent and Accept-Language. Retrying a blocked request from a fresh IP rather than the same one recovers most failed pulls.
Yes, review text and star ratings on the product page are publicly visible, but reviewer profile links and account-level data should be left out of any collection to stay within a public-data-only scope.
The Python code above is a tested, working Amazon scraper you can run as-is or extend with your own fields. It handles proxy rotation and retry logic directly, so there's no separate service to configure before you start pulling product data.
Free trial on residential proxies -- 87% tested success, no credit card.