如何在2026年抓取Google Shopping价格与商品数据

Google Shopping的Content API只服务商家自有商品,要做竞品价格情报必须解析tbm=shop的SERP HTML。本文用ProxyHat住宅代理给出可运行的Python方案,覆盖反爬栈、选择器、城市级地理定位与合规边界。

How to Scrape Google Shopping Prices in 2026: A Practical Guide
本文目录

为什么2026年的Google Shopping价格抓取必须走HTML而非API

如果你是一名定价分析师或竞品情报工程师,你大概率已经踩过这个坑:Google的 Content API for Shopping 只返回你自己商家账号下的商品。它不能告诉你竞争对手某款SKU今天在美国卖多少钱,也不能给你德国站点的卖家列表。要做竞品价格情报,唯一可行的路径是解析 tbm=shop 的SERP HTML或 /shopping/product/ 详情页。

这意味着你要面对Google完整的反爬栈:Googlebot 之外的所有流量都会被 scrutiny。本文给出一个2026年仍然可用的实战方案,覆盖URL模式、CSS选择器、城市级住宅代理配置、Python代码以及合规边界。关键词:如何在2026年抓取Google Shopping价格

Google的反爬栈:reCAPTCHA、sorry/index与每IP速率限制

Google Shopping的SERP不是普通网页。它叠加了至少三层防御:

  • 每IP速率限制:同一IP在短时间内发起过多 /search?tbm=shop 请求,会先返回空结果或简化HTML,再升级为硬封禁。经验阈值大约在每IP每分钟15-25次请求,超过即触发软封锁。
  • sorry/index重定向:HTTP 302跳转到 https://www.google.com/sorry/index?continue=...,页面提示“我们的系统检测到您的计算机网络存在异常流量”。
  • reCAPTCHA:在sorry页面或SERP内嵌入 g-recaptcha div,要求人工或API解题。2026年Google大量使用 reCAPTCHA Enterprise,分数低于阈值直接拒绝。

数据中心IP段几乎一上来就会被降级。这就是为什么住宅代理是抓取Google Shopping的事实标准。

URL模式与CSS选择器

搜索结果页

基础URL:

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

关键参数:

  • tbm=shop:切换到Shopping垂直搜索。
  • gl:国家代码(usdejp),影响卖家与货币。
  • hl:界面语言(endeja)。
  • start=0start=20...:分页,每页约20条结果。

常用CSS选择器(2026年初验证,Google会不定期改版):

  • .sh-dgr__content:单条商品结果容器。
  • .sh-pr__product-results:结果列表外层。
  • .a8Pemb:价格节点,文本形如 $129.99
  • .sh-dgr__gr-nameh3:商品标题。
  • .a8Pemb-Offer-Row:卖家报价行(在详情页更常见)。
  • span[aria-label$="stars"]:评分。

商品详情与卖家报价

点击结果会跳转到:

https://www.google.com/shopping/product/PRODUCT_ID/offers?hl=en&gl=us

这里的 .sh-pr__product-offers 面板列出所有卖家及其价格、运费、库存状态。做竞品价格矩阵时,这一页比SERP更有价值。

为什么本地化价格需要城市级住宅代理

一个美国购物者和一个德国购物者搜索同一款“Sony WH-1000XM5”,看到的卖家、价格、货币甚至库存完全不同。Google依据IP地理 + gl/hl 参数共同决定返回内容。如果你用美国数据中心IP加 gl=de,Google会检测到不一致并返回降级结果或sorry页面。

正确的做法是:用与 gl 一致的住宅IP,并尽量下沉到城市级。例如:

  • 美国价格矩阵:-country-USgl=ushl=en
  • 德国价格矩阵:-country-DE-city-berlingl=dehl=de
  • 日本价格矩阵:-country-JP-city-tokyogl=jphl=ja

查看ProxyHat支持的地理定位可在 /cn/locations 查询。城市级定位能让你捕捉到区域性促销和运费差异,这是国家级代理做不到的。

ProxyHat住宅代理接入方式

ProxyHat的网关地址固定为 gate.proxyhat.com,HTTP端口 8080,SOCKS5端口 1080。地理与会话标志写在用户名里:

# 美国轮换住宅代理
http://user-country-US:pass@gate.proxyhat.com:8080

