---
title: "Ecommerce web scraping"
description: "Ecommerce web scraping for prices, catalogs, reviews, stock and sellers on Amazon, Walmart, eBay and Shopify stores, returned as structured JSON."
canonical: https://www.zenrows.com/use-cases/ecommerce-web-scraping
updated: 2026-10-18
---

# Ecommerce web scraping

Ecommerce web scraping collects product data from online stores and marketplaces, such as prices, titles, variants, stock, reviews, sellers and search rank. Zenrows fetches protected pages on Amazon, Walmart, eBay and Shopify stores, returns them as structured JSON with Extract, and runs whole catalogs through Batch, so your product dataset matches what shoppers see.

## Sample output: one product page

```json
{
  "url": "https://www.example-store.com/products/trail-runner-gtx",
  "retailer": "example-store.com",
  "title": "Trail Runner GTX Men's Running Shoe",
  "brand": "North Supply",
  "sku": "NS-TR-GTX-42",
  "gtin": "00812345678906",
  "price": 129.0,
  "list_price": 160.0,
  "currency": "USD",
  "availability": "in_stock",
  "variants": [
    { "size": "9", "color": "Black", "in_stock": true },
    { "size": "10", "color": "Black", "in_stock": false }
  ],
  "rating": 4.6,
  "review_count": 2143,
  "seller": "North Supply Official",
  "category_path": ["Shoes", "Running", "Trail"],
  "images": 7,
  "captured_at": "2026-10-17T08:00:00Z"
}
```

An illustrative product record, the shape Extract returns from a product detail page, with variants, seller and identifiers in one object.

## What ecommerce web scraping teams collect

Online retail data work comes down to two page types, listings and product detail pages, read on a schedule. Each job below has its own page if you want the detail.

| Job | Data you collect | Typical sources |
|---|---|---|
| [Competitor price tracking](/use-cases/price-scraping) | Price, list price, promotion, shipping cost | Amazon, Walmart, Target, Best Buy, brand stores |
| Catalog and assortment mapping | Every product URL, category, brand, new and delisted items | Shopify and other brand stores, IKEA, Zara, ASOS |
| [Review collection](/use-cases/review-scraping) | Star rating, review text, date, verified-purchase flag | Amazon, Walmart, Sephora, Trustpilot |
| Stock and availability | In stock, low stock, back-order, per variant and per store | Retailer product pages, store-locator pages |
| Marketplace seller monitoring | Seller name, offer count, fulfilment type, seller rating | Amazon offer listings, eBay, Mercado Libre, Allegro, Shopee |
| [Search rank on retailer sites](/use-cases/digital-shelf-analytics) | Position for a keyword, sponsored or organic, category placement | Amazon, Walmart, Instacart, Tesco search results |
| Product matching | GTIN, MPN, brand, model, normalised title | Product detail pages across retailers |

## Why scraping ecommerce websites breaks

Large retailers run bot protection, render prices in JavaScript and change templates often. Small stores are easier one by one, but there are thousands of them and each one uses a different theme.

| What breaks | What it looks like | How Zenrows handles it |
|---|---|---|
| Bot protection | A marketplace returns a CAPTCHA page, a "press and hold" challenge or a 403 instead of the product | Zenrows' stealth, with retries, gets through protections such as AWS WAF, PerimeterX (HUMAN), Akamai and Cloudflare |
| Prices loaded by JavaScript | The raw HTML has the product name and an empty price block | Adaptive Stealth Mode escalates to browser rendering when a page needs it and returns the page after scripts run |
| Country and region | The same URL shows a different price, currency or stock from another country, or redirects to a login wall | Geotargeting picks the country the request comes from, such as Brazil for Mercado Livre |
| Lazy-loaded reviews and variants | Reviews and size options only appear after a scroll or a click | Page actions scroll, click and wait before the page is returned |
| Many store layouts | One set of selectors per store, and every redesign empties fields | Extract returns product fields as JSON without selectors to maintain |
| Catalog size | 200,000 product URLs per refresh overwhelm a homegrown queue | Batch runs the full URL list as one job and reports results per URL |

## How to scrape ecommerce websites with Zenrows

1. **Map the catalog.** Start a Crawl at the store's home page or a category page, and keep only URLs that match the product pattern, for example `/products/` on Shopify stores or `/dp/` on Amazon.
2. **Fetch one product page.** Call Fetch with Adaptive Stealth Mode, which escalates to browser rendering and stealth only when a retailer needs it, and geotargeting for the market.
3. **Get the fields.** Use Extract for ready-made JSON, or name the fields with CSS selectors when you want exact field names for one retailer.
4. **Refresh the catalog.** Send the stored URL list to Batch on your schedule and compare each run with the last to catch price, stock and assortment changes.

```python Python
# pip install requests
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": PRODUCT_URL,  # a product detail page
    "mode": "auto",  # Adaptive Stealth Mode
    "proxy_country": "us",
    "extract": "auto",
}
response = requests.get("https://api.zenrows.com/v1/", params=params)
product = response.json()
print(product)
```

```bash cURL
# Collect every product URL on a store, as Markdown pages
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "STORE_URL",
    "max_items": 5000,
    "max_pages": 6000,
    "include_patterns": ["/products/"],
    "exclude_patterns": ["/cart", "/account"],
    "output_format": "markdown"
  }'
# Read the results later with GET https://api.zenrows.com/v1/crawls/CRAWL_ID
```

