2026년 구글 쇼핑 가격 스크래핑 완벽 가이드

구글 쇼핑의 가격 및 제품 데이터를 수집하기 위한 실전 가이드입니다. Content API의 한계, HTML 파싱 셀렉터, 프록시 기반 지역화 전략, 그리고 차단 회피 기법까지 코드 예제와 함께 다룹니다.

How to Scrape Google Shopping Prices in 2026: A Practical Guide

2026년 구글 쇼핑 가격 스크래핑: API vs HTML 트레이드오프

경쟁사 가격 분석을 위해 구글 쇼핑에서 제품 가격을 수집하려는 경우, 가장 먼저 마주하는 결정은 API를 쓸 것인가, HTML을 파싱할 것인가입니다. 결론부터 말하면, 경쟁사 데이터를 원한다면 HTML 파싱이 유일한 실현 가능한 경로입니다.

Google의 Content API for Shopping는 자사(merchant)가 등록한 자신의 제품 데이터만 반환합니다. 즉, 다른 셀러의 가격, 재고, 평점을 알 수 없습니다. 경쟁 인텔리전스를 원한다면 tbm=shop SERP HTML 또는 /shopping/product/ 상세 페이지를 직접 파싱해야 합니다.

이 가이드에서는 구글 쇼핑 가격 스크래핑을 위해 알아야 할 모든 것 — URL 패턴, CSS 셀렉터, 안티봇 회피, 지역화 프록시 설정, 그리고 윤리적 고려사항 — 을 코드 예제와 함께 다룹니다.

구글의 안티봇 스택: 왜 스크래핑이 어려운가

구글 쇼핑은 일반 Google 검색과 동일한 안티봇 인프라 위에 구축되어 있습니다. 주요 방어 계층은 다음과 같습니다:

  • reCAPTCHA / hCaptcha: 의심스러운 트래픽 패턴을 감지하면 CAPTCHA 챌린지를 렌더링합니다.
  • sorry/index 리다이렉트: IP당 요청 빈도가 임계치를 초과하면 google.com/sorry/index로 리다이렉트되어 일시적 차단(soft-block)이 발생합니다.
  • per-IP 레이트 리미트: 동일 IP에서 짧은 시간에 다수의 요청을 보내면 즉시 차단됩니다. 실제 측정 기준으로 약 50회/분 이상의 연속 요청은 soft-block을 유발할 수 있습니다.
  • 디바이스 핑거프린팅: User-Agent, Accept-Language, WebGL 렌더러 등 브라우저 특성을 교차 검증합니다.

이러한 방어 체계 때문에 단일 IP로 대량 스크래핑을 시도하면 몇 분 안에 차단됩니다. 구글 쇼핑 가격 스크래퍼를 안정적으로 운영하려면 고품질 프록시 풀이 필수입니다.

URL 패턴과 CSS 셀렉터

검색 결과 URL 패턴

구글 쇼핑 검색 결과는 다음 URL 패턴으로 접근할 수 있습니다:

https://www.google.com/search?tbm=shop&q=YOUR_QUERY&gl=US&hl=en

여기서 tbm=shop은 쇼핑 탭을 지정하고, gl은 국가, hl은 언어를 설정합니다. 이 파라미터 조합이 결과에 표시되는 셀러와 통화를 결정합니다.

주요 CSS 셀렉터

2026년 현재 유효한 주요 셀렉터는 다음과 같습니다. 구글은 주기적으로 마크업을 변경하므로 항상 최신 HTML을 검증해야 합니다.

데이터CSS 셀렉터비고
제품 컨테이너.sh-dgr__content각 제품 카드의 루트
검색 결과 래퍼.sh-pr__product-results전체 결과 컨테이너
가격.a8Pemb표시 가격 (통화 기호 포함)
제품명h3.t16Oj8 또는 [role="heading"]제품 타이틀 텍스트
셀러명.sh-dgr__seller-info 또는 텍스트 노드판매자 이름
평점[role="img"] aria-label별점 및 리뷰 수