# 德国柏林粘性会话(60分钟内同IP)
http://user-country-DE-city-berlin-session-prd42:pass@gate.proxyhat.com:8080

# SOCKS5
socks5://user-country-JP-city-tokyo:pass@gate.proxyhat.com:1080

定价与套餐见 /cn/pricing。更多抓取场景参考 /cn/use-cases/web-scraping/cn/use-cases/serp-tracking。完整参数文档见 docs.proxyhat.com

可运行的Python示例:抓取一条Google Shopping结果

下面这段代码用 requests + BeautifulSoup 经ProxyHat住宅代理抓取“Sony WH-1000XM5”的美国SERP,解析第一条结果的标题、价格、卖家、评分。

import requests
from bs4 import BeautifulSoup
import random, time

PROXY = "http://user-country-US:YOUR_PASS@gate.proxyhat.com:8080"
PROXIES = {"http": PROXY, "https": PROXY}

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/124.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}

def fetch_shopping(query, gl="us", hl="en", start=0):
    url = "https://www.google.com/search"
    params = {"tbm": "shop", "q": query, "gl": gl, "hl": hl, "start": start}
    r = requests.get(url, params=params, headers=HEADERS,
                     proxies=PROXIES, timeout=25)
    if "sorry/index" in r.url or "g-recaptcha" in r.text:
        raise RuntimeError("soft-block detected, back off")
    return r.text

def parse_first_result(html):
    soup = BeautifulSoup(html, "html.parser")
    cards = soup.select(".sh-dgr__content")
    if not cards:
        return None
    c = cards[0]
    title = c.select_one("h3")
    price = c.select_one(".a8Pemb")
    seller = c.select_one(".a8Pemb + div") or c.select_one("[data-sh-c]")
    rating = c.select_one("span[aria-label$='stars']")
    return {
        "title": title.get_text(strip=True) if title else None,
        "price": price.get_text(strip=True) if price else None,
        "seller": seller.get_text(strip=True) if seller else None,
        "rating": rating.get("aria-label") if rating else None,
    }

if __name__ == "__main__":
    html = fetch_shopping("Sony WH-1000XM5")
    print(parse_first_result(html))
    time.sleep(random.uniform(2, 6))

示例输出(截断):

{
  "title": "Sony WH-1000XM5 Wireless Noise Canceling Headphones",
  "price": "$328.00",
  "seller": "Best Buy",
  "rating": "4.8 stars"
}

注意:Google会周期性改类名。建议在CI里跑一个“选择器健康检查”任务,每天用固定关键词验证 .sh-dgr__content.a8Pemb 仍然命中,命中数低于阈值就告警。

分页、批量查询与软封锁检测

分页

每页约20条,start 以20递增。超过5-7页后结果质量下降且封禁概率上升,建议每关键词最多抓3-5页,把更多关键词而不是更深分页作为扩展手段。

查询批处理

queries = ["iphone 15 pro", "pixel 8 pro", "galaxy s24 ultra"]
for q in queries:
    for start in (0, 20, 40):
        try:
            html = fetch_shopping(q, start=start)
            rows = parse_all(html)
            save(rows)
        except RuntimeError as e:
            print(f"backoff: {e}")
            time.sleep(120)
            continue
        time.sleep(random.uniform(2, 6))

软封锁信号

  • 响应URL包含 sorry/index
  • HTML包含 g-recaptchaunusual traffic
  • 结果数突然为0,但关键词明显有商品。
  • HTTP 429或503。
  • 返回的HTML体积明显小于正常SERP(正常约1.2-1.8 MB,软封锁页常低于200 KB)。

检测到任一信号,立即对该IP/会话冷却10-30分钟,并切换到新的住宅出口。

代理类型对比

类型反爬穿透并发成本适用场景
住宅代理Google Shopping主力抓取
移动代理极高高价值关键词、硬封后恢复
数据中心代理仅限小规模验证

合规与伦理边界

抓取公开价格数据在很多司法管辖区是灰区,不是绿灯。你需要明确:

  • robots.txt:Google的robots.txt对 /search 设有大量Disallow。技术上你仍可请求,但这意味着你主动选择不遵守,可能违反Google服务条款。
  • CFAA:在美国,Van Buren v. United States (2021) 缩窄了CFAA的适用范围,但绕过技术性访问控制仍可能被起诉。
  • GDPR:价格本身不是个人数据,但卖家名称、评论作者昵称等可能构成个人数据。建议只存储价格、SKU、卖家法人名称,不存储用户生成内容。
  • Google官方合作伙伴:如果你的公司有预算且需要长期稳定数据,SerpApi 等官方SERP合作伙伴或Google Shopping合作伙伴计划是更合规的路径,尽管成本更高。

