Google Shopping Scraper - Prices, Merchants, Ratings avatar

Google Shopping Scraper - Prices, Merchants, Ratings

Pricing

from $1.30 / 1,000 products

Go to Apify Store
Google Shopping Scraper - Prices, Merchants, Ratings

Google Shopping Scraper - Prices, Merchants, Ratings

[💵 $2.50 / 1K] Scrape Google Shopping search results: price, original price, discount, merchant, rating, reviews, delivery and Google's product ID. 26 countries, no start fee. Every row is ranked against its own query, so you see the cheapest offer without a second pass.

Pricing

from $1.30 / 1,000 products

Rating

0.0

(0)

Developer

WebData Labs

WebData Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Google Shopping Scraper

Scrape Google Shopping search results into a price-ranked table: price, original price, discount, merchant, rating, reviews and delivery, for 26 countries.

Google Shopping is the widest price comparison surface on the web, and it is the one you cannot export. The grid loads through obfuscated markup, half the tiles are promo cards, prices arrive as locale-formatted strings, and there is no product ID you can join on. So teams end up eyeballing the page, or paying per row for a scraper that hands back the same unranked strings the page showed. This Actor returns clean typed rows with Google's own product ID on every one, and it ranks each product against the rest of its own query before you ever open the file, so "is this cheap" is answered in the data instead of in a spreadsheet you build afterwards.

✅ What you get / ❌ what this isn't

✅ What you get❌ What this isn't
priceValue as a real number plus the ISO currency for the storefrontNot a locale-formatted string like 1.234,50 € you have to parse yourself
priceRank, medianPriceValue, priceVsMedianPercent and isLowestPrice per queryNot a flat list you have to sort and compare on your own
productId and variantId, Google's own identifiersNot anonymous rows you cannot dedupe or track week over week
originalPrice and discountPercent on every discounted rowNot a single price field that hides whether it is a sale
Filters applied before rows are written, so you are billed only for matchesNot billing for every tile scanned regardless of your filters
Only tiles that carry a real price and merchantNot padded with promo cards, "related searches" and empty carousel tiles
No start fee, everNot a per-run charge on top of the per-result price

🔎 Why use this Actor

  • Price ranked in the row. Every product carries its rank among the results for the same query, the median price of that query, and how far above or below the median it sits. One number tells you whether a listing is a deal.
  • Same-currency comparison only. Ranking groups rows by ISO currency, so a multi-country project never ranks a euro price against a dollar one.
  • Class-independent parsing. Google reshuffles its CSS class names without notice. Every field here hangs off a structural or accessibility hook that exists because the page has to work for screen readers, not off a class name that expires.
  • Locale-correct numbers. German 11.666 is 11666 reviews, not 11.666. 1,4 Tsd. is 1400. 59,99 € is 59.99 EUR. All of it is unit tested against real captured pages.
  • The currency comes from the storefront. A bare $ on google.com.au is AUD, not USD, so the currency code is taken from the country you searched instead of guessed from the symbol.
  • You pay for matches, not for scans. Google's own Shopping filters stopped working from the URL, so filtering runs on parsed rows here. Because rows are dropped before they reach the dataset, a narrow filter makes your run cheaper rather than more expensive.
  • A challenge is never reported as "no results". Google answers a suspect request with an HTTP 200 that has no products in it. That page is retried on a fresh proxy session instead of being written out as an empty result.

👥 Who it's for

E-commerce sellers, brand managers and repricing teams who need to know what a product actually sells for across merchants, plus anyone building a price-comparison feed.

  • Track your own SKUs against every merchant Google lists them under, weekly.
  • Find which merchant is undercutting you and by how much, using priceRank and priceVsMedianPercent.
  • Build a deals feed by scraping with onSaleOnly and sorting by discount.
  • Pull a market price band before setting your own price on a new product line.
  • Feed productId into your warehouse as a stable join key across runs.

Example tasks

Each of these is a ready-made configuration you can open, copy and run:

⚙️ How to scrape Google Shopping prices

  1. Enter one or more product keywords in Search queries. Each one is scraped and priced independently.
  2. Pick a Country. The prices, merchants and currency all follow that storefront.
  3. Set Max products per query. Google itself runs out at roughly 120 products per query, so leaving it at 0 gets you everything Google will serve.
  4. Optionally narrow with Minimum/Maximum price, Minimum rating, Minimum review count, Discounted products only, Free delivery only or Only these merchants.
  5. Choose Sort results by. Sorting is applied to the output, and position still holds Google's own relevance rank.
  6. Click Start. Results appear on the run's Output tab and export to JSON, CSV, Excel, XML or Parquet.

Track prices on a schedule

Save your input as a Task, then add a Schedule to it (daily or weekly). Each run writes a fresh dataset stamped with scrapedAt. Because productId is stable, joining last week's dataset to this week's on productId gives you a price history per product with no extra work, including which merchant moved.

📥 Input

{
"searchQueries": ["wireless earbuds", "noise cancelling headphones"],
"country": "us",
"maxResultsPerQuery": 60,
"sort": "price_low",
"minPrice": 40,
"maxPrice": 250,
"minRating": 4,
"minReviewCount": 100,
"onSaleOnly": false,
"freeShippingOnly": false,
"merchants": []
}
  • searchQueries - product keywords, up to 50 per run. Each query is paged, deduped and price-ranked on its own.
  • country - one of 26 Google Shopping storefronts, from us and gb to de, br, jp and tr. Sets the domain, the default language and the reported currency.
  • language - optional two-letter code. Defaults to the country's own language.
  • maxResultsPerQuery - matching products per query. 0 means no cap. Default 60.
  • sort - relevance, price_low, price_high, rating, reviews or discount. Default relevance.
  • minPrice / maxPrice - optional price bracket, in the storefront's currency.
  • minRating - optional star floor, 0 to 5. Unrated products are excluded when this is set.
  • minReviewCount - optional review floor.
  • onSaleOnly - optional. Only products with a struck-through price or a percent-off badge.
  • freeShippingOnly - optional. Only products whose delivery chip says delivery is free.
  • merchants - optional list of merchant name fragments, matched case and accent insensitive.