상세 페이지: /shopping/product/

개별 제품의 전체 셀러 오퍼를 보려면 상세 페이지로 이동합니다:

https://www.google.com/shopping/product/{product_id}/offers

이 페이지에서는 모든 셀러의 가격, 배송비, 재고 상태가 패널 형태로 표시됩니다. 각 오퍼 행은 .sh-osd__offer-row 또는 유사 셀렉터로 추출할 수 있습니다.

왜 지역화된 가격에 주거용 프록시가 필요한가

구글 쇼핑은 사용자의 위치에 따라 다른 셀러와 통화를 표시합니다. 미국 쇼핑객이 보는 결과와 독일 쇼핑객이 보는 결과는 완전히 다릅니다. 이는 gl 파라미터만으로는 충분하지 않다는 의미입니다.

구글은 gl 파라미터와 함께 요청 IP의 지리적 위치를 교차 검증합니다. IP가 미국에서 오는데 gl=DE를 설정하면 결과가 불일치하거나 제한될 수 있습니다. 따라서 정확한 지역화 데이터를 수집하려면 해당 국가/도시의 IP에서 요청을 보내야 합니다.

ProxyHat 주거용 프록시는 사용자 이름에 국가 및 도시 플래그를 지정할 수 있습니다:

  • 미국 IP: user-country-US:pass
  • 독일 베를린 IP: user-country-DE-city-berlin:pass
  • 일본 도쿄 IP: user-country-JP-city-tokyo:pass

이를 통해 실제 해당 지역 사용자가 보는 가격, 통화, 셀러 구성을 정확히 재현할 수 있습니다. 자세한 지역 목록은 ProxyHat 지역 페이지에서 확인하세요.

Python requests 예제: ProxyHat으로 구글 쇼핑 스크래핑하기

다음은 ProxyHat 주거용 프록시를 통해 구글 쇼핑 검색 결과를 수집하고 파싱하는 실전 Python 예제입니다. requestsBeautifulSoup을 사용합니다.

import requests
from bs4 import BeautifulSoup
import time
import random

# ProxyHat 주거용 프록시 설정 (미국 IP)
proxy_user = "user-country-US"
proxy_pass = "YOUR_PASSWORD"
proxy_url = f"http://{proxy_user}:{proxy_pass}@gate.proxyhat.com:8080"

proxies = {
    "http": proxy_url,
    "https": proxy_url,
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
}

def scrape_google_shopping(query, gl="US", hl="en"):
    url = "https://www.google.com/search"
    params = {
        "tbm": "shop",
        "q": query,
        "gl": gl,
        "hl": hl,
    }

    resp = requests.get(url, params=params, proxies=proxies, headers=headers, timeout=30)

    # soft-block 감지
    if "sorry/index" in resp.url or resp.status_code == 429:
        print(f"[WARNING] Soft-block detected. URL: {resp.url}")
        return None

    soup = BeautifulSoup(resp.text, "html.parser")
    results = []

    for card in soup.select(".sh-dgr__content"):
        title_el = card.select_one("h3")
        price_el = card.select_one(".a8Pemb")
        seller_el = card.select_one("[role=heading] + div")

        title = title_el.get_text(strip=True) if title_el else None
        price = price_el.get_text(strip=True) if price_el else None
        seller = seller_el.get_text(strip=True) if seller_el else None

        results.append({
            "title": title,
            "price": price,
            "seller": seller,
        })

    return results

# 실행 예제
if __name__ == "__main__":
    data = scrape_google_shopping("wireless earbuds", gl="US", hl="en")
    if data:
        for item in data[:3]:  # 첫 3개만 출력
            print(f"Title: {item['title']}")
            print(f"Price: {item['price']}")
            print(f"Seller: {item['seller']}")
            print("---")
        print(f"Total results: {len(data)}")

위 코드를 실행하면 다음과 같은 (truncated) 결과를 얻을 수 있습니다:

