Whether you run an e-commerce brand, a dropshipping research agency, or a B2B wholesale supply business, tracking competitor product catalogs, stock availability, price drops, and store contact details across Shopify and WooCommerce stores is a massive competitive advantage.
In this tutorial, we'll cover how to extract full product catalogs (title, SKU, price, compare_at_price, in_stock, variants, images) plus store owner emails & social links using Python.
âš¡ Ready-to-Use Cloud Scrapers & Standalone Tools
- ðŸ›ï¸ Shopify Store Product, Price & Contact Scraper (Apify Cloud API): apify.com/tungnguyen84/shopify-store-product-contact-scraper
- 🛒 WooCommerce & WordPress Store Product & Contact Scraper (Apify Cloud API): apify.com/tungnguyen84/woocommerce-wordpress-store-product-contact-scraper
- 💻 Download Shopify Competitor Spy Pro (Python Desktop CLI + Excel Exporter —
$12.99): tungnguyen84.gumroad.com/l/lxqssu - 📊 Ultimate Excel VBA Automation Pack: 10 One-Click Macros (
$9.99): tungnguyen84.gumroad.com/l/wybjyn - â GitHub Repo: tungnguyen84/shopify-woocommerce-product-price-scraper
🔠How Shopify & WooCommerce Expose Structured Product JSON
-
Shopify Stores: Almost all Shopify storefronts expose a paginated JSON feed at
/products.json?limit=250&page=1containing every product, variant price, compare-at price, SKU, vendor, and availability flag. -
WooCommerce Stores: Modern WooCommerce stores expose the Store API at
/wp-json/wc/store/v1/products?per_page=100, with fallback told+jsonProduct schema and OpenGraph price tags.
Python Example: Fetching Shopify Products + Discount Calculation
import requests
def fetch_shopify_catalog(store_url: str, max_items: int = 100) -> list[dict]:
base = store_url.rstrip('/')
resp = requests.get(f"{base}/products.json?limit=250&page=1", timeout=15)
resp.raise_for_status()
products = resp.json().get('products', [])[:max_items]
rows = []
for p in products:
v = (p.get('variants') or [{}])[0]
price = float(v.get('price') or 0)
compare_at = float(v.get('compare_at_price') or 0)
discount_pct = round((compare_at - price) / compare_at * 100, 1) if compare_at > price else 0.0
rows.append({
'title': p.get('title'),
'vendor': p.get('vendor'),
'product_type': p.get('product_type'),
'price': price,
'compare_at_price': compare_at or None,
'discount_pct': discount_pct,
'in_stock': bool(v.get('available')),
'sku': v.get('sku'),
'url': f"{base}/products/{p.get('handle')}",
})
return rows
🚀 Need Custom E-Commerce Monitoring or Excel Dashboards?
- Try our 5 Cloud Actors on Apify Store (
@tungnguyen84) - Grab the standalone tools on Gumroad (
tungnguyen84.gumroad.com) - Or message me directly on Fiverr (
@tungnguyen84) for custom scrapers and automated Excel/Google Sheets dashboards!
🌐 Live REST APIs on RapidAPI Hub & Instant Download Store
-
RapidAPI Hub (Free Tier
BASIC $0.00/mo->PRO $9.99/mo): - Payhip Instant Download Store (PayPal / Card):
Top comments (0)