1. 项目背景与核心目标
最近在研究电商数据抓取时,偶然发现Google Shopping的SGSS接口返回的数据结构非常规整,但官方文档几乎没有任何说明。作为一个常年和数据接口打交道的开发者,我决定对这个接口进行完整的逆向分析,看看能否挖掘出一些有价值的信息获取方式。
SGSS全称是"Google Shopping Search Service",是谷歌购物搜索的核心数据接口。通过浏览器开发者工具可以观察到,当用户在Google Shopping进行搜索时,前端会向这个接口发起请求,返回结构化商品数据。与公开API不同,这个接口没有调用限制,但数据结构需要自行解析。
2. 接口分析与请求构造
2.1 请求参数解析
通过抓包分析,典型的SGSS接口请求URL如下:
code复制https://www.google.com/shopping/product/{product_id}/sgs?{query_params}
关键参数包括:
product_id: 商品唯一标识符q: 搜索关键词hl: 语言代码(如zh-CN)gl: 国家代码(如SG)near: 地理位置参数psb: 分页参数
重要提示:参数值必须进行URL编码,特别是包含特殊字符的搜索词。我曾因为未编码中文关键词导致返回空数据,排查了半天才发现问题。
2.2 请求头设置
需要特别注意的请求头:
http复制User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept-Language: zh-CN,zh;q=0.9
X-Client-Data: 加密校验值
其中X-Client-Data是最容易出问题的部分。经过测试发现:
- 完全不带这个头,部分区域会返回403
- 带错误的值会导致返回空数据
- 有效的值可以通过分析浏览器正常请求获取
3. 响应数据结构解析
3.1 基础数据结构
响应是JSON格式,主要结构如下:
json复制{
"product": {
"id": "...",
"title": "...",
"price": {...},
"seller": {...},
"images": [...],
"specs": [...]
},
"related": [...],
"reviews": {...}
}
3.2 价格信息提取
价格字段是最复杂的部分,包含多种表示形式:
json复制"price": {
"value": 129.99,
"currency": "SGD",
"formatted": "S$129.99",
"original": 159.99,
"discount": 30,
"discount_percent": 19
}
处理时需要注意:
- 某些地区价格包含税费,需要额外字段判断
- 折扣信息可能不存在或格式不同
- 货币符号位置随语言变化(如"$123" vs "123€")
3.3 商家信息解析
商家信息包含平台自营和第三方卖家:
json复制"seller": {
"name": "Official Store",
"rating": 4.8,
"reviews": 1250,
"type": "retailer",
"link": "..."
}
特殊案例处理:
- 某些商家名称包含HTML实体(如
&) - 评分可能为null(新商家)
- 链接可能是相对路径需要补全
4. 反爬机制与应对策略
4.1 常见封锁类型
在测试过程中遇到的限制:
- IP速率限制(约15req/min)
- User-Agent检测
- Cookie验证(特别是__Secure-3PSID)
- 请求参数签名校验
4.2 实战解决方案
经过两周的测试,稳定的采集方案应包含:
- 代理IP轮换(建议住宅IP)
- 真实浏览器UA轮换
- 关键Cookie保持更新
- 请求间隔随机化(2-5秒)
血泪教训:我曾用固定间隔1秒请求,结果10分钟后整个IP段被ban。后来改为随机间隔+自动降速才稳定。
5. 数据应用场景
5.1 价格监控系统
基于SGSS接口可以构建:
- 历史价格曲线
- 折扣提醒服务
- 跨平台比价引擎
5.2 商品情报分析
可提取的关键指标:
- 评价趋势分析
- 商家分布统计
- 规格参数对比
5.3 库存预警系统
通过监测接口中的:
json复制"availability": "in_stock",
"stock_level": "high"
可以实现库存状态监控。
6. 完整代码示例
以下是Python实现的完整采集示例:
python复制import requests
import random
import time
from urllib.parse import quote
def get_sgss_data(product_id, keyword, country='SG', language='zh-CN'):
base_url = f"https://www.google.com/shopping/product/{product_id}/sgs"
params = {
'q': quote(keyword),
'hl': language,
'gl': country,
'near': 'Singapore',
'psb': 1
}
headers = {
'User-Agent': get_random_ua(),
'Accept-Language': f'{language};q=0.9',
'Referer': 'https://www.google.com/'
}
try:
response = requests.get(
base_url,
params=params,
headers=headers,
proxies=get_proxy(),
timeout=10
)
response.raise_for_status()
return response.json()
except Exception as e:
print(f"请求失败: {str(e)}")
return None
def get_random_ua():
ua_list = [...]
return random.choice(ua_list)
# 使用示例
data = get_sgss_data('12345678', '无线耳机')
if data:
print(f"获取到商品: {data['product']['title']}")
7. 常见问题排查
7.1 返回空数据
可能原因:
- 商品ID已失效
- 地理位置参数不匹配
- 请求头缺失关键字段
解决方案:
- 验证商品ID在网页端是否有效
- 检查gl和near参数是否一致
- 对比浏览器正常请求的headers
7.2 频繁被封IP
现象:
- 连续请求后开始返回403
- 有时伴随验证码
优化方案:
- 增加代理IP池规模
- 降低请求频率至3req/min以下
- 模拟真实用户行为模式
7.3 数据字段缺失
处理方法:
- 增加字段存在性检查
- 准备默认值
- 记录异常情况用于后续分析
8. 高级技巧与优化
8.1 性能优化
- 使用aiohttp实现异步请求
- 建立本地缓存避免重复请求
- 批量处理商品ID减少连接数
8.2 数据增强
通过关联接口可以获取:
- 商家历史评分变化
- 商品类目信息
- 物流配送选项
8.3 异常处理机制
完善的采集系统应包含:
- 自动重试策略
- 代理IP健康检查
- 请求成功率监控
- 数据质量验证
在实际项目中,这套方法帮助我们建立了覆盖东南亚主要国家的电商价格监控系统,平均每天处理约50万条商品数据。最关键的是要持续观察接口变化,Google大约每季度会调整一次数据结构,需要及时更新解析逻辑。