Title: Sony WF-1000XM5 Wireless Noise Canceling Earbuds
Price: $248.00
Seller: Best Buy
---
Title: Apple AirPods Pro (2nd Generation)
Price: $189.00
Seller: Amazon
---
Title: JBL Tune Buds Pro
Price: $49.95
Seller: Walmart
---
Total results: 40

이 예제는 단일 쿼리에 대한 기본 파싱을 보여줍니다. 실제 운영 환경에서는 세션 관리, 지연 랜덤화, 에러 재시도 로직이 추가로 필요합니다. ProxyHat 문서에서 인증 및 세션 설정에 대한 자세한 내용을 확인할 수 있습니다.

페이지네이션, 쿼리 배칭, 소프트블록 감지

페이지네이션

구글 쇼핑 검색 결과는 일반적으로 페이지당 약 40개의 제품을 반환합니다. 추가 페이지는 URL에 &start=40, &start=80 파라미터를 추가하여 접근합니다:

https://www.google.com/search?tbm=shop&q=wireless+earbuds&gl=US&hl=en&start=40

하지만 구글은 보통 3~4페이지(약 120~160개 결과) 이후부터 결과 품질이 급격히 떨어지며, 더 이상의 페이지는 빈 결과를 반환합니다. 경쟁 분석 목적이라면 첫 2~3페이지면 충분한 경우가 많습니다.

쿼리 배칭 전략

수백 개의 제품 키워드를 수집해야 한다면, 모든 쿼리를 순차적으로 실행하지 마세요. 대신 다음 전략을 사용하세요:

  • 쿼리 셔플: 키워드 리스트를 무작위로 섞어 패턴을 분산시킵니다.
  • 세션 로테이션: ProxyHat의 user-session-{id} 플래그를 사용해 쿼리마다 다른 세션(즉, 다른 IP)을 할당합니다. user-session-abc123:pass 형식입니다.
  • 랜덤 지연: 요청 사이에 3~8초의 무작위 대기를 삽입합니다. time.sleep(random.uniform(3, 8))을 사용하세요.
  • 동시성 제한: 단일 세션당 최대 10~15개의 동시 요청을 유지하고, 전체 프록시 풀에서는 100 concurrent sessions 이하로 운영하세요.

소프트블록 감지

하드 CAPTCHA가 뜨기 전에 구글은 여러 소프트블록 신호를 보냅니다. 이를 조기 감지하면 전체 IP가 차단되는 것을 막을 수 있습니다:

  • 응답 URL에 sorry/index가 포함되는지 확인
  • HTTP 상태 코드 429 Too Many Requests 모니터링
  • 결과 수가 갑자기 0이 되거나 CAPTCHA iframe이 HTML에 포함되는지 확인
  • 응답 시간이 평균보다 3배 이상 지연되는 경우 의심

소프트블록이 감지되면 해당 세션을 즉시 폐기하고 새 세션으로 전환하세요. ProxyHat의 세션 로테이션을 사용하면 이 과정을 자동화할 수 있습니다.

윤리와 ToS: 공개 데이터만, 그리고 법적 경계

구글 쇼핑 제품 데이터를 수집할 때 다음 원칙을 지키세요:

  • 공개 데이터만 수집: 로그인이 필요한 페이지, 비공개 셀러 대시보드, 결제 페이지는 수집하지 마세요.
  • robots.txt 존중: 구글의 robots.txt를 확인하고 허용된 경로만 크롤링하세요.
  • 속도 제한: 구글 인프라에 부담을 주지 않는 합리적인 요청 속도를 유지하세요.
  • 개인정보 최소화: 제품 가격, 셀러명, 평점 등 비즈니스 데이터만 수집하고 개인 식별 정보는 수집하지 마세요.