```bash CLI
npx -y @zenrows/cli init
zenrows extract PRODUCT_URL --autoparse
zenrows crawl create STORE_URL --include-patterns /products/ --max-pages 6000 --output-format markdown --follow
zenrows crawl results <crawl-id> --out product-urls.jsonl
```

```text Claude Code (MCP)
# Connect once
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp

# Then ask:
Use Zenrows to read these ten Walmart and eBay product pages from the US
and return one JSON record per product with title, brand, price, list
price, availability, rating, review count and seller.
```

## Which Zenrows product fits

| If you need to | Use | Why |
|---|---|---|
| Pull one product, category or search page on demand | [Fetch](/products/fetch) | One request returns the rendered page from protected retailers |
| Get product fields as JSON across many store layouts | [Extract](/products/extract) | Automatic structured extraction adapts when a template changes |
| List every product URL on a store | [Crawl](/products/crawl) | Follows links and pagination on the store's domain and keeps URLs that match your patterns |
| Refresh a full catalog daily or weekly | [Batch](/products/batch) | Thousands of URLs as one job, results by webhook or download |
| Choose a size, enter a postcode or open a configurator | [Browser](/products/browser) | Playwright or Puppeteer drive a real browser through the steps before you read the page |

## What success looks like

| Measure | What good looks like | How to check it |
|---|---|---|
| Catalog coverage | Your product count per store matches the store's own category counts | Compare crawled URL counts with the counts shown on category pages |
| Field completeness | Price, availability and title are present on nearly every record | Report the share of empty fields per store after each run |
| Freshness | Each record is younger than your refresh interval | Track `captured_at` per URL and alert on records older than one cycle |
| Accuracy | Scraped prices equal what a shopper sees in that country | Spot-check a sample of URLs in a browser from the same market each week |
| Failure rate per run | Few product URLs fail per run, and failed ones succeed on retry | Count failed tasks per Batch job by store and retry them before the next run |
| Upkeep | Store redesigns need little or no selector work | Count hours spent on scraper fixes per month |

## Ecommerce web scraping FAQ

### What is ecommerce web scraping?

Ecommerce web scraping is the automated collection of product data from online stores and marketplaces. A scraper reads listing and product pages and turns them into records with fields such as price, stock, title, brand, variants, rating and seller. Teams use the data for price monitoring, assortment analysis, review analytics, product matching and digital shelf reporting.

### What ecommerce data can I scrape?

Anything a shopper can see without logging in: product title, description, brand, price and list price, promotion text, shipping cost, stock per variant, images, specifications, identifiers such as GTIN or MPN, ratings and reviews, seller details and the product's position in search and category pages.

### Can Zenrows scrape Amazon, Walmart and eBay?

Yes. Large marketplaces commonly sit behind protections such as AWS WAF, PerimeterX (HUMAN) or Akamai. Adaptive Stealth Mode starts with the lightest setup and escalates to browser rendering and stealth only when a page needs it, and geotargeting picks the marketplace's country. Dedicated guides for each site are linked on this page.

### What should I look for in a web scraping API for ecommerce sites?

Test it on your own URL list, on the stores that matter most to you, for at least a week. Check the success rate on the protected sites, whether country targeting returns local prices, whether you get structured JSON without writing selectors, how it handles thousands of URLs at once, and how much selector upkeep a store redesign creates.

### How do I scrape a whole online store?

Start a Crawl at the store's home page or category pages with an include pattern for product URLs. Crawl stays on the store's domain and returns the matching URLs, or the pages themselves as HTML or Markdown. Then send those URLs to Batch with Extract to get one JSON record per product.

### How do I scrape product variants and stock per size?

Many product pages hold every variant in the page's embedded JSON or structured data, so a single request returns each size and color with its own price and stock. Extract picks these up as a variants list. When a store loads a variant's price only after you choose it, use page actions to click the option before the page is returned, or Browser for longer flows. Store one row per variant, keyed by its SKU or GTIN.

### Is it legal to scrape ecommerce websites?

Collecting publicly visible product and price data is common practice for price monitoring and market research. Read each site's terms, do not collect personal data such as reviewer profiles unless you have a basis to process it, and do not republish copyrighted images or descriptions. For your specific use, ask your legal team.

## Related use cases

- [Competitor price scraping](https://www.zenrows.com/use-cases/price-scraping.md): Competitor prices, promotions, shipping and stock per SKU from retailers and marketplaces, refreshed on your schedule.
- [Product data scraping](https://www.zenrows.com/use-cases/product-data-scraping.md): Whole product catalogs, variants, specs, images and sellers from marketplaces, normalized into one feed.
- [Digital shelf analytics](https://www.zenrows.com/use-cases/digital-shelf-analytics.md): Search rank, share of shelf, content compliance, ratings and availability for CPG brands, per retailer and region.
- [Review scraping](https://www.zenrows.com/use-cases/review-scraping.md): Review text, ratings, dates and replies from Amazon, Google, Yelp, Trustpilot and G2, every page.
- [Retail data scraping](https://www.zenrows.com/use-cases/retail-data.md): Store locations, store-level prices, promotions and click-and-collect stock from grocery and high-street chains.

Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
