为什么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-recaptchadiv,要求人工或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:国家代码(us、de、jp),影响卖家与货币。hl:界面语言(en、de、ja)。start=0、start=20...:分页,每页约20条结果。
常用CSS选择器(2026年初验证,Google会不定期改版):
.sh-dgr__content:单条商品结果容器。.sh-pr__product-results:结果列表外层。.a8Pemb:价格节点,文本形如$129.99。.sh-dgr__gr-name或h3:商品标题。.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-US,gl=us,hl=en。 - 德国价格矩阵:
-country-DE-city-berlin,gl=de,hl=de。 - 日本价格矩阵:
-country-JP-city-tokyo,gl=jp,hl=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-recaptcha或unusual 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=shopSERP与/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服务条款,仅采集公开价格数据,避免存储个人身份信息。






