October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan NowOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
Google Shopping

How to Scrape Google Shopping Data: Products, Prices, and Sellers (Safely and Legally)

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Short answer: Google does not document a general public endpoint for downloading Google Shopping search results. A Shopping result page is an observation of Google’s ranking and offer display, while Merchant Center feeds and product structured data are the documented ways a merchant supplies its own catalog. If you have permission to collect result-page observations, preserve the query, market, device, timestamp and displayed context; do not treat the result as a permanent product database.

Google Shopping results and merchant catalogs are different datasets

The first design decision is identifying what you actually need. A Google Shopping result page shows Google’s presentation of offers for a particular query and context. A merchant’s catalog is the data that merchant supplies through Merchant Center feeds, product structured data or its own systems.

Question Shopping result observation Merchant-owned catalog
What is it? A time- and context-specific view of products, prices and sellers shown for a query. The merchant’s own product and offer information.
Who controls the data? Google’s search and Shopping systems, plus the merchants’ submitted information. The merchant, subject to Google’s feed and markup requirements.
Typical fields Displayed title, price, currency, seller label, availability, shipping text, rating, result URL and position when visible. Product identifiers, title, description, price, availability, shipping, review information and other offer details.
Freshness Changes with the query, country, language, device, surface and collection time. Depends on feed updates, crawl processing and whether visible markup matches the feed.
Authorization Requires permission and compliance with Google’s terms, machine-readable instructions and applicable law. Uses the merchant’s authorized publishing workflow.

Google Search Central says Merchant Center participation is required for products to appear in the Shopping tab. It describes Merchant Center feeds and product structured data as ways for merchants to share product information with Google; those documents are not a public API for third parties to download Shopping search results.

Can you scrape Google Shopping results?

Technical possibility is not permission. Google’s Terms prohibit “using automated means to access content from any of our services in violation of the machine-readable instructions on our web pages (for example, robots.txt files that disallow crawling, training, or other activities)”. Google’s Search spam policies also state: “This includes scraping results for rank-checking purposes or other types of automated access to Google Search conducted without express permission.”

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Those statements matter when a project proposes a headless browser, rotating addresses, CAPTCHA workarounds or high-volume requests. Do not assume that a script is allowed because it can render a page. Before collecting anything, establish the permission arrangement, review the relevant terms and robots instructions, respect rate limits, and obtain legal advice for your jurisdiction when the use is commercial, competitive or involves personal data. The cited policies do not settle every possible permission arrangement or jurisdiction-specific question.

Choose the right collection path

Use Merchant Center or structured data for your own products

This is the documented route when you are the merchant or have the merchant’s authorization. Google says structured data can improve its understanding of product price, discounts and shipping. Merchant Center can use structured data for automatic item updates and website-crawl feeds, but automatic updates do not replace regular feed updates. Markup values must match what customers can see.

Collect result-page observations only with authorization

If your organization has express permission for a defined study, document the allowed surfaces, markets, request volume, retention period and fields. Capture only what is visible and necessary. Do not bypass bot checks or access controls, and stop when a CAPTCHA or other restriction appears.

Use a different source when neither applies

For competitive intelligence without permission to automate Google results, consider licensed market data, a partner feed or direct merchant outreach. The official material available here does not establish that any particular third-party Shopping scraper API is permitted, currently available or suitable.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Merchant-owned catalog workflow

  1. Define the canonical product record. Choose a stable identifier such as SKU, GTIN or your internal product ID. Decide how variants, bundles and subscriptions are represented.
  2. Publish a regular Merchant Center feed. Include the current price, currency, availability and shipping attributes required for your markets. Keep the feed schedule independent of ad-hoc markup changes.
  3. Add Product structured data to the product page. Include the offer values that customers see. If a sale price, availability state or shipping promise changes, update the rendered page and the feed together.
  4. Check automatic updates without depending on them. Google documents automatic item updates and website-crawl feeds as supplementary mechanisms. They are not a substitute for regular, controlled feed updates.
  5. Reconcile discrepancies. Store the feed version, page extraction time and the value displayed to a customer. Investigate differences caused by currency, regional pricing, variant selection, caching or delayed crawl processing.

Google does not guarantee when crawl-based changes will be processed. A merchant site and its Merchant Center feed can therefore be temporarily out of sync. Treat the feed and page as two records that need reconciliation, not as interchangeable copies.

