电商商品数据分析项目
电商商品数据分析工具:跨平台数据爬取与可视化实践
花了些时间做了一个电商平台商品数据分析的小项目,主要功能是从TaoBao、JingDong、PinDuoDuo三个平台爬取指定商品的价格和销量数据,然后进行可视化分析并保存到数据库。今天想分享一下这个项目的开发思路和实现过程,希望能给同样对数据爬取和分析感兴趣的朋友一些参考。
项目背景与目标
做这个项目的初衷很简单:现在电商平台太多,想快速了解同一商品在不同平台的价格差异和销售情况,手动去一个个平台查太麻烦了。于是就想能不能做一个工具,自动爬取这些数据并生成直观的分析图表。
项目的核心目标有三个:
- 自动从主流电商平台爬取商品数据(价格、销量)
- 对爬取的数据进行可视化分析,直观展示各平台差异
- 将数据持久化存储,方便后续分析
技术栈选择
考虑到爬取电商网站需要处理动态页面和登录问题,数据分析需要便捷的处理库,最终选择了这些技术:
- 爬虫核心:Selenium(处理动态加载和登录)+ BeautifulSoup(解析HTML)
- 数据分析:Pandas(数据处理)
- 可视化:Matplotlib(生成图表)
- 数据库:MySQL(数据存储)
- 开发语言:Python(生态丰富,库支持完善)
核心功能实现
1. 统一的爬虫架构设计
我设计了一个ECommerceScraper类作为核心,把各个平台的爬取逻辑封装起来,这样既保证了代码的整洁,也方便后续扩展更多平台。
class ECommerceScraper:
def __init__(self, db_config=None):
# 数据库配置初始化
self.db_config = db_config or {
'host': 'localhost',
'user': 'root',
'password': '123456',
'database': 'product_data'
}
self.driver = None
2. 多平台数据爬取实现
不同平台的页面结构差异很大,需要针对性处理:
- TaoBao/JingDong:需要登录才能获取完整数据,所以采用非无头模式启动浏览器,预留60秒时间让用户扫码登录
- PinDuoDuo:移动端页面结构更简单,选择爬取移动端页面,不需要登录
以淘宝爬取为例,核心逻辑是:
- 初始化浏览器并打开搜索页面
- 等待用户登录
- 滚动页面加载更多商品
- 解析页面提取价格和销量
- 统一数据格式返回
def get_taobao_data(self, keyword='huaweipurax', max_items=10):
print("开始爬取淘宝数据...")
self.init_driver(headless=False) # 淘宝需要登录,不使用无头模式
try:
url = f"https://s.taobao.com/search?q={keyword}"
self.driver.get(url)
# 等待用户扫码登录
print("请在60秒内扫码登录...")
WebDriverWait(self.driver, 60).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'div.doubleCard--gO3Bz6bu'))
)
# 滚动加载更多商品
for _ in range(3):
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
# 解析数据...
销量数据的处理比较有意思,不同平台的展示格式不同(比如"1万+"需要转换为10000),需要做特殊处理:
# 处理销量文本(如"1万+"转换为10000)
if '万' in sales_text:
sales = float(''.join(filter(str.isdigit, sales_text))) * 10000
else:
sales = float(''.join(filter(str.isdigit, sales_text)))
3. 数据可视化分析
爬取到数据后,用Matplotlib生成了两种图表:
- 各平台平均价格柱状图
- 平均价格与总销量双轴对比图
这样可以直观地看出价格和销量之间的关系,比如某个平台价格低但销量高,或者价格高但销量也不错的情况。
def visualize_data(self, df):
# 图表生成逻辑...
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# 柱状图展示平均价格
# 双轴图展示价格与销量关系
plt.savefig('ecommerce_analysis_updated.png', dpi=300)
plt.show()
4. 数据持久化
为了方便后续分析,实现了两种数据保存方式:
- 保存到MySQL数据库(自动创建数据库和表)
- 导出为CSV文件(带时间戳,避免重名)
数据库操作部分做了异常处理,确保连接会被正确关闭:
def save_to_mysql(self, data_list):
if not data_list:
print("没有数据需要保存")
return
try:
self.create_database_table() # 自动创建表结构
conn = pymysql.connect(**self.db_config)
cursor = conn.cursor()
# 批量插入数据
insert_query = "INSERT INTO products (platform, price, sales) VALUES (%s, %s, %s)"
records = [(item['platform'], item['price'], item['sales']) for item in data_list]
cursor.executemany(insert_query, records)
conn.commit()
except pymysql.Error as e:
print(f"保存数据到数据库时出错: {e}")
finally:
if conn:
conn.close()
5. 灵活的使用方式
为了方便不同用户使用,支持两种参数输入方式:
- 命令行参数(适合熟悉命令行的用户)
- 交互式输入(适合新手用户)
# 命令行参数处理
parser = argparse.ArgumentParser(description="电商平台商品数据采集分析工具")
parser.add_argument('--host', help='数据库主机地址')
parser.add_argument('--keyword', help='商品关键词')
# 更多参数...
# 交互式输入
host = args.host if args.host else input("请输入数据库主机地址 (默认 localhost): ") or 'localhost'
遇到的问题与解决方案
1.反爬机制 :PinDuoDuo对爬虫比较敏感,多次爬取可能会被限制。解决方案是添加合理的请求间隔,模拟真实用户行为。
2.页面结构变化 :电商平台经常会调整页面结构,导致选择器失效。解决方案是在代码中加入异常处理,即使某个字段解析失败也不会影响整体运行。
3.登录状态维持 :TaoBao和JingDong的登录状态有时会过期,需要重新扫码。目前采用的是每次运行都重新登录的方式,后续可以考虑加入Cookie持久化。
项目使用效果
运行程序后,会自动完成:
- 打开浏览器爬取三个平台的数据
- 在控制台显示爬取的数据
- 生成可视化图表并显示
- 保存数据到数据库和CSV文件
比如搜索"huaweipurax",会得到各平台的价格对比和销量分析,从图中可以很直观地看出哪个平台的价格更有优势,哪个平台的销量更好。
总结
这个项目虽然不算复杂,但涵盖了数据爬取、处理、可视化和存储的完整流程,非常适合作为Python数据分析的练手项目。通过这个项目,我对Selenium的使用、数据解析和可视化都有了更深入的理解。
如果你也想做类似的项目,建议从一个平台开始,逐步扩展,遇到问题时多查看官方文档和社区讨论。爬虫项目经常会因为网站更新而失效,保持代码的可维护性和可扩展性很重要。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)