ProxyHat不鼓励违反任何平台ToS。本文方案适用于公开可访问的价格情报,且应在法务团队review后部署。

Key Takeaways

  • Content API for Shopping只返回自有商品,竞品价格必须解析 tbm=shop SERP与 /shopping/product/ 详情页。
  • Google的反爬栈以 sorry/index 重定向 + reCAPTCHA Enterprise + 每IP速率限制为核心,数据中心IP几乎不可用。
  • 城市级住宅代理(如 -country-DE-city-berlin)配合 gl/hl 才能拿到准确的本地化价格与卖家。
  • 核心选择器:.sh-dgr__content.a8Pemb.sh-pr__product-offers,需定期健康检查。
  • 软封锁信号(sorry URL、空结果、HTML体积骤降)要在硬CAPTCHA前主动响应。
  • 合规优先:只采公开价格,遵守robots.txt精神,必要时走官方SERP合作伙伴。

FAQ

如何在2026年抓取Google Shopping价格?

解析 https://www.google.com/search?tbm=shop&q= 的SERP HTML,因为Content API for Shopping只返回商家自有商品。用住宅代理配合 gl/hl 获取本地化价格,再用 .sh-dgr__content.a8Pemb 等选择器提取标题、价格、卖家与评分。

为什么抓取Google Shopping价格需要代理?

Google对每个IP施加激进速率限制,触发后会重定向到 sorry/index 并抛出reCAPTCHA。数据中心IP段尤其易被识别。住宅代理提供真实ISP的IP,配合城市级地理定位可让美国与德国买家看到不同卖家和货币,从而获取准确的本地化价格。

哪种代理类型最适合抓取Google Shopping?

住宅代理是首选,IP来自真实ISP,反爬系统难以区分。若需极高并发且可接受更高封禁风险,可混用移动代理。数据中心代理仅适合小规模验证。ProxyHat支持 -country-XX-city-yyy 用户名标志,可在同一会话锁定地理位置。

如何避免抓取Google Shopping时被封?

采用轮换住宅IP、随机2-6秒延迟、分批查询、检测软封锁(空结果、sorry/index重定向、reCAPTCHA HTML片段)并在硬CAPTCHA前主动暂停。同时遵守robots.txt与Google服务条款,仅采集公开价格数据,避免存储个人身份信息。

常见问题

如何在2026年抓取Google Shopping价格?

核心思路是解析 https://www.google.com/search?tbm=shop&q=关键词 的SERP HTML,因为Content API for Shopping只返回商家自有商品,无法用于竞品情报。你需要用住宅代理配合gl/hl参数获取本地化价格,再用CSS选择器如 .sh-dgr__content 与 .a8Pemb 提取标题、价格、卖家与评分。

为什么抓取Google Shopping价格需要代理?

Google对每个IP施加激进的速率限制,触发后会重定向到 sorry/index 并抛出reCAPTCHA。数据中心IP段尤其容易被识别。住宅代理提供真实ISP分配的IP,配合城市级地理定位可以让美国与德国买家看到不同的卖家和货币,从而获取准确的本地化价格。

哪种代理类型最适合抓取Google Shopping?

住宅代理是首选,因为IP来自真实ISP,反爬系统难以区分。若需要极高并发且可接受更高封禁风险,可混用移动代理。数据中心代理仅适合小规模、低频率的验证任务。ProxyHat支持 -country-XX-city-yyy 的用户名标志,可在同一会话中锁定地理位置。

如何避免抓取Google Shopping时被封?

采用轮换住宅IP、随机2-6秒延迟、分批查询、检测软封锁(空结果、sorry/index重定向、reCAPTCHA HTML片段)并在硬CAPTCHA前主动暂停。同时遵守robots.txt与Google服务条款,仅采集公开价格数据,避免存储个人身份信息。

准备开始了吗?

通过AI过滤访问148多个国家的5000多万个住宅IP。

查看价格住宅代理
← 返回博客