📤 Output

titlepricepriceValueoriginalPricediscountPercentmerchantpriceRankpriceVsMedianPercentratingreviewCount
JBL Vibe Beam 2 True Wireless Noise Cancelling Earbuds$41.9941.99$6535Best Buy1-654.21400
Bose QuietComfort Earbuds$149.00149$17916Lenovo16254.24600
Google Pixel Buds Pro 2$199.99199.99nullnullGoogle Store21674.43300

Every row also carries productId and variantId (Google's own identifiers), productUrl (the Google product page for the run's locale), currency, originalPriceValue, onSale, multipleMerchants (whether Google lists other sellers for the same product), delivery and freeDelivery, returnsPolicy, nearby (local stock), badges (the remaining chips Google showed, such as SALE or In shop), imageUrl, medianPriceValue, isLowestPrice, comparedProducts, position (Google's relevance rank), page, query, country, language and scrapedAt.

💵 How much does it cost?

$2.50 per 1,000 products on the free tier, dropping with your Apify plan, and no start fee. You pay per product row written to the dataset, which means per product that passed your filters - the tiles that get scanned and rejected are free, and so are the promo and carousel cards that never become rows. A default 60-product run costs about $0.15. Scraping one query to Google's ceiling of roughly 120 products costs about $0.30.

🔁 Run it on the Apify platform

Schedule this Actor daily or weekly from the Apify Scheduler, call it from the REST API or the JavaScript and Python clients, and export results as JSON, CSV, Excel, XML or Parquet. Webhooks fire on run completion so you can push new prices straight into your own pipeline, and the built-in integrations connect it to Google Sheets, Make, Zapier, Slack and any HTTP endpoint without glue code.

⚠️ Limits and caveats

  • Google serves about 120 products per query, and no more. Its Shopping grid stops returning new tiles a little past a result index of 60, and this Actor reaches that ceiling in three requests. If you need more coverage, split the topic into several narrower queries rather than raising the cap.
  • Filters are applied after extraction, not by Google. Google's legacy Shopping filter parameters are accepted with a 200 and then ignored on its current surface, verified 2026-07-26. So a narrow filter cannot reach deeper inventory than those ~120 products; it selects from within them.
  • imageUrl is populated for roughly half the rows. Google inlines the first screenful of images as base64 data instead of URLs. Rather than bloat every row with embedded image data, the field is left null there. productUrl always works.
  • delivery and returnsPolicy are classified for English, German, French, Spanish, Italian, Dutch, Portuguese and Polish. For other storefronts those chips still arrive verbatim in badges, just not split into their own fields.
  • merchant is the merchant Google chose to show, not the cheapest. When multipleMerchants is true, other sellers list the same product; open productUrl for the full offer list.
  • A price is a moment, not a fact. Google caches merchant feeds, so a price can lag the merchant's own site by hours. scrapedAt records when the row was taken.
  • Sponsored tiles are not marked separately. Google did not label them as ads in the pages captured for this Actor, so no isSponsored field is claimed.
  • Google Search Results Scraper - pull the organic SERP for the same keywords when you need the ranking context around a product, not just the offers.
  • eBay Listings Scraper - compare Google Shopping's retail prices against live eBay asking prices for the same item.
  • Mercari Sold Comps Scraper - anchor the same product against what people actually paid on the secondhand market.
  • Website Contact Extractor - turn the merchant names from a run into contactable suppliers.
  • Lead List Deduplicator - merge several runs into one clean file before handing it to a client.

❓ FAQ

Am I charged for products that my filters reject? No. Filtering happens before rows are written, and billing is per written row. A narrow filter makes a run cheaper.

Can I get more than 120 products for one keyword? Not from Google. Its Shopping grid stops serving new tiles past that point. Splitting one broad keyword into several specific ones is the way to widen coverage.

Which countries are supported? 26 storefronts: US, UK, Canada, Australia, Ireland, India, Germany, Austria, Switzerland, France, Belgium, Netherlands, Spain, Italy, Portugal, Poland, Sweden, Denmark, Norway, Brazil, Mexico, Japan, Singapore, New Zealand, South Africa and Turkey. Each one sets its own currency.

Does it return the seller's own product URL? It returns productUrl, the Google product page, which lists every merchant offer for that product. Google does not put merchant links in the grid HTML, so a direct merchant URL is not available from a search page.

How do I track a price over time? Schedule the Actor and join runs on productId, which is Google's own stable identifier. scrapedAt on every row gives you the timestamp.

Why is rating sometimes empty? Not every product on Google Shopping has reviews. An empty rating means Google showed none, and it is reported as null rather than as a zero.

🛠️ Support

Something wrong or missing? Open an issue on the Actor's Issues tab with the run URL, the input you used and what you expected instead. Parser fixes for Google layout changes are the priority.

⭐ Rate this Actor

If this saved you an afternoon, please leave a review on the Reviews tab. Review count is the main trust signal buyers have on the Apify Store, and reviews are what decide which fields and countries get built next. If something is broken, please open an issue first so it can be fixed - that is faster for you than a low rating, and it keeps the Actor useful for everyone.