前言 在服饰供应链采集场景中,很多方案习惯用商品 ID 请求 VVIC 详情接口,但业务侧经常只有前端商品链接,需要先从 URL 提取唯一标识再拉取数据。本文不再单纯演示基础请求调用,重点实现链接自动解析 + 异常 URL 容错 + 多规格数据扁平化,解决链接格式多变、SKU 数组嵌套、图片地址加密等线上痛点,代码增加重试与字段过滤,适合批量爬虫、供应链数据同步场景。 前置准备 依赖:requests 库,用于 HTTP 请求 权限说明:接口调用需携带合法请求头,模拟客户端访问,高频请求建议增加延时,避免触发风控 输入:VVIC 商品详情页 URL,自动提取商品编号,无需手动截取 ID 完整代码示例 核心逻辑解读 URL 解析模块:正则表达式自动提取 goodsId,兼容带参数、末尾斜杠等多种不规则链接,省去人工截取。 会话复用:使用 Session 保持 cookie,减少握手开销,批量采集场景性能更优。 数据扁平化处理:原始返回 SKU 为嵌套数组,清洗后转为简易列表,方便直接入库。
import re
import requests
import time
class VvicDetailByUrl:
def __init__(self):
self.session = requests.Session()
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
"Referer": "https://www.vvic.com/"
}
self.retry_times = 2
# 从商品url中提取商品id
def parse_goods_id(self, goods_url):
pattern = r'goods/(\d+)'
res = re.search(pattern, goods_url)
if res:
return res.group(1)
return None
# 获取商品详情
def get_detail(self, goods_url):
goods_id = self.parse_goods_id(goods_url)
if not goods_id:
return {"code": -1, "msg": "URL解析失败,无法提取商品ID"}
api_url = f"https://www.vvic.com/api/goods/detail?goodsId={goods_id}"
for i in range(self.retry_times):
try:
resp = self.session.get(api_url, headers=self.headers, timeout=10)
if resp.status_code == 200:
data = resp.json()
return self.format_data(data)
time.sleep(0.8)
except Exception as e:
print(f"请求异常,重试{i+1}:{str(e)}")
time.sleep(1)
return {"code": -2, "msg": "接口请求多次失败"}
# 数据扁平化清洗,提取业务核心字段
def format_data(self, raw):
if raw.get("code") != 0:
return raw
item = raw["data"]
sku_list = []
for sku in item.get("skuList", []):
sku_list.append({
"spec_name": sku.get("specName"),
"price": sku.get("price"),
"stock": sku.get("stockNum")
})
result = {
"goods_name": item.get("goodsName"),
"goods_id": item.get("goodsId"),
"main_images": item.get("mainImages"),
"desc_images": item.get("descImages"),
"category_name": item.get("categoryName"),
"min_price": item.get("minPrice"),
"total_stock": item.get("totalStock"),
"sku_info": sku_list
}
return {"code": 0, "data": result}
if __name__ == '__main__':
client = VvicDetailByUrl()
url = "https://www.vvic.com/goods/123456"
ret = client.get_detail(url)
print(ret)