进阶|电商数据整合:爬虫爬取评论 + API 获取商品基础信息,用 Pandas 做数据分析
本文介绍了电商数据整合与分析的全流程方法,包括爬虫爬取评论、API获取商品信息、Pandas数据处理三大核心操作。通过京东商品案例,详细演示了静态页面评论爬取、API调用签名生成、数据清洗整合等关键技术实现。基于整合数据,开展价格销量相关性、评分分布、关键词提取等多维度分析,挖掘出商品优化、定价策略和用户运营等方面的业务洞察。该方法突破了单一数据维度局限,实现了结构化与非结构化数据的联动分析,为电
在电商行业数字化转型加速的背景下,数据已成为驱动业务决策的核心资产。商品基础信息(如价格、销量、品类)反映了商品的核心属性与市场表现,而用户评论则蕴含着消费需求、产品痛点与满意度等关键信息。将两类数据整合分析,能为商家提供从 “商品优化” 到 “运营策略调整” 的全链路指导。本文将详细讲解如何通过爬虫爬取电商评论、调用 API 获取商品基础信息,并利用 Pandas 进行数据整合与深度分析,助力从业者实现数据驱动的业务进阶。
一、前期准备:工具与环境配置
在开展数据整合工作前,需搭建稳定的技术环境并准备必备工具,确保后续操作顺畅。
1.1 核心工具选型
- Python:作为核心开发语言,提供丰富的库支持数据爬取、API 调用与分析,推荐使用 3.8 及以上版本。
- 爬虫工具:requests(发送 HTTP 请求)、BeautifulSoup4(解析 HTML 页面)、Selenium(应对动态渲染页面,如 JavaScript 加载的评论)。
- API 调用工具:requests(发送 API 请求)、json(解析 API 返回的 JSON 格式数据)。
- 数据分析工具:Pandas(数据清洗、整合与分析)、Matplotlib/Seaborn(数据可视化,辅助分析结果呈现)。
1.2 环境配置步骤
- 安装依赖库:通过 Python 包管理工具pip安装所需库,执行以下命令:
pip install requests beautifulsoup4 selenium pandas matplotlib seaborn - API 密钥申请:以主流电商平台(如京东开放平台、淘宝开放平台)为例,注册开发者账号,创建应用并申请 API 密钥(AppKey、AppSecret),获取调用商品基础信息 API 的权限(需遵守平台 API 调用规范,避免超限)。
- 爬虫合规准备:查看目标电商平台的robots.txt协议,明确允许爬取的范围;设置合理的请求间隔(如 1-2 秒 / 次),避免给服务器造成压力,同时使用代理 IP 池(如阿布云、芝麻代理)降低 IP 被封禁的风险。
二、核心操作一:爬虫爬取电商评论
电商评论多以 HTML 静态页面或 JavaScript 动态加载形式呈现,需根据页面结构选择合适的爬取方案。本文以 “京东商品评论” 为例,演示静态页面爬取流程(动态页面可通过 Selenium 模拟浏览器渲染获取数据)。
2.1 分析评论页面结构
- 获取目标 URL:打开京东某商品详情页,进入 “评论区”,复制评论列表页的 URL(如
https://item.jd.com/100012345678.html#comment
)。
- 解析页面元素:通过浏览器 “开发者工具”(F12)查看评论数据的 HTML 结构:
-
- 评论内容嵌套在div.comment-con标签中;
-
- 评论评分对应i.star标签的class属性(如star5表示 5 星评分);
-
- 评论时间存储在span.comment-time标签的文本中。
2.2 编写爬虫代码实现评论爬取
import requests
from bs4 import BeautifulSoup
import time
import csv
# 1. 配置请求头(模拟浏览器访问,避免被识别为爬虫)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
"Referer": "https://item.jd.com/" # Referer字段,模拟从商品详情页跳转至评论页
}
# 2. 定义评论爬取函数
def crawl_jd_comments(product_id, page_num, save_path):
"""
爬取京东商品评论
:param product_id: 商品ID(从商品详情页URL中提取,如100012345678)
:param page_num: 需爬取的评论页数
:param save_path: 评论数据保存路径(CSV格式)
"""
# 打开CSV文件,准备写入数据
with open(save_path, "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["评论时间", "评分", "评论内容"])
writer.writeheader()
# 循环爬取多页评论
for page in range(1, page_num + 1):
# 构造评论页URL(京东评论页通过page参数控制分页)
comment_url = f"https://club.jd.com/comment/productPageComments.action?productId={product_id}&score=0&sortType=5&page={page}&pageSize=10"
try:
# 发送请求获取页面数据
response = requests.get(comment_url, headers=headers, timeout=10)
response.raise_for_status() # 若请求失败(如404、500),抛出异常
comment_data = response.json() # 京东评论API返回JSON格式数据
# 解析评论数据
comments = comment_data["comments"]
for comment in comments:
comment_time = comment["creationTime"] # 评论时间
score = comment["score"] # 评分(1-5星)
comment_content = comment["content"].replace("\n", "") # 评论内容(去除换行符)
# 写入CSV文件
writer.writerow({
"评论时间": comment_time,
"评分": score,
"评论内容": comment_content
})
print(f"第{page}页评论爬取完成")
time.sleep(1.5) # 设置请求间隔,避免被封禁IP
except Exception as e:
print(f"第{page}页评论爬取失败:{str(e)}")
continue
# 3. 调用函数爬取评论(示例:爬取商品ID为100012345678的前10页评论)
crawl_jd_comments(product_id="100012345678", page_num=10, save_path="jd_comments.csv")
2.3 数据存储与校验
爬取的评论数据以 CSV 格式存储(便于后续 Pandas 读取),存储后需进行基础校验:
- 检查 CSV 文件是否存在缺失值(如空评论内容、缺失评分);
- 验证评论时间格式是否统一(如 “2024-05-20 14:30:00”),便于后续时间维度分析。
二、核心操作二:API 获取商品基础信息
相比爬虫,电商平台开放 API 能更稳定、合规地获取商品基础信息(如价格、销量、品牌、品类),且数据格式标准化,减少解析成本。本文以 “京东开放平台 API” 为例,演示商品基础信息的获取流程。
3.1 API 调用参数与签名生成
京东开放平台 API 调用需满足 “参数签名” 机制,确保请求合法性。核心参数包括:
- appkey:开发者申请的 AppKey;
- timestamp:当前时间戳(格式:yyyy-MM-dd HH:mm:ss);
- sign:签名(通过 AppSecret 与请求参数按指定算法生成)。
3.2 编写 API 调用代码
import requests
import time
import hashlib
import csv
# 1. 配置API密钥(从京东开放平台获取)
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
# 2. 定义签名生成函数
def generate_sign(params, app_secret):
"""
生成API请求签名(京东API签名规则:参数按字母排序+拼接AppSecret+MD5加密)
:param params: 请求参数字典
:param app_secret: AppSecret
:return: 签名字符串
"""
# 按参数名首字母升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接参数键值对(如"appkey=xxx×tamp=xxx")
sign_str = "&".join([f"{k}={v}" for k, v in sorted_params]) + app_secret
# MD5加密并转为大写
sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
return sign
# 3. 定义商品基础信息获取函数
def get_product_base_info(product_ids, save_path):
"""
调用京东API获取商品基础信息
:param product_ids: 商品ID列表(如["100012345678", "100098765432"])
:param save_path: 数据保存路径(CSV格式)
"""
# API请求URL
api_url = "https://api.jd.com/routerjson"
# 打开CSV文件,准备写入数据
with open(save_path, "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["商品ID", "商品名称", "品牌", "价格", "销量", "品类"])
writer.writeheader()
for product_id in product_ids:
# 1. 构造请求参数
timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
params = {
"appkey": APP_KEY,
"method": "jd.union.open.goods.basic.info.get", # 京东商品基础信息API接口名
"timestamp": timestamp,
"format": "json",
"v": "1.0",
"param": '{"skuIds":["' + product_id + '"]}' # 商品ID参数(JSON格式)
}
# 2. 生成签名
params["sign"] = generate_sign(params, APP_SECRET)
try:
# 3. 发送API请求
response = requests.post(api_url, data=params, timeout=10)
response.raise_for_status()
result = response.json()
# 4. 解析商品数据
product_info = result["jd_union_open_goods_basic_info_get_response"]["result"]["data"][0]
product_name = product_info["skuName"] # 商品名称
brand = product_info["brandName"] # 品牌
price = product_info["priceInfo"]["price"] # 价格(元)
sales = product_info["salesInfo"]["monthSales"] # 月销量
category = product_info["categoryInfo"]["categoryName"] # 品类
# 5. 写入CSV文件
writer.writerow({
"商品ID": product_id,
"商品名称": product_name,
"品牌": brand,
"价格": price,
"销量": sales,
"品类": category
})
print(f"商品ID {product_id} 基础信息获取完成")
time.sleep(1) # 控制API调用频率,避免超限
except Exception as e:
print(f"商品ID {product_id} 信息获取失败:{str(e)}")
continue
# 4. 调用函数获取商品基础信息(示例:获取2个商品的信息)
product_ids = ["100012345678", "100098765432"]
get_product_base_info(product_ids=product_ids, save_path="product_base_info.csv")
三、核心操作三:Pandas 数据整合与分析
获取评论数据(jd_comments.csv)与商品基础信息(product_base_info.csv)后,通过 Pandas 进行数据清洗、整合,并开展多维度分析,挖掘数据价值。
4.1 数据加载与预处理
首先加载两类数据,处理缺失值、重复值等问题,为后续分析奠定基础:
import pandas as pd
import matplotlib.pyplot as plt
import re
from collections import Counter
import jieba # 中文分词库(需提前安装:pip install jieba)
# 设置中文字体(避免Matplotlib绘图中文乱码)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 1. 加载数据
comments_df = pd.read_csv("jd_comments.csv") # 评论数据
product_df = pd.read_csv("product_base_info.csv") # 商品基础信息数据
# 2. 数据预处理
# (1)评论数据预处理:处理缺失值、提取评论月份
comments_df = comments_df.dropna(subset=["评论内容", "评分"]) # 删除关键字段缺失的行
comments_df["评论月份"] = pd.to_datetime(comments_df["评论时间"]).dt.to_period("M") # 提取评论月份(如2024-05)
# (2)商品数据预处理:处理价格格式(确保为数值型)
product_df["价格"] = pd.to_numeric(product_df["价格"], errors="coerce") # 转换价格为数值型,无法转换的设为NaN
product_df = product_df.dropna(subset=["价格", "销量"]) # 删除价格/销量缺失的行
# 3. 数据整合:通过“商品ID”关联评论数据与商品基础信息
# (注:评论数据需先添加“商品ID”字段,可在爬虫阶段通过URL提取并写入)
comments_df["商品ID"] = "100012345678" # 示例:为评论数据添加商品ID(实际需按爬取逻辑补充)
integrated_df = pd.merge(comments_df, product_df, on="商品ID", how="left") # 左连接,保留所有评论
4.2 多维度数据分析
基于整合后的数据,开展 “商品表现分析”“用户评论分析”“关联分析” 三大维度分析,挖掘业务洞察。
4.2.1 商品表现分析:销量与价格相关性
分析商品销量与价格的关系,判断价格对销量的影响:
# 1. 计算各商品的销量-价格数据
sales_price_df = integrated_df[["商品ID", "商品名称", "价格", "销量"]].drop_duplicates()
# 2. 绘制销量-价格散点图
plt.figure(figsize=(10, 6))
plt.scatter(sales_price_df["价格"], sales_price_df["销量"], color="#1f77b4", s=80)
# 为每个点添加商品名称标签
for i, row in sales_price_df.iterrows():
plt.annotate(row["商品名称"], (row["价格"], row["销量"]),
xytext=(5, 5), textcoords="offset points", fontsize=9)
plt.xlabel("商品价格(元)")
plt.ylabel("月销量(件)")
plt.title("商品价格与月销量相关性分析")
plt.grid(alpha=0.3)
plt.savefig("price_sales_correlation.png", dpi=300, bbox_inches="tight")
plt.close()
# 3. 计算相关系数(量化价格与销量的线性关系)
correlation = sales_price_df["价格"].corr(sales_price_df["销量"])
print(f"商品价格与月销量的相关系数:{correlation:.4f}")
# 结果解读:若相关系数为负,说明价格越高,销量越低(符合一般消费规律);若接近0,说明价格对销量影响较小
4.2.2 用户评论分析:评分分布与关键词提取
通过评分分布了解用户满意度,通过评论关键词提取挖掘用户关注点:
# 1. 评论评分分布分析
score_counts = integrated_df["评分"].value_counts().sort_index() # 统计各评分的评论数量
plt.figure(figsize=(8, 5))
score_counts.plot(kind="bar", color="#ff7f0e")
plt.xlabel("评论评分(星)")
plt.ylabel("评论数量")
plt.title("商品评论评分分布")
plt.xticks(rotation=0)
plt.grid(alpha=0.3, axis="y")
plt.savefig("comment_score_distribution.png", dpi=300, bbox_inches="tight")
plt.close()
# 计算平均评分
avg_score = integrated_df["评分"].mean()
print(f"商品平均评论评分:{avg_score:.2f} 星")
# 2. 评论关键词提取(基于中文分词)
# (1)定义停用词(过滤无意义词汇,如“的”“了”)
stop_words = set(["的", "了", "是", "我", "在", "有", "和", "就", "都", "而", "及", "与", "也"])
# (2)合并所有评论内容
all_comments = " ".join(integrated_df["评论内容"].tolist())
# (3)中文分词并过滤停用词
words = jieba.lcut(all_comments)
filtered_words = [word for word in words if len(word) > 1 and word not in stop_words] # 保留长度>1的词
# (4)统计词频前20的关键词
word_counts = Counter(filtered_words)
top20_words = word_counts.most_common(20)
top_words_df = pd.DataFrame(top20_words, columns=["关键词", "词频"])
# (5)绘制关键词词频柱状图
plt.figure(figsize=(12, 6))
plt.bar(top_words_df["关键词"], top_words_df["词频"], color="#2ca02c")
plt.xlabel("关键词")
plt.ylabel("词频")
plt.title("评论关键词词频Top20")
plt.xticks(rotation=45, ha="right")
plt.grid(alpha=0.3, axis="y")
plt.savefig("comment_keywords.png", dpi=300, bbox_inches="tight")
plt.close()
print("评论关键词Top20:")
print(top_words_df)
# 结果解读:若“质量好”“物流快”词频高,说明用户对商品质量与物流满意度高;若“卡顿”“破损”词频高,需针对性优化
4.2.3 关联分析:不同月份评论与销量的关系
分析评论数量随时间的变化的与销量的关联,判断用户反馈对销量的潜在影响:
# 1. 按月份统计评论数量与平均销量
monthly_analysis = integrated_df.groupby("评论月份").agg(
评论数量=("评论内容", "count"),
平均销量=("销量", "mean")
).reset_index()
# 2. 转换评论月份为字符串(便于绘图)
monthly_analysis["评论月份"] = monthly_analysis["评论月份"].astype(str)
# 3. 绘制双轴图(评论数量与平均销量)
fig, ax1 = plt.subplots(figsize=(10, 6))
# 评论数量(左轴)
color1 = "#1f77b4"
ax1.set_xlabel("月份")
ax1.set_ylabel("评论数量", color=color1)
ax1.bar(monthly_analysis["评论月份"], monthly_analysis["评论数量"], color=color1, alpha=0.7)
ax1.tick_params(axis="y", labelcolor=color1)
# 平均销量(右轴)
ax2 = ax1.twinx()
color2 = "#ff7f0e"
ax2.set_ylabel("平均月销量(件)", color=color2)
ax2.plot(monthly_analysis["评论月份"], monthly_analysis["平均销量"], color=color2, marker="o", linewidth=2)
ax2.tick_params(axis="y", labelcolor=color2)
plt.title("月度评论数量与平均销量关联分析")
plt.grid(alpha=0.3)
fig.tight_layout()
plt.savefig("monthly_comment_sales.png", dpi=300, bbox_inches="tight")
plt.close()
# 计算评论数量与销量的相关系数
monthly_corr = monthly_analysis["评论数量"].corr(monthly_analysis["平均销量"])
print(f"月度评论数量与平均销量的相关系数:{monthly_corr:.4f}")
# 结果解读:若相关系数为正,说明评论数量增加时销量可能上升(用户反馈可能促进购买决策)
四、成果与应用:从数据到业务决策
通过上述数据整合与分析,可形成三大核心业务洞察,为电商运营提供具体指导:
- 商品优化方向:若评论关键词中 “续航短”“尺寸小” 高频出现,可推动产品研发团队优化相关功能;若平均评分低于 4 星,需排查质量或服务问题。
- 定价与促销策略:若价格与销量呈强负相关(如相关系数 =-0.8),可在大促期间适当降价以提升销量;若某品类商品评论 - 销量正相关性强,可通过 “用户晒单返现” 增加评论,间接拉动销量。
- 用户运营重点:按评论月份分析,若旺季(如 618、双 11)评论数量激增,需提前储备客服资源,及时响应用户反馈,避免负面评论扩散影响销量。
五、总结与展望
本文完整演示了 “爬虫爬取评论 + API 获取商品信息 + Pandas 分析” 的电商数据整合流程,核心价值在于实现了 “非结构化评论数据” 与 “结构化基础信息” 的联动分析,突破了单一数据维度的局限性。未来可进一步优化:
- 技术层面:引入Scrapy框架实现分布式爬虫,提升大规模评论爬取效率;结合SnowNLP等工具实现评论情感分析(区分正面 / 负面评论),深化用户态度洞察。
- 业务层面:整合用户画像数据(如年龄、地域),分析不同人群的评论偏好与购买行为,实现 “千人千面” 的精准运营。
数据整合与分析是电商进阶的核心能力,唯有持续挖掘数据价值,才能在激烈的市场竞争中实现精细化运营与可持续增长。
更多推荐


所有评论(0)