Google 쇼핑 가격 스크래핑 방법: 제안, 판매자, 지역 데이터

Google 쇼핑은 수천 개의 상인으로부터 가격을 한 곳에 집계합니다. 이를 신뢰할 수 있는 구조화된 지역 인식 가격 피드로 전환하는 방법을 소개합니다.

Google 쇼핑은 웹에서 가장 큰 가격 집계기 중 하나입니다. 특정 제품에 대해 수천 개의 상인으로부터 실시간 제안, 가격 및 판매자 세부 정보를 하나의 순위화된 보기로 가져옵니다. 이는 가격 인텔리전스에 대해 독특하게 효율적인 소스가 됩니다 - 하나의 쿼리로 수십 개의 소매업체가 현재 청구하는 가격을 한눈에 볼 수 있습니다. 이 가이드는 Google 쇼핑 가격을 깨끗하게 스크래핑하는 방법, 지리적 요소가 모든 것을 바꾸는 이유, 그리고 브라우저를 직접 롤링하는 것을 중단하고 대신 구조화된 API를 호출해야 할 때를 다룹니다.

쇼핑 수직이 실제로 제공하는 것

쇼핑 탭은 Google 검색의 tbm=shop 수직입니다. 각 제품 카드에는 제목, 가격, 상인/판매자 이름, 별점 및 리뷰 수, 동일한 항목의 여러 제안을 그룹화하는 제품 식별자가 포함되어 있습니다. 가격 작업에서는 그 판매자와 가격의 조합이 금광입니다: 하나의 SKU에 대한 소매업체 간의 확산을 관찰하고, 누가 누구를 저가로 판매하는지 잡아내고, 시간에 따른 가격 변동을 추적할 수 있습니다 - 재가격 책정 또는 MAP 모니터링 워크플로의 원재료입니다.

URL 구조는 간단합니다. 결과는 start 오프셋을 통해 페이지당 10개씩 페이지네이션되며, 종료의 국가는 gl로 설정됩니다.

# Google Shopping search URL, page 1, US results
https://www.google.com/search?q=wireless+earbuds&tbm=shop&gl=us

# Page 2 (results 11-20): add a start offset
https://www.google.com/search?q=wireless+earbuds&tbm=shop&gl=us&start=10

위치가 답을 결정하는 이유

쇼핑 결과는 지역화됩니다. 가격은 현지 통화로 표시되고, 시장에 따라 상인 구성이 달라지며, 가용성이 다릅니다. gl 매개변수만으로는 충분하지 않으며, Google은 요청하는 IP의 위치도 고려합니다. 미국 데이터센터 IP에서 독일 결과를 요청하면 일관성이 없고 부분적으로 미국의 답변을 받게 됩니다. 베를린의 쇼핑객이 실제로 보는 카탈로그를 읽으려면 요청이 독일의 주거용 IP에서 나가야 합니다. 200개 이상의 국가에 걸쳐 있는 주거용 프록시 풀은 가격을 책정하는 각 시장에 출구를 고정할 수 있게 해줍니다. 이는 대규모 경쟁자 가격 모니터링의 동일한 원칙입니다.

Google 쇼핑 데이터를 수집하기 위한 DIY 브라우저 스크래핑과 SERP API의 비교 다이어그램
DIY 경로는 작동하지만, 쿠키 벽, 깨지는 선택자 및 무한 반복을 상속받습니다.

DIY 경로 (및 그 세금)

