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.

Try it yourself

100 free renders - enough to test Shopify scraping with no payment required.