What goes wrong when this scraper fails
A repricer needs the live Buy Box price and seller for 40,000 ASINs every hour; a brand wants to catch MAP violations across the US, UK, and German marketplaces. Both break the same way on datacenter IPs: Amazon serves the 'Robot Check' CAPTCHA, a 503 error page, or — worse — a 200 OK rendering the wrong currency and offer because the request appears to come from another country. The pipeline keeps running and the numbers are quietly wrong.
Why this failure mode happens
Amazon tailors price, the Buy Box winner, deliverability, and even which offers show to the visitor's apparent country and history, then protects those pages with mature bot detection — IP reputation, request velocity, browser/device fingerprinting, and behavioral signals. Shared datacenter ranges are both low-trust and geographically wrong, so they get challenged fast and, when they slip through, return a localized page that does not match the marketplace you meant to measure.
Challenges that make this hard to automate
- Price, Buy Box, and availability are localized to the visitor's apparent country
- Robot Check CAPTCHAs and 503 pages appear quickly under sustained automated access
- The Buy Box winner and price change throughout the day, so snapshots go stale fast
- Price markup varies by category (corePrice, deal blocks, coupons), breaking single-selector parsers
- Some offers only appear on the /gp/offer-listing page, not the product page
Approaches that usually fail
- The Product Advertising API — official, but eligibility-gated, field-limited, and rate-capped well below catalog scale
- Datacenter proxies — flagged quickly and originating from the wrong marketplace
- A single residential IP — fine for spot checks, blocked the moment velocity rises
- Manual checks — accurate but impossible across tens of thousands of ASINs hourly
When residential proxies fix this — and when they cannot
Residential IPs from the marketplace's own country make each request read as a local shopper, so you see the exact price and Buy Box that shopper sees. Spreading a 40,000-ASIN crawl across a broad rotating pool keeps each IP's velocity below Amazon's thresholds — the scaling lever is pool breadth, not faster requests on fewer IPs.
How Aethyn residential proxies help here
Amazon punishes geographic mismatch and velocity, and it is a high-security target. Aethyn addresses both directly, switching marketplaces through the username on a single endpoint.
- Country targeting (-country-de, -country-gb …) to align the exit with each marketplace's price and Buy Box
- Elite high-trust residential reputation for one of the web's most defended targets
- Per-request rotation to spread a large ASIN crawl thin across many IPs
- Sticky sessions for multi-step checks (offer-listing pages, add-to-cart availability)
- Per-byte metering so an hourly catalog crawl stays cost-predictable
How to implement this with residential proxies
- 1
Match the marketplace TLD to the exit country
The single most common mistake is mixing these up. To price the German marketplace, request amazon.de through a -country-de exit and send a de-DE Accept-Language. The TLD, the IP country, and the language header should all agree — that triple is what makes Amazon render the page a local shopper sees.
cURLcurl -x "http://aethyn-XXXXX-country-de:PASSWORD@proxy.aethyn.io:5499" \ -H "Accept-Language: de-DE,de;q=0.9" \ "https://www.amazon.de/dp/B0XXXXXXX"Field note: Keep a marketplace map in code: {"de": ("amazon.de", "de-DE"), "uk": ("amazon.co.uk", "en-GB"), ...}. Driving TLD, country, and Accept-Language from one table stops the slow drift where someone prices amazon.com through a UK IP and nobody notices.
- 2
Fetch the product page with a realistic identity (Python)
Send a full, browser-like header set, not a bare User-Agent. requests reads the proxy URL for both HTTP and HTTPS. Check the status and the URL — Amazon's block states are explicit and worth detecting up front.
Python (requests)import requests PROXY = "http://aethyn-XXXXX-country-de:PASSWORD@proxy.aethyn.io:5499" proxies = {"http": PROXY, "https": PROXY} HEADERS = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/124.0 Safari/537.36", "Accept-Language": "de-DE,de;q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", } def get_product(asin, tld="amazon.de"): r = requests.get(f"https://www.{tld}/dp/{asin}", headers=HEADERS, proxies=proxies, timeout=30) if r.status_code == 503 or "validateCaptcha" in r.url: raise BlockedError("Robot Check / 503") return r.textField note: Amazon serves the CAPTCHA from /errors/validateCaptcha and a 503 'sorry, something went wrong' page under load. Detect both explicitly — a 503 is not a network blip here, it is Amazon asking you to back off.
- 3
Read the Buy Box price, not the first price on the page
A product page can show a strikethrough list price, deal price, subscribe-and-save price, and used offers. The number that matters for repricing is the Buy Box price in the buy-box block. Scope your selector to that block, and treat a missing buy box (a common, legitimate state) as 'no Buy Box winner', not as an error.
Python (BeautifulSoup)from bs4 import BeautifulSoup def parse_buybox(html): soup = BeautifulSoup(html, "html.parser") box = soup.select_one("#buybox, #rightCol") if box is None: return {"price": None, "buybox": False} price_el = box.select_one(".a-price .a-offscreen") seller = box.select_one("#sellerProfileTriggerId") return { "buybox": True, "price": price_el.get_text(strip=True) if price_el else None, "seller": seller.get_text(strip=True) if seller else "Amazon", }Field note: Grabbing the first .a-offscreen on the page is the classic repricing bug — it often returns the crossed-out list price, so your tool 'sees' a competitor far above the real Buy Box. Always anchor to the buy-box container.
- 4
Crawl many ASINs with bounded concurrency (Node.js)
Rotate per request and cap how many run at once so no single IP — and your own egress — spikes. Axios takes the proxy from a config object; a simple worker pool keeps concurrency in check.
Node.js (axios)import axios from "axios"; const agent = { protocol: "http", host: "proxy.aethyn.io", port: 5499, auth: { username: "aethyn-XXXXX-country-us", password: "PASSWORD" }, }; async function fetchAsin(asin) { const { status, data } = await axios.get(`https://www.amazon.com/dp/${asin}`, { proxy: agent, headers: { "Accept-Language": "en-US,en;q=0.9" }, timeout: 30000, validateStatus: () => true, }); if (status === 503) throw new Error("throttled"); return data; }Field note: Scale throughput by widening the proxy pool and adding workers, not by hammering a few IPs faster. If 503s climb across many IPs at once, your global concurrency is the problem — turn it down before Amazon turns you off.
- 5
Schedule by priority and store time-stamped history
Prices and the Buy Box move throughout the day, so re-crawl hot ASINs hourly and the long tail daily rather than everything every run. Append each observation with a timestamp so you can chart repricing, detect stockouts, and flag MAP violations — and alert only on meaningful changes, not noise.
Best practices that keep scrapers reliable
- Drive TLD + country IP + Accept-Language from one marketplace table so they never drift apart
- Scope price parsing to the buy-box block; ignore strikethrough and unrelated offers
- Key everything on ASIN, and treat 'no Buy Box' as a valid state
- Rotate per request and scale by pool width, keeping per-IP velocity low
- Re-crawl by SKU priority (hot hourly, long tail daily), not everything every run
- Store time-stamped Buy Box price and seller to power repricing and MAP alerts
Common mistakes that burn proxy budget
- Pricing amazon.com through a non-US IP and trusting the localized result
- Grabbing the first .a-offscreen, which is often the crossed-out list price
- Treating a 503 as a transient blip instead of a back-off signal
- Hammering ASINs from one IP until the Robot Check appears
- Parsing one category's layout and breaking on deal/coupon blocks elsewhere
- Scraping review text and author data with no lawful basis
- Tracking price only and ignoring the Buy Box seller, so a seller hijack at an on-MAP price slips through unnoticed