헤드리스 브라우저로 페이지를 직접 스크래핑할 수 있습니다. Google 쇼핑은 동적으로 렌더링되고 잘 방어되어 있으므로 일반 HTTP 요청으로는 부족합니다 - 실제 브라우저 엔진, 각 요청에 대한 프록시, 제품이 로드되기 전에 쿠키 동의 벽 (악명 높은 button#L2AGLb "모두 수락")을 해제하는 코드가 필요합니다. 그런 다음 CSS와 싸워야 합니다: 쇼핑의 컨테이너 클래스 이름은 난독화되어 있으며 회전하므로 오늘 작동하는 선택자가 2주 후에는 깨집니다. 재시도 로직을 추가하고 (무작위 백오프로 3번 시도하는 것이 합리적인 최소치입니다) 작동하는 스크래퍼를 갖게 됩니다 - 그리고 영구적인 유지보수 작업입니다.

# Sketch of the DIY approach with Playwright + proxy
from playwright.sync_api import sync_playwright

PROXY = {"server": "http://gate.quantumproxies.io:8000",
         "username": "USER", "password": "PASS"}
URL = "https://www.google.com/search?q=wireless+earbuds&tbm=shop&gl=us"

with sync_playwright() as pw:
    browser = pw.chromium.launch(proxy=PROXY, headless=True)
    page = browser.new_context(locale="en-US").new_page()
    page.goto(URL, wait_until="networkidle", timeout=15000)
    # dismiss the consent wall before products render
    for sel in ("button#L2AGLb", "button:has-text('Accept all')"):
        btn = page.locator(sel).first
        if btn.is_visible():
            btn.click(); break
    # ...then wrestle the obfuscated product containers
    browser.close()

API 경로: 한 번의 호출로 구조화된 JSON

대안은 SERP API가 브라우저, 프록시 및 구문 분석을 소유하게 하고, 쇼핑 수직을 JSON으로 제공받는 것입니다. 쿼리와 국가를 전달하면 제목, 가격, 판매자, 평점 및 제품 ID가 이미 추출된 제안을 반환합니다. 쿠키 벽도 없고, 선택자 유지보수도 없으며, 지역은 매개변수로 처리됩니다. 계속 실행해야 하는 가격 피드의 경우, 그 거래는 보통 옳은 선택입니다 - 2026년의 SERP 스크래핑 작동 방식에 대한 우리의 분석은 왜 원시 HTML 경로가 점점 더 어려워지는지를 설명합니다.

# One request to the SERP API's Google Shopping vertical
curl -G "https://api.quantumproxies.io/v1/serp" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "engine=google_shopping" \
  --data-urlencode "q=wireless earbuds" \
  --data-urlencode "gl=us"
import requests

def shopping_offers(query, country="us"):
    r = requests.get(
        "https://api.quantumproxies.io/v1/serp",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        params={"engine": "google_shopping", "q": query, "gl": country},
        timeout=30,
    )
    r.raise_for_status()
    rows = []
    for p in r.json().get("shopping_results", []):
        rows.append({
            "title":  p.get("title"),
            "price":  p.get("price"),
            "seller": p.get("source"),   # merchant name
            "rating": p.get("rating"),
            "pid":    p.get("product_id"),
        })
    return rows

for country in ("us", "gb", "de"):
    print(country, shopping_offers("wireless earbuds", country)[:3])
쿼리 세트에서 지역 인식 SERP API를 거쳐 구문 분석된 제안 및 가격 기록 저장소로 이어지는 파이프라인 다이어그램
가격 피드는 루프입니다: 쿼리, 지역 인식 SERP 호출, 제안 구문 분석, 저장 및 움직임에 대한 알림.

단일 제안이 실제로 포함하는 것

파이프라인을 확장하기 전에 하나의 제품 카드의 형태를 이해하는 것이 중요합니다. 헤드라인 가격 외에도 각 제안에는 상인 이름, 항목 상태 (새것, 중고 또는 리퍼브), 배송 및 세금 힌트, 별점과 리뷰 수, 그리고 Google이 동일한 항목의 모든 판매자를 하나의 항목 아래에 클러스터링하는 데 사용하는 제품 ID가 포함되어 있습니다. 그 제품 ID는 모든 다운스트림의 조인 키입니다: 이를 기준으로 제안을 그룹화하면 상인 간의 동등 비교가 가능하고, 하나의 SKU의 가격을 시간에 따라 추적하며, 새로운 판매자가 목록에 들어오거나 기존 판매자가 사라지는 순간을 감지할 수 있습니다.

가격 작업을 위해 두 가지 필드는 특별한 주의를 요합니다. 판매자 이름은 상인별 뷰를 구축할 수 있게 해줍니다 - 누가 지속적으로 저가로 판매하는지, 누가 높은 가격을 고수하는지, 누가 프로모션에만 나타나는지 - 이는 익명의 가격 구름보다 훨씬 실행 가능성이 높습니다. 평점은 대략적인 신뢰 가중치를 제공하므로 한 리뷰의 리셀러를 확립된 소매업체와 동등하게 취급하지 않습니다. 가격과 통화를 함께 캡처하면, 단순한 가격 피드가 절대 대답할 수 없는 질문에 대한 답을 제공합니다.

제안을 인텔리전스로 전환하기

원시 제안은 인텔리전스가 아닙니다 - 루프가 그렇습니다. 쿼리 세트를 일정에 따라 실행하고, 각 캡처를 타임스탬프와 함께 저장하며, 역사와 비교하여 중요한 것을 표면화합니다: 경쟁자가 가격을 낮추는 순간, 새로운 판매자가 SKU에 진입하는 순간, 활용할 수 있는 재고 부족. 제품 ID로 제안을 그룹화하여 동일한 항목의 판매자를 동등하게 비교하고, 대상 시장별로 전체 세트를 실행합니다. 이 위에 도구를 구축하고 있다면, SERP API 선택에 대한 우리의 메모는 대량의 단위 경제를 결정하는 JSON 형태 및 쿼리당 비용 질문을 다룹니다.

SERP API로 Google 쇼핑 데이터를 가져오기

자주 묻는 질문

Python으로 Google 쇼핑을 어떻게 스크래핑하나요?

두 가지 경로가 있습니다. 주거용 프록시를 통해 헤드리스 브라우저 (Playwright)를 구동하고, 쿠키 동의 벽을 해제하고, 제품 컨테이너를 구문 분석합니다 - 유연하지만 유지보수가 많이 필요합니다. 마크업이 난독화되어 있으며 변경되기 때문입니다. 또는 SERP API의 google_shopping 엔진에 쿼리와 국가 코드를 전달하고, 한 번의 요청으로 구문 분석된 제안을 JSON으로 받습니다. API 경로는 유지할 코드가 훨씬 적습니다.

Google 쇼핑 데이터는 국가별로 달라지나요?

네, 상당히 다릅니다. 통화, 상인 세트, 가격 및 가용성은 모두 시장에 따라 다릅니다. gl 매개변수는 국가를 요청하지만, Google은 요청하는 IP도 고려하므로, 정확한 지역화된 결과는 대상 국가의 출구 IP가 필요합니다. 가격을 책정하는 각 시장에 대해 요청을 주거용 IP에 고정하세요.

Google 쇼핑 스크래핑은 합법인가요?

공개적으로 표시된 가격 및 제안을 수집하는 것은 가격 인텔리전스를 위한 일반적인 관행이지만, 소스의 조건 및 개인 데이터 규칙은 여전히 적용되며, 이는 법률 자문이 아닙니다. 공개 제품 데이터에만 머물고, 속도 제한을 준수하며, 특정 사용에 대해 확신이 없으면 상담을 받으세요. 필요하지 않은 개인 정보를 수집하거나 저장하지 마세요.

쇼핑 가격을 얼마나 자주 스크래핑해야 하나요?

카테고리가 얼마나 빨리 움직이는지에 따라 다릅니다. 빠르게 움직이는 전자제품이나 티켓 상품은 시간별 캡처가 필요할 수 있으며, 안정적인 카테고리는 일일 캡처로 충분합니다. 가격 변동성에 맞춰 주기를 조정하고, 모든 캡처에 타임스탬프를 찍어 역사를 구축하며, IP와 시간을 분산하여 예의 바르고 낮은 위험의 방문자가 되세요.

Google 쇼핑은 전체 시장의 가격을 하나의 쿼리 가능한 표면으로 압축합니다. 직접 렌더링하든 구조화된 JSON을 위한 API를 호출하든, 승리하는 패턴은 동일합니다: 모든 시장을 지리적으로 타겟팅하고, 일정에 따라 캡처하며, 역사를 비교합니다. 이는 일회성 스크래핑이 아닌 가격 인텔리전스 엔진입니다.

SERP API에서 구조화된 쇼핑 JSON 가져오기