Shopify Scraper
Pricing
$5.00/month + usage
Shopify Scraper
Shopify online store collection and product data extractor. Supports realtime price/stock monitor. Crawl product list or single product in a structured form, including title,description,price,sku, etc.
Pricing
$5.00/month + usage
Rating
4.9
(6)
Developer
Richard Feng
Maintained by CommunityActor stats
70
Bookmarked
2.2K
Total users
34
Monthly active users
5 hours ago
Last modified
Categories
Share
Shopify Scraper is a professional-grade crawling tool designed to extract high-fidelity product data from any e-commerce store built on the Shopify platform. It can optionally capture real per-variant inventory counts for stores that expose them.
Why Use Shopify Scraper?
- π Market Research: Analyze competitor pricing, inventory, product variants, and descriptions to sharpen your strategy.
- π Trend Monitoring: Track new product launches and stock status changes across multiple brands in real-time.
- ποΈ Data Aggregation: Build comprehensive product catalogs by aggregating data from various Shopify-based stores.
- π― Marketing Insights: Understand how successful brands structure their metadata, tags, and categories.
π³ You pay per result, not per minute. See Pricing for what each event costs and how to cap a run's spend.
Key Features
- π Search Support: Find products by keyword using the built-in search functionality.
- π Product Recommendations: Optionally fetch recommended products for each item (configurable limit).
- π Store-wide Extraction: Capable of crawling an entire store's catalog, from collections to individual products.
- π― Precision Targeting: Fetch specific collections or singular product URLs with surgical precision.
- π± Currency Normalization: Automatically handles currency selection and formats prices (multiplied by 100) to ensure financial accuracy without floating-point errors.
- π¦ Comprehensive Data: Extracts everything: titles, descriptions, images, options (size/color), variants, and real-time stock status.
- π‘οΈ Resilience: Includes logic to bypass common gateway restrictions and handle "InStock"/"OutOfStock" parsing robustly.
- π Real Inventory (experimental): Optionally read true per-variant stock counts (
quantityAvailable) β not just in/out-of-stock β for stores that expose inventory in their storefront JSON. SeegrabRealInventorybelow.
Pricing
This actor uses Apify's pay-per-event model: you are charged for the results it produces, not for how long it runs.
| Event | Charged | Notes |
|---|---|---|
product | Once per product saved to the dataset | The main unit of value. |
collection | Once per collection saved to the dataset | Only /collections crawls emit these β they list a store's categories rather than its products, and a single request can return up to 250 of them. |
recommends | Once per recommended product | Recommendations are nested inside the parent product record rather than saved as separate results, so they are billed here. Only applies when maxRecommendationsPerProduct is above 0. |
real-inventory | Once per product that comes back with a real stock count | Only applies when grabRealInventory is enabled and the store actually exposes inventory. Stores that don't expose it are never billed for it. |
Controlling your spend
maxRequestsPerCrawlcaps how many records are saved, so it capsproduct/collectioncharges directly. Default100;0means unlimited.- Max total charge (set per run or per task in the Apify UI) is a hard ceiling. When it is reached the actor stops of its own accord and the run finishes with everything it had already saved β it is not cut off mid-fetch.
- Duplicates are never billed twice. A product reached through several start URLs or through overlapping collections, or re-visited after a failed request is retried, is saved and charged once per run.
Important Note
On certain Shopify websites, multiple SKUs may be visually merged into a single product page. Please be aware that this scraper treats each SKU as an individual product entry and does not perform any merging of these SKUs.
How it Works
1. Verification
Before running the scraper, verify your target is a Shopify store:
- Navigate to
https://<domain>/admin(e.g.,https://gymshark.com/admin). - If you see a Shopify login page, the site is compatible.
2. Configuration
The scraper accepts a JSON input defining the target URLs and scraping behavior.
| Parameter | Type | Required | Description |
|---|---|---|---|
startUrls | Array | Yes | A list of URLs to scrape (Homepage, Collection, or Product URLs). |
proxy | Object | Yes | Proxy configuration. Residential proxies are highly recommended to avoid blocks. |
maxRequestsPerCrawl | Integer | No | Limit the number of records saved β and therefore billed. Set to 0 for unlimited (default 100). |
maxRecommendationsPerProduct | Integer | No | Number of recommended products to fetch per product. Billed per recommended product β see Pricing. Set to 0 to disable (default 0). Max 20. |
grabRealInventory | Boolean | No | Fetch real per-variant inventory counts from each product's JSON. Billed per product that returns a real count; adds one request per product on collection crawls. Only stores that expose inventory in their storefront JSON are supported β others report it as unknown and are not billed for it (default false). |
maxInventoryFetches | Integer | No | Cap on the extra per-product inventory fetches during collection crawls (only when grabRealInventory is enabled). 0 = unlimited (default 200). |
query | String | No | Search query to find specific products. |
Input Examples
| Use Case | Input JSON |
|---|---|
| Scrape all products from a store | { "startUrls": [{ "url": "https://kith.com" }], "maxRequestsPerCrawl": 0, "proxy": { "useApifyProxy": true } } |
| Scrape products from a collection | { "startUrls": [{ "url": "https://kith.com/collections/kith-tops" }], "maxRequestsPerCrawl": 0, "proxy": { "useApifyProxy": true } } |
| Scrape a single product page | { "startUrls": [{ "url": "https://kith.com/products/kith-williams-iii-hoodie-black" }], "proxy": { "useApifyProxy": true } } |
| Search products by keyword | { "startUrls": [{ "url": "https://kith.com" }], "query": "hoodie", "proxy": { "useApifyProxy": true } } |
| Fetch product with recommendations | { "startUrls": [{ "url": "https://kith.com/products/kith-williams-iii-hoodie-black" }], "maxRecommendationsPerProduct": 10, "proxy": { "useApifyProxy": true } } |
| Grab real inventory counts | { "startUrls": [{ "url": "https://kith.com/collections/kith-tops" }], "grabRealInventory": true, "proxy": { "useApifyProxy": true } } |
| Limit total scraped results | { "startUrls": [{ "url": "https://kith.com" }], "maxRequestsPerCrawl": 100, "proxy": { "useApifyProxy": true } } |
| Scrape with custom currency | { "startUrls": [{ "url": "https://kith.com/collections/kith-tops?currency=EUR" }], "proxy": { "useApifyProxy": true } } |
3. Output
Data is stored in the default dataset. The scraper outputs either Product or Collection objects.
When
grabRealInventoryis enabled, variants of supported stores also carryquantityAvailable(real stock count),inventoryTracked(whether the store tracks stock), andinventoryPolicy(deny/continue). Stores that don't expose inventory simply omit these fields.
Troubleshooting
| Issue | Possible Cause | Solution |
|---|---|---|
| 0 Results Found | The site may not be Shopify-based or has strong anti-bot protection. | Verify with the /admin trick. Try using residential proxies. |
| Access Denied / 403 | Your IP has been flagged. | Enable useApifyProxy and ensure you have sufficient proxy quota. |
| Incorrect Price | Currency mismatch or raw integer format. | Remember prices are x100 (e.g., 2000 = 20.00). Ensure ?currency=XYZ param is used if supported. |
| Run stopped early | The run's Max total charge limit was reached. | Expected behaviour β the actor stops cleanly and keeps everything it saved. Raise the limit, or lower maxRequestsPerCrawl to fit the budget. |
TODO
- Review fetch support
- Real stock monitoring
- 7/30 day sales estimation