법적 측면에서, 미국의 Computer Fraud and Abuse Act (CFAA)는 인가 없는 시스템 접근을 제한하며, EU의 GDPR은 개인정보 보호를 규정합니다. 공개 SERP 데이터의 수집 자체가 불법이라는 명확한 판례는 없지만, 대량 자동화 수집은 서비스 약관 위반이 될 수 있고, 구글의 공식 SERP API 파트너를 사용하는 것이 가장 안전한 경로입니다. 상업적 규모로 운영한다면 법무팀과 검토하세요.

ProxyHat은 웹 스크래핑 유스케이스SERP 트래킹을 위한 프록시 인프라를 제공합니다. 또한 프라이싱 페이지에서 요구사항에 맞는 플랜을 확인할 수 있습니다.

핵심 요약: Key Takeaways

  • Content API for Shopping은 자사 제품만 반환하므로, 경쟁 가격 데이터를 원하면 HTML 파싱이 필수입니다.
  • 주요 셀렉터: .sh-dgr__content (제품 카드), .a8Pemb (가격), .sh-pr__product-results (결과 컨테이너).
  • 지역화된 가격을 정확히 수집하려면 gl/hl 파라미터와 함께 해당 지역의 주거용 프록시 IP를 사용해야 합니다.
  • ProxyHat 사용자 이름에 user-country-US 또는 user-country-DE-city-berlin 플래그로 지역을 지정하세요.
  • 소프트블록 신호(sorry/index 리다이렉트, 429 상태 코드)를 조기 감지하여 하드 차단을 방지하세요.
  • 요청 간 3~8초 랜덤 지연, 세션 로테이션, 동시성 제한을 통해 안정적인 수집 환경을 유지하세요.
  • 공개 데이터만 수집하고, robots.txt를 존중하며, 상업적 규모 운영 시 법무 검토를 받으세요.

FAQ

구글 쇼핑 가격 스크래핑이란 무엇인가?

구글 쇼핑 가격 스크래핑은 tbm=shop 검색 결과 페이지나 /shopping/product/ 상세 페이지에서 제품 가격, 셀러명, 평점 등의 데이터를 자동화된 방식으로 추출하는 작업입니다. Content API for Shopping은 자사 제품만 반환하므로, 경쟁사 가격 데이터를 수집하려면 HTML을 직접 파싱해야 합니다.

구글 쇼핑 가격 스크래핑에 프록시가 왜 필요한가?

구글은 동일 IP에서 과도한 요청이 감지되면 sorry/index 리다이렉트, 429 상태 코드, reCAPTCHA 챌린지 등으로 차단합니다. 단일 IP로는 수분 내에 차단되므로, 주거용 프록시 풀을 통해 IP를 로테이션해야 안정적인 수집이 가능합니다. 또한 지역화된 가격을 수집하려면 해당 국가/도시의 IP가 필요합니다.

구글 쇼핑 스크래핑에 어떤 프록시 유형이 가장 적합한가?

주거용 프록시(Residential Proxy)가 가장 적합합니다. 구글은 IP 평판을 교차 검증하며, 데이터센터 IP는 빠르게 차단됩니다. 주거용 IP는 실제 ISP에서 할당된 IP이므로 탐지 확률이 낮습니다. 도시 수준 지역 타겟팅이 필요하면 ProxyHat의 user-country-DE-city-berlin 형식을 사용하세요.

구글 쇼핑 스크래핑 시 차단을 어떻게 피하나요?

요청 간 3~8초의 랜덤 지연을 삽입하고, 세션 로테이션으로 IP를 순환하며, 동시 요청 수를 제한하세요. 응답 URL에 sorry/index가 포함되거나 429 상태 코드가 반환되면 즉시 해당 세션을 폐기하고 새 세션으로 전환하세요. 일관된 User-Agent와 Accept-Language 헤더를 유지하고, 디바이스 핑거프린트가 자연스러운 패턴을 보이도록 설정하세요.

시작할 준비가 되셨나요?

AI 필터링으로 148개국 이상에서 5천만 개 이상의 레지덴셜 IP에 액세스하세요.

가격 보기레지덴셜 프록시
← 블로그로 돌아가기