Authorized result-page observation workflow

  1. Write the scope first. Record the purpose, approved Google surface, query set, country or market, language, device profile, maximum request rate and retention policy.
  2. Use a normal, consented session. Let the page load as a user would. Do not defeat a CAPTCHA, bot check, login wall or other access control. If access is denied, record the denial and end that collection attempt.
  3. Save the rendered evidence. Keep the timestamp, result-page URL, query, visible market or location setting, language, device or viewport and a screenshot or HTML snapshot where your permission allows it.
  4. Extract observations, not assumptions. Copy the displayed seller label, product title, price, currency, availability and shipping text. Keep missing values as null rather than inferring them from another page.
  5. Follow landing pages only within scope. A merchant page can show a different variant, region or price. Store its URL and a second timestamp, and label it as landing-page data rather than Google’s displayed offer.
  6. Throttle and monitor. Use a small, fixed concurrency, exponential backoff for transient failures and a hard stop for policy signals. Never increase volume to work around a block.

Fields that make a collection reproducible

Google says Shopping experiences can vary by country and device, and product information can change as feeds and crawls are processed. A useful record therefore carries its context with the value.

Field Why retain it
collected_at (UTC) Prices, availability and ranking are observations at a particular time.
query Identifies the demand expression that produced the result.
country_or_market and currency Separates regional offers and prevents currency confusion.
language and device_or_surface Shopping displays can vary by language, device and Google surface.
product_identity Use visible identifiers or a merchant SKU/GTIN when present; do not merge products solely by a similar title.
seller_label Preserves the merchant name exactly as displayed.
displayed_price and availability Keep the original text as well as a normalized value so parsing errors are auditable.
shipping_text Delivery cost and timing can change the effective offer.
result_url and landing_url Distinguishes Google’s result link from the merchant destination.
position_or_rank (if visible) Useful for analysis, but only meaningful with the same query and context.
evidence_reference Points to the permitted screenshot, HTML snapshot or capture log.

These fields are an implementation recommendation, not an official Google schema. Preserve the raw displayed strings beside normalized numbers; “$1,299”, “1,299 €” and “from $1,299” do not have the same meaning.

Runnable code for authorized, saved pages

The following examples deliberately process a page that you already saved under an authorized workflow. They do not fetch Google Search or bypass access controls. Google Shopping result markup is not a stable public schema, so a script that depends on private CSS classes will break without warning.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Python: extract Product JSON-LD from a merchant page

import json
from pathlib import Path
from bs4 import BeautifulSoup

html = Path("merchant-product.html").read_text(encoding="utf-8")
soup = BeautifulSoup(html, "html.parser")
records = []

def walk(value):
    if isinstance(value, dict):
        types = value.get("@type", [])
        if isinstance(types, str):
            types = [types]
        if "Product" in types:
            records.append(value)
        for child in value.values():
            walk(child)
    elif isinstance(value, list):
        for child in value:
            walk(child)

for tag in soup.select('script[type="application/ld+json"]'):
    try:
        walk(json.loads(tag.string or tag.get_text()))
    except json.JSONDecodeError:
        continue

for product in records:
    offers = product.get("offers", {})
    if isinstance(offers, list):
        offers = offers[0] if offers else {}
    print(json.dumps({
        "name": product.get("name"),
        "sku": product.get("sku"),
        "gtin": product.get("gtin13") or product.get("gtin14") or product.get("gtin"),
        "price": offers.get("price"),
        "currency": offers.get("priceCurrency"),
        "availability": offers.get("availability")
    }, ensure_ascii=False))

Install the only dependency with python -m pip install beautifulsoup4. JSON-LD may be absent, incomplete or different from the value shown after a variant is selected, so compare it with the rendered page before storing it as authoritative.

Node.js: the same local-file check

import { readFile } from 'node:fs/promises';
import * as cheerio from 'cheerio';

const html = await readFile('merchant-product.html', 'utf8');
const $ = cheerio.load(html);
const products = [];

function walk(value) {
  if (Array.isArray(value)) return value.forEach(walk);
  if (!value || typeof value !== 'object') return;
  const types = Array.isArray(value['@type']) ? value['@type'] : [value['@type']];
  if (types.includes('Product')) products.push(value);
  Object.values(value).forEach(walk);
}

$('script[type="application/ld+json"]').each((_, el) => {
  try { walk(JSON.parse($(el).text())); } catch (_) {}
});

for (const product of products) {
  const offer = Array.isArray(product.offers) ? product.offers[0] : (product.offers || {});
  console.log(JSON.stringify({
    name: product.name,
    sku: product.sku,
    price: offer.price,
    currency: offer.priceCurrency,
    availability: offer.availability
  }));
}

Install Cheerio with npm install cheerio. For a permitted, saved Shopping result, replace the JSON-LD reader with selectors that you have verified against your own capture and retain the raw HTML for auditing; do not assume those selectors are stable across Google interfaces.

cURL: retrieve your own authorized product page

curl --fail --location --max-time 30 "https://merchant.example/products/widget" -o merchant-product.html

