What makes e-commerce scraping hard
Online retail is one of the most-scraped categories on the web. Retailers, brands and analytics companies track competitor prices, stock levels, product assortment, promotions, reviews and search rankings across thousands of stores. That makes retailers some of the most defensive websites on the internet. Large marketplaces and big-box retailers typically run enterprise bot protection, rotate their page structures, and show different prices to different locations.
The right proxy setup for e-commerce scraping depends on the store. This guide covers how to choose, and links to target-specific guides like Amazon scraping proxies and price monitoring proxies.
Proxy choice by store type
| Store type | Typical protection | Best starting proxy |
|---|---|---|
| Small independent stores, many Shopify/WooCommerce sites | Light | Datacenter proxies |
| Mid-size retailers | Cloudflare or similar at standard settings | Datacenter, escalating to residential |
| Major marketplaces and big-box retailers | Enterprise bot protection, fingerprinting | Residential proxies |
| Regional storefronts with localised pricing | Geo-dependent content | Residential with country/ZIP targeting |
| Logged-in B2B portals | Account monitoring | ISP proxies |
Localised pricing: target the right place
Many retailers change prices, delivery options and availability based on location, sometimes down to the ZIP or postcode. If you need "the price a shopper in Denver sees", you need:
- A residential proxy targeted to the right state or city (some providers offer ZIP targeting).
- The store's own location setting (a ZIP cookie or store selector), which often matters more than the IP.
- Consistent session handling so the location persists across pages.
See geo-targeted proxies.
Cut bandwidth costs
Product pages are heavy: high-resolution images, scripts, review widgets and recommendation carousels. On per-GB residential plans, that adds up fast.
- Fetch HTML with an HTTP client rather than rendering a full browser where possible.
- Look for the JSON endpoints the page itself uses for price and stock data.
- Block images, fonts and trackers when you must use a browser.
- Cache category pages and only re-fetch product pages when needed.
These steps can cut costs by an order of magnitude. See cheap proxies and proxy bandwidth pricing explained.
Avoiding blocks on retail sites
- Pace requests per domain. Retailers notice total load, not just per-IP load.
- Use realistic headers and TLS fingerprints.
- Handle bot challenges by recognising them early and switching IPs, rather than retrying blindly.
- Rotate per product page, but use sticky sessions for paginated search or category browsing.
- Watch for soft blocks: a 200 OK with a CAPTCHA page, missing prices or fake data.
See avoiding IP bans when scraping and CAPTCHAs and proxies.
Validating your data
Retail sites sometimes serve degraded or decoy content to suspected bots: prices omitted, "out of stock" everywhere, or cached old pages. Validate:
- Price format and plausible ranges.
- Presence of key fields (title, SKU, price, availability).
- Consistency with a manual check from a normal browser on a sample.
Proxy tip: One low-risk way to follow this advice is to start with a provider whose traffic doesn't expire. Geonode bills residential proxies per GB with no expiry on purchased bandwidth, so you can test properly before buying volume. We cover its plans in Geonode for price monitoring.
Providers worth shortlisting
- For enterprise marketplaces: large residential providers with unblockers (Bright Data, Oxylabs), or e-commerce scraping APIs.
- For mid-market and growing teams: Decodo, SOAX, NetNut and similar residential providers.
- For small stores at scale: cheap datacenter from Webshare, Rayobyte and similar.
See best residential proxies, best datacenter proxies and scraping API vs proxies.
A target classification worksheet
| Retailer | Platform / protection | DC success | Resi success | Chosen tier | Notes |
|---|---|---|---|---|---|
| Example Store A | Shopify, no extra protection | High | High | Datacenter | JSON endpoint available |
| Example Store B | Enterprise bot protection | Low | High | Residential | Needs sticky sessions for location |
| Example Marketplace | Heavy protection, localisation | Very low | Medium | Unblocker | Validate prices carefully |
Fill this in for each target and revisit quarterly.
Session design for localised prices
1. Open sticky session (country/state targeting)
2. Visit homepage → accept cookies
3. Set delivery location (ZIP/postcode)
4. Fetch product pages within the same session
5. Close session; repeat for next locationKeep sessions short enough to avoid drops but long enough to cover a batch of products.
Handling large catalogues
- Discover products through sitemaps and category pages, not by crawling every link.
- Prioritise best-selling and competitive products for frequent checks.
- Use change detection: store hashes of key fields and only process changes.
- Schedule heavy crawls in off-peak hours for the retailer.
Cost control checklist
- HTML-only fetches where possible.
- Assets blocked in browsers.
- Datacenter for lenient stores.
- Residential only where needed.
- Weekly review of cost per 1,000 product prices.
See cheap proxies and proxy pricing guide.
Use the structured data stores already publish
Many product pages embed machine-readable data for search engines: a <script type="application/ld+json"> block describing the product with schema.org's Product vocabulary, including name, price, currency and availability. Parsing it instead of the visible layout has three benefits. It changes less often than page designs, it looks similar across many stores, and you often don't need a headless browser to read it, which saves residential bandwidth.
import json, re
def product_jsonld(html):
pattern = r'<script[^>]+application/ld\+json[^>]*>(.*?)</script>'
for block in re.findall(pattern, html, re.S):
try:
data = json.loads(block)
except ValueError:
continue
items = data if isinstance(data, list) else data.get("@graph", [data])
for item in items:
if isinstance(item, dict) and item.get("@type") == "Product":
return item
return NoneSome caveats. Structured data can lag behind the visible price, may leave out member or regional prices, and some stores don't publish it at all. Validate a sample against the rendered page before relying on it, and keep a visible-page parser as a fallback. Many stores also embed their own product state as JSON for their front end, which is worth a look too.
See price monitoring proxies for building this into a monitoring pipeline, and Amazon scraping proxies for marketplace specifics.
FAQ
Do I need residential proxies to scrape e-commerce sites?
For major marketplaces and big retailers, usually yes. For small stores, datacenter proxies are usually fine.
How often can I scrape a product page?
As often as you need, within reason. Many price monitoring setups check key products several times a day and the long tail daily.
Is it legal to scrape prices?
Collecting publicly displayed prices is common practice, but check the site's terms and your local law. See are proxies legal?.
Editorial note: Proxy providers change their pools, features and prices often, so treat any figures here as typical ranges at the time of writing and confirm current terms with the provider before you buy.