引言
唯品会是中国领先的在线特卖电商平台,提供品牌折扣商品。本文以爬取唯品会泳衣商品数据为例,演示从接口分析、数据抓取到可视化展示的全流程。
数据来源分析
1. 明确需求
- 采集网站:
本文演示了使用 Python 爬取唯品会泳衣商品数据的流程。通过分析网络请求接口,构建请求参数获取商品 ID 列表,进而批量抓取商品详情并存储为 CSV。随后利用 Pandas 进行数据处理,结合 PyEcharts 库绘制品牌分布饼图、售价平均柱状图及价格区间分布图,实现商品数据的直观可视化分析。

唯品会是中国领先的在线特卖电商平台,提供品牌折扣商品。本文以爬取唯品会泳衣商品数据为例,演示从接口分析、数据抓取到可视化展示的全流程。
使用浏览器开发者工具(F12 / Network)进行分析:
keyword(关键词)、pageOffset(页码)、batchSize(批次大小)等。确保安装必要的库:
pip install requests pandas pyecharts
定义请求头模拟浏览器行为,设置 Referer 防止防盗链。通过 API 获取商品 ID 列表,再分批请求详细信息。
import requests
import csv
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar, Pie
# 请求头配置
headers = {
'Referer': 'https://category.vip.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
# 第一步:获取商品 ID 列表
url = 'https://mapi.vip.com/vips-mobile/rest/shopping/pc/search/product/rank'
data = {
'app_name': 'shop_pc',
'app_version': '4.0',
'warehouse': 'VIP_HZ',
'fdc_area_id': '104103101',
'client': 'pc',
'mobile_platform': '1',
'province_id': '104103',
'api_key': '70f71280d5d547b2a7bb370a529aeea1',
'keyword': '泳衣',
'sort': '0',
'pageOffset': '0',
'channelId': '1',
'gPlatform': 'PC',
'batchSize': '120',
}
response = requests.get(url=url, params=data, headers=headers)
products = [i['pid'] for i in response.json()['data']['products']]
# 将商品 ID 分组处理(避免单次请求过多)
product_id_list = [
','.join(products[:50]),
','.join(products[50:100]),
','.join(products[100:])
]
# 第二步:获取商品详情并保存
with open('商品.csv', mode='w', encoding='utf-8-sig', newline='') as f:
fieldnames = ['标题', '品牌', '原价', '售价', '折扣', '商品信息', '详情页']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for product_ids in product_id_list:
link = 'https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/module/list/v2'
params = {
'app_name': 'shop_pc',
'app_version': '4.0',
'warehouse': 'VIP_HZ',
'fdc_area_id': '104103101',
'client': 'pc',
'mobile_platform': '1',
'province_id': '104103',
'api_key': '70f71280d5d547b2a7bb370a529aeea1',
'productIds': product_ids,
'scene': 'search',
'standby_id': 'nature',
'extParams': '{"stdSizeVids":"","preheatTipsVer":"3","couponVer":"v2","exclusivePrice":"1","iconSpec":"2x","ic2label":1,"superHot":1,"bigBrand":"1"}',
}
json_data = requests.get(url=link, params=params, headers=headers).json()
for item in json_data['data']['products']:
# 提取属性信息
attrs = ','.join([j['value'] for j in item.get('attrs', [])])
row = {
'标题': item['title'],
'品牌': item['brandShowName'],
'原价': item['price']['marketPrice'],
'售价': item['price']['salePrice'],
'折扣': item['price']['mixPriceLabel'],
'商品信息': attrs,
'详情页': f'https://detail.vip.com/detail-{item["brandId"]}-{item["productId"]}.html',
}
writer.writerow(row)
print(row)
df = pd.read_csv('商品.csv')
print(df.head())
统计各品牌商品数量,绘制饼图。
shop_num = df['品牌'].value_counts().to_list()
shop_type = df['品牌'].value_counts().index.to_list()
c = (
Pie()
.add("", [list(z) for z in zip(shop_type, shop_num)])
.set_global_opts(
title_opts=opts.TitleOpts(title="商品品牌分布占比"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical")
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render_notebook()
按品牌分组计算平均售价,绘制柱状图。
avg_price = df.groupby('品牌')['售价'].mean()
ShopType = avg_price.index.tolist()
ShopNum = [int(a) for a in avg_price.values.tolist()]
c = (
Bar()
.add_xaxis(ShopType)
.add_yaxis("", ShopNum)
.set_global_opts(
title_opts=opts.TitleOpts(title="各大品牌商品平均售价"),
visualmap_opts=opts.VisualMapOpts(
dimension=1, pos_right="5%", max_=30, is_inverse=True
),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
)
.set_series_opts(
label_opts=opts.LabelOpts(is_show=False),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_="min", name="最小值"),
opts.MarkLineItem(type_="max", name="最大值"),
opts.MarkLineItem(type_="average", name="平均值"),
]
)
)
)
c.render_notebook()
根据售价数值划分区间,分析价格段分布情况。
# 假设根据实际数据划分区间
bins = [0, 100, 200, 500, 1000, float('inf')]
bins_labels = ['0-100', '100-200', '200-500', '500-1000', '1000+']
df['价格区间'] = pd.cut(df['售价'], bins=bins, labels=bins_labels)
interval_counts = df['价格区间'].value_counts().sort_index()
pie_data = list(zip(interval_counts.index.tolist(), interval_counts.values.tolist()))
pie1 = (
Pie(init_opts=opts.InitOpts(theme='dark', width='1000px', height='600px'))
.add('', pie_data, radius=['35%', '60%'])
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
.set_global_opts(
title_opts=opts.TitleOpts(
title="唯品会泳衣商品售价价格区间",
pos_left='center',
pos_top='center',
title_textstyle_opts=opts.TextStyleOpts(color='#F0F8FF', font_size=20, font_weight='bold')
)
)
.set_colors(['#EF9050', '#3B7BA9', '#6FB27C', '#FFAF34', '#D8BFD8'])
)
pie1.render_notebook()
本文完整展示了利用 Python 进行网络爬虫开发及数据可视化的实践过程。通过逆向分析接口参数,实现了高效的数据抓取;结合 Pandas 与 PyEcharts,完成了对商品品牌、价格等维度的深度分析。该方法可迁移至其他电商平台的商品数据分析场景。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online