How to scrape Google Shopping with Python

One endpoint, products as clean JSON, saved to CSV.

Free to try, no card Title, price, store, rating Clean JSON, no HTML parsing
PULLED LIVE FROM THE API, AUGUST 2, 2026

How do you scrape Google Shopping?

Scraping Shopping yourself means driving a browser, dodging blocks, and parsing a product grid that keeps changing. Here you send one HTTP request and read JSON. Three steps:

  1. 1

    Create a free account. Try it free, no card needed.

  2. 2

    Copy your API key. It is on the dashboard right after signup.

  3. 3

    Run the code below. Start with the curl test, then the Python script.

First a quick test with curl:

# the applicable price per successful search; zero results cost nothing curl "https://crustapi.com/v1/search?type=shopping&q=running shoes" -H "x-api-key: YOUR_KEY"

Then the same call in Python with the requests library. Install it with pip install requests, drop in a key, and run. The products live under the shopping key in the response:

# pip install requests, then run this file import requests resp = requests.get( "https://crustapi.com/v1/search", params={"type": "shopping", "q": "running shoes"}, headers={"x-api-key": "YOUR_KEY"}, ) data = resp.json() for item in data["shopping"]: print(item["title"], item["price"], item["source"], item["rating"])

Here are the first two products that came back, shown as CSV so they drop straight into Sheets or a spreadsheet:

titlesourcepriceratingratingCountproductId
Hoka Men's Clifton 10DICK'S Sporting Goods$123.994.796009944542474389140585
New Balance Men's FuelCell SuperComp Trainer v3Running Warehouse US$124.884.36447869527423502023736

Change q to any product search you would type into the Shopping box, like 4k monitor or office chair.

One call returns a full page of products in the order Google ranks them. To collect more, pass a page number and loop, gathering each page into one list:

# pull the first three pages into one list import requests all_products = [] for page in range(1, 4): data = requests.get( "https://crustapi.com/v1/search", params={"type": "shopping", "q": "running shoes", "page": page}, headers={"x-api-key": "YOUR_KEY"}, ).json() all_products.extend(data["shopping"]) print(len(all_products), "products collected")
WHAT EVERY PRODUCT INCLUDES

What data do you get?

Each product carries title, price, store, star rating, rating count, a stable productId, a link to its Google product page, an imageUrl thumbnail, and its rank via position. The first product as CSV:

titlesourcepriceratingratingCountproductIdposition
Hoka Men's Clifton 10DICK'S Sporting Goods$123.994.7960099445424743891405851

Or the same record as JSON, as the API returns it, with the long image URI shortened for display:

// one product in full { "title": "Hoka Men's Clifton 10", "source": "DICK'S Sporting Goods", "condition": null, "link": "https://www.google.com/search?ibp=oshop&q=running%20shoes&prds=productid:9944542474389140585&gl=us&udm=28", "price": "$123.99", "imageUrl": "data:image/webp;base64,UklGRjpKAABXRUJQVlA4…", "rating": 4.7, "ratingCount": 9600, "productId": "9944542474389140585", "position": 1 }

Price is a formatted string with its currency symbol, so store it as text. imageUrl is usually a gstatic URL; rows near the top sometimes carry an inline data:image URI, cut short above for display.

condition is usually null. Read optional fields with item.get("condition") so a missing value never crashes your loop.

HOW IT COMPARES

vs writing your own scraper

You can build a Shopping scraper with a headless browser and a parser, and plenty of tutorials show how. The trade is maintenance. Here is the difference in practice.

Writing it yourselfCrustAPI
SetupInstall a headless browser, handle blocks and grid changesOne GET request, no browser
OutputParse the HTML yourself; fields break when the layout changesClean JSON from the API, or the same rows as CSV
MaintenanceFix the scraper each time the page changesWe keep it working
Free tierFree, but you pay in time and blocked requests$6 of free usage each month
Cost modelServer, proxy, and developer timePay per successful search, however many products come back; empty searches free
Storing the dataYours to manageNo storage limits. Export to CSV or a database
PRICING

How much does scraping Google Shopping cost?

Each successful shopping search is billed once at your Google Search rate, however many products come back. Empty searches cost nothing. Paid funds never expire.

DepositGoogle Search / 1,000 requestsMaps / 1,000 businessesLinkedIn reads / 1,000 requestsPeople, Jobs, Refresh / 1,000 units
$10+$1.00$1.96$6.00$1.96
$149+$0.76$1.49$4.50$1.49
$549+$0.56$1.10$3.30$1.10
$1,999+$0.41$0.80$2.45$0.80
$6,500+$0.33$0.65$1.95$0.65
$27,500+$0.28$0.55$1.65$0.55
$50,000+$0.26$0.50$1.50$0.50
$100,000+$0.20$0.40$1.50$0.40

Every eligible account gets $6 of free usage monthly. Each deposit keeps its prices until spent; paid funds never expire. People and Jobs bill per successful search, Refresh per accessible profile. Full profiles in People use the read rate per full profile. See all billing details.

Larger deposits unlock lower endpoint prices. Each deposit keeps its prices until spent. See the full deposit table on the pricing page. Prices in USD, ex-tax.

Run your first Shopping search free
Try it free. No card, no contract.
Try for free
THE LAST STEP

Save the results to a CSV file

Because the response is plain JSON, Python's built-in csv module writes it to a file in a few lines. No extra libraries. This reads every product from the search and writes one row each:

# save every product to a CSV file with the built-in csv module import csv, requests data = requests.get( "https://crustapi.com/v1/search", params={"type": "shopping", "q": "running shoes"}, headers={"x-api-key": "YOUR_KEY"}, ).json() with open("products.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(["title", "source", "price", "rating", "ratingCount", "productId"]) for p in data["shopping"]: writer.writerow([p["title"], p["source"], p["price"], p.get("rating", ""), p.get("ratingCount", ""), p.get("productId", "")])

Open products.csv in Sheets or Excel and you have a finished price list. Swap the query, run it again, and append to build a bigger catalog.

WHO IT'S FOR

Who scrapes Google Shopping?

Related: Google Shopping API · Google Shopping Scraper · Google Search API · Scrape Google News with Python · API docs

FAIR PLAY

When a different tool fits better: listing your own products, managing inventory, or a contract with a formal SLA are Google Merchant products, not scraping. This endpoint returns the public product results anyone sees in the Shopping tab, which is what most price research and market work needs, but it is not the official Content API for Shopping.

BEFORE YOU ASK

Common questions

No. With the CrustAPI endpoint you send one HTTP request with the requests library and get clean JSON back. There is no browser to drive and no HTML to parse, so the code above is the whole scraper.

Title, price, the store selling it, a star rating, the number of ratings, a stable product id, a direct link to its Google product page, a thumbnail image on nearly every row, and its rank in the results. Enough to build a price list or catalog without a second call.

Logged-out, public-only collection has repeatedly defeated computer-fraud and contract claims, while Google's Terms restrict automated access that violates instructions like robots.txt. What you get is the same public product results anyone sees in the Shopping tab.

Pass a page number in the request and loop, collecting each page into one list. The paging example above shows the exact code. You pay the applicable price per successful search, however many products come back, and an empty search costs nothing.

The response is plain JSON, so Python's built-in csv module writes it to a file in a few lines. The Save to CSV section above has the exact code, no extra libraries.

Yes. Try it free, no credit card, and paid funds never expire. That is enough to pull several full result pages while you build.

WORKS WITH YOUR STACK

Try it on a product you sell

the free plan covers a real search. Run one query and look at the JSON that comes back.

Try for free
No credit card required