Use the merchant’s real URL and authorization policy. This command is not a Google Shopping API and is not permission to fetch Google result pages.

Quality, performance and cost controls

  • Freshness: Record collection time for every offer. A later feed update or crawl can legitimately change price or availability.
  • Normalization: Parse currency and numeric price only after retaining the original text. Handle “from”, sale-price ranges, per-unit prices and tax-inclusive wording explicitly.
  • Deduplication: Prefer a GTIN, SKU or canonical landing URL; title similarity alone can merge variants incorrectly.
  • Retries: Retry network timeouts sparingly with exponential backoff. Do not retry a CAPTCHA, robots denial or policy block.
  • Concurrency: A lower request rate is easier to audit and less likely to trigger defenses. Parallelism does not improve data quality when the page is dynamic or context-dependent.
  • Storage: Keep raw evidence separately from normalized tables, encrypt credentials and define a deletion period for pages that may contain personal or session data.
  • Cost: Merchant feeds and your own parsing have infrastructure costs. Any third-party collection service has its own terms and coverage; the available sources do not establish a reliable price, quota or permission status for a named Google Shopping scraper.

Troubleshooting

The page shows a CAPTCHA or “unusual traffic” message

Stop the automated attempt. Do not rotate identities or solve the challenge programmatically. Review permission, reduce scope and ask the site owner or Google for an approved access route.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The price in Google differs from the merchant page

Compare market, currency, selected variant, tax, shipping, timestamp and feed version. Store both observations rather than overwriting one with the other.

A product is missing from the Shopping tab

For a merchant’s own listing, check Merchant Center eligibility, feed errors, required attributes and whether the page’s structured data matches the visible offer. Google does not promise immediate processing of crawl-based changes.

JSON-LD is empty or stale

Inspect the rendered value after JavaScript and variant selection. Structured data may not represent the final customer-visible state; treat it as a signal to validate, not as proof by itself.

Seller names are inconsistent

Preserve the exact displayed label and keep a separate normalized merchant key only when you have a defensible mapping. Do not infer corporate ownership from a similar name.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The landing URL redirects or expires

Store the original result URL, final URL and capture time. A redirect is an observation about that session, not evidence that every future click will resolve identically.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

If your permitted workflow needs a rendered page or evidence image, ScreenshotNeo can capture a URL through one GET request. It removes cookie and consent banners, newsletter popups and chat widgets before the capture; bot checks, blank pages, timeouts, failed loads and cache hits are not billed, and each response reports the page verdict and billing status in headers. Its MCP server provides take_screenshot, get_page_info and capture_pdf tools for Claude, Cursor and other MCP clients.

Use it only for URLs you are authorized to capture; the service does not change Google’s access rules.

cURL

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://www.google.com/search?tbm=shop&q=wireless+keyboard -o shot.webp

Python

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://www.google.com/search?tbm=shop&q=wireless+keyboard"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://www.google.com/search?tbm=shop&q=wireless+keyboard' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

See the ScreenshotNeo documentation for capture options such as full-page screenshots with lazy images loaded, CSS-element capture, dark mode, device presets, retina scale, PDF settings, custom CSS and JavaScript, click actions, selector waits, network-idle waits, request blocking, custom headers and cookies, timezone and geolocation, transparent backgrounds, resizing, TTL-based caching, signed image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, usage reporting and the OpenAPI specification. Common screenshot-API parameter names are accepted to ease migration.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The Free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 shots; other listed plans are Growth at $15 for 15,000, Pro at $39 for 60,000, Scale at $99 for 250,000 and Business at $249 for 1,000,000. Yearly billing gives two months free, and every feature is available on every plan. Create a free ScreenshotNeo account.

Frequently Asked Questions

Is Merchant Center a downloadable database of every Shopping result?

No. Merchant Center is Google’s publishing workflow for merchants. It does not provide a documented public endpoint for downloading competitors’ Shopping search results.

Can I use a saved screenshot as price evidence?

Yes, when your collection is authorized. Keep the image with its query, market, device and UTC timestamp, and label it as an observation rather than a permanent catalog value.

Does Google guarantee that a feed update appears immediately?

No. Google says crawl-based changes have no guaranteed processing time, so feed and page values can be temporarily out of sync.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Should I store a seller’s displayed name or normalize it?

Store the displayed name exactly. Add a normalized key only when you can document the mapping, because similarly named sellers may be separate businesses.

What should happen when an authorized collection encounters a bot check?

Stop that attempt and record the event. Do not bypass the challenge, rotate identities or continue collecting until you have an approved access method.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Read next

Recommended PC Tool
Recommended PC Tool
Crashes, No Sound, or Screen Glitches?Free driver scan
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.