一、前言
在电商数据采集场景中,唯品会作为知名平台,其商品数据的结构化采集具有重要应用价值(如市场分析、竞品监控等)。本文将基于 HTTP 请求原理,分享关键字搜索商品列表和获取商品详情数据的 API 请求实现方案,全程使用 Python+requests 库开发,兼顾实用性和可扩展性。
🔒 重要声明:本文内容仅用于技术研究与学习,采集数据需遵守唯品会《用户协议》及 robots.txt 规则,不得用于商业用途或恶意爬取,否则后果自负。
二、准备工作
2.1 开发环境
- 编程语言:Python 3.7+
- 核心库:requests(发送 HTTP 请求)、json(解析响应数据)
- 辅助工具:Postman(API 调试)、Chrome 开发者工具(抓包分析)
- 安装依赖:
pip install requests
2.2 关键前置知识
- 唯品会 API 为HTTP 接口,需通过抓包获取真实请求地址、请求头、参数格式(直接猜测易触发反爬)
- 核心反爬应对:设置合理的 User-Agent、Referer,控制请求频率(建议 1-2 秒 / 次)
- 响应数据格式:均为 JSON,可直接解析提取字段
三、关键字搜索商品列表 API 实现
3.1 接口分析(抓包结果示例)
通过 Chrome 开发者工具(F12)抓包搜索行为,得到核心请求信息:
- 请求方式:GET
- 接口 URL:https://m.vip.com/vips-mobile/rest/search/suggest(移动端接口,反爬较弱)
- 核心参数:
| 参数名 | 说明 | 示例值 |
| keyword | 搜索关键字 | 羽绒服 |
| page | 页码(从 1 开始) | 1 |
| pageSize | 每页商品数量 | 20 |
| app_name | 固定值(抓包获取) | vipmobile_client |
| client | 设备类型 | ios/android |
| version | APP 版本号 | 9.9.90 |
- 请求头(必填,模拟真实设备):
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 VIP/9.9.90",
"Referer": "https://m.vip.com/",
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/json;charset=utf-8"
}
3.2 代码实现(搜索商品列表)
import requests
import json
import time
def search_vip_products(keyword, page=1, page_size=20):
"""
关键字搜索唯品会商品列表
:param keyword: 搜索关键字
:param page: 页码
:param page_size: 每页数量
:return: 结构化商品列表
"""
# 接口URL(抓包获取最新地址,可能会动态变化)
url = "https://m.vip.com/vips-mobile/rest/search/suggest"
# 请求参数
params = {
"keyword": keyword,
"page": page,
"pageSize": page_size,
"app_name": "vipmobile_client",
"client": "ios",
"version": "9.9.90",
"format": "json"
}
# 请求头(模拟移动端)
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 VIP/9.9.90",
"Referer": "https://m.vip.com/",
"Accept": "application/json, text/plain, */*"
}
try:
# 发送GET请求(超时设置10秒,避免卡死)
response = requests.get(
url=url,
params=params,
headers=headers,
timeout=10,
verify=False # 忽略SSL证书验证(部分环境需开启)
)
# 响应状态码判断
if response.status_code == 200:
result = response.json()
# 提取核心商品数据(根据实际响应结构调整字段)
products = []
if result.get("data") and result["data"].get("products"):
for item in result["data"]["products"]:
product_info = {
"商品ID": item.get("productId", ""),
"商品名称": item.get("productName", ""),
"品牌名称": item.get("brandName", ""),
"原价": item.get("originalPrice", 0),
"折扣价": item.get("salePrice", 0),
"折扣率": item.get("discount", ""),
"商品图片": item.get("picUrl", ""),
"商品链接": f"https://m.vip.com/detail-{item.get('productId', '')}.html"
}
products.append(product_info)
print(f"第{page}页采集完成,共{len(products)}件商品")
return products
else:
print(f"请求失败,状态码:{response.status_code}")
return []
except Exception as e:
print(f"搜索商品列表异常:{str(e)}")
return []
# 测试:搜索"羽绒服"第1页商品
if __name__ == "__main__":
keyword = "羽绒服"
product_list = search_vip_products(keyword, page=1)
print(json.dumps(product_list, ensure_ascii=False, indent=2))
3.3 分页处理扩展
若需采集多页数据,可添加循环逻辑:
def batch_search_products(keyword, total_pages=3):
"""批量采集多页商品"""
all_products = []
for page in range(1, total_pages + 1):
products = search_vip_products(keyword, page=page)
if not products:
break # 无数据则停止分页
all_products.extend(products)
time.sleep(1.5) # 间隔1.5秒,避免反爬
print(f"批量采集完成,共{len(all_products)}件商品")
return all_products
# 测试批量采集3页
batch_products = batch_search_products("羽绒服", total_pages=3)
四、获取商品详情数据 API 实现
4.1 接口分析(基于商品 ID)
通过商品 ID 请求详情接口,抓包核心信息:
- 请求方式:GET
- 核心参数:
| 参数名 | 说明 | 示例值 |
| productId | 商品 ID(从列表接口获取) | 123456789 |
| app_name | 固定值 | vipmobile_client |
| client | 设备类型 | ios |
4.2 代码实现(获取商品详情)
def get_product_detail(product_id):
"""
根据商品ID获取详情数据
:param product_id: 商品ID
:return: 商品详情字典
"""
url = "https://m.vip.com/vips-mobile/rest/product/detail"
params = {
"productId": product_id,
"app_name": "vipmobile_client",
"client": "ios",
"version": "9.9.90",
"format": "json"
}
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 VIP/9.9.90",
"Referer": f"https://m.vip.com/detail-{product_id}.html",
"Accept": "application/json, text/plain, */*"
}
try:
response = requests.get(
url=url,
params=params,
headers=headers,
timeout=10,
verify=False
)
if response.status_code == 200:
result = response.json()
detail_data = result.get("data", {})
# 提取详细字段(规格、库存、详情描述等)
product_detail = {
"商品ID": detail_data.get("productId", ""),
"商品名称": detail_data.get("productName", ""),
"品牌ID": detail_data.get("brandId", ""),
"品牌名称": detail_data.get("brandName", ""),
"原价": detail_data.get("originalPrice", 0),
"折扣价": detail_data.get("salePrice", 0),
"库存状态": detail_data.get("stockStatus", ""), # 有货/无货
"商品规格": [spec.get("specValue") for spec in detail_data.get("specs", [])], # 颜色、尺码等
"商品卖点": detail_data.get("sellingPoints", ""),
"详情描述": detail_data.get("description", ""),
"售后服务": detail_data.get("afterService", ""),
"产地": detail_data.get("productionPlace", "")
}
return product_detail
else:
print(f"获取详情失败,商品ID:{product_id},状态码:{response.status_code}")
return {}
except Exception as e:
print(f"获取商品详情异常:{str(e)}")
return {}
# 测试:获取某个商品的详情(使用列表接口返回的商品ID)
if __name__ == "__main__":
product_id = "123456789" # 替换为真实商品ID
detail = get_product_detail(product_id)
print(json.dumps(detail, ensure_ascii=False, indent=2))
五、核心注意事项(避坑指南)
5.1 反爬应对策略
- 请求头伪装:必须携带真实的 User-Agent(移动端优先),Referer 需与请求 URL 匹配
- 请求频率控制:单次请求间隔≥1 秒,批量采集建议使用代理 IP 池(避免 IP 被封)
- 接口动态变化:唯品会 API 地址 / 参数可能定期更新,需重新抓包更新代码
- Cookie 处理:若出现 403 错误,可添加抓包获取的 Cookie(放入 headers 中)
5.2 合规性要求
- 禁止高频次、大规模爬取,避免对平台服务器造成压力
- 采集数据仅用于学习,不得泄露、售卖或用于商业竞争
- 遵守 robots.txt 规则(唯品会 robots.txt:https://www.vip.com/robots.txt)
5.3 异常处理
- 增加重试机制(如 requests.adapters.HTTPAdapter),应对网络波动
- 对缺失字段设置默认值,避免解析 JSON 时报错
- 定期验证接口可用性,及时更新请求参数 / URL
六、功能扩展建议
- 数据存储:将采集结果存入 MySQL、MongoDB 或 Excel(使用 pandas 库)
- 多线程 / 异步:使用 threading 或 aiohttp 提升采集效率(注意控制并发数)
- 代理 IP 池:对接阿布云、芝麻代理等服务,解决 IP 封禁问题
- 字段扩展:根据需求提取更多字段(如评论数、销量、用户评分等)
七、总结
本文通过实际抓包分析 + 代码实现,完成了唯品会商品采集的核心流程:关键字搜索商品列表→获取商品详情。关键在于准确模拟真实请求和合规采集,开发者可根据实际需求调整参数、扩展功能。
若遇到接口更新、反爬加强等问题,建议重新通过 Chrome 开发者工具抓包分析最新请求结构,或留言交流解决方案。技术研究的核心是尊重平台规则,共同维护网络生态~
581

被折叠的 条评论
为什么被折叠?



