一、项目概述 随着电子商务的蓬勃发展,电商平台上的商品数据蕴含着巨大的商业价值。本项目旨在使用 Python 编写网络爬虫程序,采集电商平台(以淘宝为例)上特定商品类别的详细数据,包括商品名称、价格、销量、店铺名称、评价等信息。通过对采集到的数据进行清洗、整理和分析,挖掘商品的市场趋势、消费者偏好以及店铺竞争力等信息,为电商从业者、市场研究人员和消费者提供有价值的决策依据和参考。
二、环境搭建与目标确定 (一)环境搭建 确保已经安装了 Python 3.x 版本,并安装以下必要的库: 1. requests:用于发送 HTTP 请求,获取网页内容。 pip install requests
2. BeautifulSoup:用于解析 HTML 页面,提取所需的数据。 pip install beautifulsoup4
3. pandas:用于数据处理和分析,将采集到的数据存储为 DataFrame 格式,方便后续操作。 pip install pandas
4. matplotlib(可选):用于数据可视化,绘制图表展示分析结果。 pip install matplotlib
(二)目标确定 本项目以采集淘宝平台上“智能手机”类别的商品数据为例。确定需要采集的数据字段包括:商品标题、价格、付款人数、店铺名称、店铺所在地、商品链接以及商品评价中的好评率、差评关键词等信息。 三、数据采集 (一)分析目标页面结构 使用浏览器的开发者工具(如 Chrome 的 DevTools)查看淘宝搜索结果页面和商品详情页面的 HTML 结构,确定数据所在的 HTML 标签和属性。例如,在搜索结果页面中,商品标题通常位于 <a> 标签内,其 class 属性为特定值;价格信息可能在 <span> 标签中,通过特定的 class 或 id 标识。 (二)编写爬虫代码 1. 发送请求获取页面内容 import requests
# 定义请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 淘宝搜索页面的 URL,这里搜索“智能手机”
url = 'https://s.taobao.com/search?q=%E6%99%BA%E8%83%BD%E6%89%8B%E6%9C%BA'
# 发送 GET 请求获取页面内容
response = requests.get(url, headers=headers)
if response.status_code == 200:
page_content = response.text
else:
print(f'请求失败,状态码:{response.status_code}')
2. 使用 BeautifulSoup 解析页面 from bs4 import BeautifulSoup
# 创建 BeautifulSoup 对象
soup = BeautifulSoup(page_content, 'html.parser')
# 找到所有商品列表项
item_list = soup.find_all('div', class_='item J_MouserOnverReq')
3. 提取数据 import pandas as pd
# 存储数据的列表
data = []
# 遍历商品列表项,提取数据
for item in item_list:
# 商品标题
title = item.find('a', class_='J_ClickStat').text.strip()
# 价格
price = item.find('span', class_='price').text.strip()
# 付款人数
payment_num = item.find('span', class_='deal-cnt').text.strip()
# 店铺名称
shop_name = item.find('a', class_='shopname').text.strip()
# 店铺所在地
shop_location = item.find('div', class_='location').text.strip()
# 商品链接
item_link = item.find('a', class_='J_ClickStat')['href']
# 将数据添加到列表中
data.append([title, price, payment_num, shop_name, shop_location, item_link])
# 创建 DataFrame
df = pd.DataFrame(data, columns=['商品标题', '价格', '付款人数', '店铺名称', '店铺所在地', '商品链接'])
4. 采集商品评价数据 对于每个商品,进一步访问其详情页面,采集评价数据。以采集好评率为例: # 遍历商品链接,获取评价数据
for link in df['商品链接']:
# 构建评价页面的 URL
review_url = link + '&scm=1007.12144.95220.42296_0&pvid=8960081190491159564'
# 发送请求获取评价页面内容
review_response = requests.get(review_url, headers=headers)
if review_response.status_code == 200:
review_page_content = review_response.text
else:
print(f'获取评价页面失败,状态码:{review_response.status_code}')
# 解析评价页面
review_soup = BeautifulSoup(review_page_content, 'html.parser')
# 尝试获取好评率
try:
good_rate = review_soup.find('span', class_='rate-percent').text.strip()
except AttributeError:
good_rate = '未找到'
# 将好评率添加到 DataFrame 中
df.loc[df['商品链接'] == link, '好评率'] = good_rate
四、数据清洗与整理 (一)数据清洗 1. 处理缺失值:检查数据中是否存在缺失值,对于少量缺失值,可以根据数据的分布特征和业务逻辑进行填充。例如,对于“好评率”列中的缺失值,可以用该商品所属类别的平均好评率进行填充;对于付款人数缺失的情况,如果该商品有其他相关信息(如店铺信誉、商品热度等)可参考,可进行合理估计填充。对于缺失值较多且难以补充的数据行,可以考虑删除。 # 填充好评率缺失值(示例:用均值填充)
df['好评率'].fillna(df['好评率'].mean(), inplace=True)
2. 处理异常值:分析数据列的分布情况,识别异常值。例如,价格列中可能存在过高或过低的异常价格,可能是数据录入错误或特殊促销活动导致。对于异常值,可以进一步核实数据来源,如果确定是错误数据,可以进行修正或删除。 # 处理价格异常值(示例:根据价格的四分位数确定异常范围并修正)
Q1 = df['价格'].quantile(0.25)
Q3 = df['价格'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df.loc[(df['价格'] < lower_bound) | (df['价格'] > upper_bound), '价格'] = df['价格'].median()
3. 数据格式转换:将付款人数列中的数据转换为数值类型,以便进行后续的统计分析。例如,付款人数可能是以“XX 人付款”的字符串形式存储,需要提取其中的数字部分并转换为整数。 # 转换付款人数为数值类型
df['付款人数'] = df['付款人数'].str.extract('(\d+)').astype(int)
(二)数据整理 1. 对店铺名称进行统一处理,去除店铺名称中的冗余信息,如店铺类型标注、特殊符号等,使店铺名称更规范,便于后续分析店铺的竞争情况。 # 清理店铺名称
df['店铺名称'] = df['店铺名称'].str.replace('[^\w\s]', '')
2. 根据价格、付款人数等数据,计算一些衍生指标,如商品的销售额(价格 * 付款人数)、性价比指标(可根据商品的配置、性能等综合评估与价格的比值,这里简化为价格的倒数)等,以便从不同角度分析商品的市场表现。 # 计算销售额
df['销售额'] = df['价格'] * df['付款人数']
# 计算性价比指标
df['性价比'] = 1 / df['价格']
五、数据分析与可视化 (一)价格分布分析 1. 绘制价格的直方图,展示智能手机商品价格的分布情况,观察价格的集中区间、价格分布的离散程度等信息,了解市场上智能手机的价格层次。 import matplotlib.pyplot as plt
# 绘制价格直方图
plt.figure(figsize=(12, 6))
plt.hist(df['价格'], bins=30)
plt.title('智能手机价格分布直方图')
plt.xlabel('价格')
plt.ylabel('商品数量')
plt.show()
2. 计算价格的统计描述性指标,如均值、中位数、标准差等,从数值角度分析价格的整体特征。 # 价格的统计描述性指标
price_stats = df['价格'].describe()
print(price_stats)
(二)销量与店铺分析 1. 按店铺名称分组,计算各店铺的总销售额、平均价格、平均好评率等指标,评估不同店铺在智能手机销售领域的表现和竞争力。 # 按店铺分组分析
shop_analysis = df.groupby('店铺名称').agg({'销售额':'sum', '价格':'mean', '好评率':'mean'}).reset_index()
2. 绘制店铺销售额排名前十的柱状图,直观展示销售额领先的店铺,分析其成功的因素可能包括品牌影响力、营销策略、产品质量和服务等。 # 绘制店铺销售额排名前十柱状图
top_10_shops = shop_analysis.sort_values(by='销售额', ascending=False).head(10)
plt.figure(figsize=(12, 6))
plt.bar(top_10_shops['店铺名称'], top_10_shops['销售额'])
plt.title('店铺销售额排名前十')
plt.xlabel('店铺名称')
plt.ylabel('销售额')
plt.xticks(rotation=45)
plt.show()
(三)商品评价分析 1. 提取商品评价中的差评关键词,统计各关键词出现的频率,分析消费者对智能手机不满意的主要方面,如电池续航、拍照效果、系统卡顿等,为商家改进产品提供参考。 # 提取差评关键词并统计频率(示例:假设差评数据已在一个列表中)
negative_keywords = []
for review in df['评价']:
# 这里简单地以“不好”为关键词提取示例,实际应用中需更复杂的文本处理
if '不好' in review:
negative_keywords.append(review.split('不好')[1].strip())
negative_keywords_freq = pd.Series(negative_keywords).value_counts()
print(negative_keywords_freq)
2. 绘制好评率与销售额的散点图,分析商品的好评率与销售额之间是否存在某种关联,探究消费者满意度对销售业绩的影响。 # 绘制好评率与销售额散点图
plt.figure(figsize=(12, 6))
plt.scatter(df['好评率'], df['销售额'])
plt.title('好评率与销售额散点图')
plt.xlabel('好评率')
plt.ylabel('销售额')
plt.show()
六、结果总结与应用 (一)结果总结 1. 通过对采集和分析的数据进行总结,得出关于智能手机市场的一些关键结论。例如,市场上智能手机价格的主要分布区间,消费者对不同价格段产品的需求差异;哪些店铺在销售智能手机方面具有较强的竞争力,其竞争优势体现在哪些方面(如品牌、价格、服务等);消费者对智能手机的主要关注点和不满意之处,反映出产品的改进方向等。 2. 评估本次数据采集和分析的局限性,如数据采集的范围可能有限,仅涵盖了淘宝平台部分智能手机商品,可能存在数据偏差;数据清洗和分析方法可能不够完善,对于一些复杂的数据关系和潜在信息挖掘不够深入等,为后续的改进提供思路。 (二)应用场景 1. 对于电商从业者:根据分析结果,制定合理的商品定价策略,参考市场价格分布和竞争对手价格;优化店铺运营,学习销售额领先店铺的经验,提高自身店铺的竞争力;根据消费者的反馈改进产品,提升产品质量和用户满意度。 2. 对于市场研究人员:深入了解智能手机市场的现状和趋势,为行业研究报告提供数据支持;分析不同品牌、不同价格段产品的市场份额和竞争态势,预测市场发展方向,为企业的市场进入和产品布局提供决策依据。 3. 对于消费者:在购买智能手机时,参考价格分布、店铺评价等信息,做出更明智的消费决策,选择性价比高、口碑好的产品。 七、注意事项与法律合规 1. 在进行网络爬虫时,要严格遵守电商平台的规则和相关法律法规。避免过度频繁地请求页面,以免对平台服务器造成压力或被视为恶意爬虫行为。 2. 尊重数据的所有权和隐私权,仅将采集到的数据用于合法的分析和研究目的,不得泄露或滥用数据。例如,不能将含有消费者个人信息的数据用于非法营销或其他不当用途。