Guides / Scrape Shopify
How to Scrape Shopify Stores in 2026
Shopify powers millions of online stores, and they all share a common platform structure. Techniques that work on one Shopify store generally work across all of them. This guide uses Allbirds as an example, but the approach applies to any Shopify-powered store.
What makes Shopify stores hard to scrape
Store-specific anti-bot protection
While Shopify provides baseline bot protection, individual store owners can add additional anti-bot layers through apps and custom code. This means the difficulty varies from store to store.
JavaScript-rendered product data
Modern Shopify themes render product cards, pricing, and inventory data via JavaScript. A simple HTTP request often returns a page shell without the actual product information.
Theme-specific HTML structure
Different Shopify themes use different HTML structures and class names. While there are common patterns (like data-product-card), you may need to adjust selectors for specific stores.
Rate limiting
Shopify enforces rate limits per store. Too many requests in a short period will result in temporary blocks. Residential proxies help avoid triggering these limits.
Scrape a Shopify product collection
Browser7 handles proxy rotation and JavaScript rendering automatically. This example scrapes the men's collection from Allbirds.
from browser7 import Browser7
client = Browser7(
api_key="b7_your_api_key",
base_url="https://ca-api.browser7.com/v1"
)
result = client.render(
"https://www.allbirds.com/collections/mens",
country_code="US"
)
print(result.html)Data you can extract
Shopify stores contain structured product data that can be extracted from collection and product pages:
Product details
- Product title and description
- Product type and vendor
- Product images and gallery
- Tags and categories
- Product URL
Pricing
- Current price
- Compare-at (original) price
- Sale/discount amounts
- Currency
Variants and inventory
- Size and color options
- Variant-specific pricing
- Stock availability
- SKU numbers
Store metadata
- Collection names and URLs
- Total products per collection
- Navigation structure
- Store policies
Complete example: parse product data
Extract product titles, prices, and URLs from a Shopify collection page. This pattern works across most Shopify stores that use the data-product-card attribute.
from browser7 import Browser7
from bs4 import BeautifulSoup
import json
client = Browser7(
api_key="b7_your_api_key",
base_url="https://ca-api.browser7.com/v1"
)
result = client.render(
"https://www.allbirds.com/collections/mens",
country_code="US"
)
soup = BeautifulSoup(result.html, "html.parser")
products = []
for card in soup.select("div[data-product-card]"):
prod = {
"title": None,
"price": None,
"url": None,
}
title = card.select_one("p, h3")
if title:
prod["title"] = title.get_text(strip=True)
for el in card.find_all(["span", "p"]):
text = el.get_text(strip=True)
if "$" in text and len(text) < 20:
prod["price"] = text
break
link = card.select_one('a[href*="/products/"]')
if link:
href = link.get("href", "")
prod["url"] = f"https://www.allbirds.com{href}" if href.startswith("/") else href
products.append(prod)
print(json.dumps(products[:10], indent=2))Selectors vary by Shopify theme. The data-product-card attribute is common but not universal. Inspect the specific store if selectors return null.
Sample output:
[
{
"title": "Anytime Ankle Sock",
"price": "$16",
"url": "https://www.allbirds.com/products/anytime-ankle-sock"
},
{
"title": "Anytime Crew Sock",
"price": "$18",
"url": "https://www.allbirds.com/products/anytime-crew-sock"
},
...
]Scrape page 2 and beyond
Shopify collections use the page query parameter for pagination. Page 1 is the default, page 2 is ?page=2, page 3 is ?page=3, and so on. This is consistent across all Shopify stores.
from browser7 import Browser7
from bs4 import BeautifulSoup
client = Browser7(
api_key="b7_your_api_key",
base_url="https://ca-api.browser7.com/v1"
)
# Page 2: add ?page=2 to the URL
result = client.render(
"https://www.allbirds.com/collections/mens?page=2",
country_code="US"
)
soup = BeautifulSoup(result.html, "html.parser")
for card in soup.select("div[data-product-card]"):
title = card.select_one("p, h3")
if title:
print(title.get_text(strip=True))Take a screenshot of products
Capture Shopify product pages as images for competitive analysis, price monitoring dashboards, or visual product comparisons.
import base64
from browser7 import Browser7
client = Browser7(
api_key="b7_your_api_key",
base_url="https://ca-api.browser7.com/v1"
)
result = client.render(
"https://www.allbirds.com/collections/mens",
country_code="US",
block_images=False,
include_screenshot=True,
screenshot_full_page=True,
screenshot_format="png"
)
with open("shopify-products.png", "wb") as f:
f.write(base64.b64decode(result.screenshot))
print("Screenshot saved")What this costs
Every Shopify page render costs $0.01 - the same as any other website. Residential proxies, JavaScript rendering, and screenshots are all included. There are no per-domain surcharges, no credit multipliers, and no bandwidth fees.
Scraping 50 collection pages across 10 stores costs $5. You know this before you start.