这个淘宝商品数据分析系统是我在电商数据挖掘领域的一次实战尝试。作为一个完整的数据分析流水线,它实现了从数据采集、清洗存储到可视化分析和预测的全流程覆盖。不同于简单的数据报表工具,这套系统最大的特点是将Hadoop/Spark的大数据处理能力与Python机器学习生态无缝整合,为中小型电商企业提供了开箱即用的数据分析解决方案。
在实际业务场景中,电商运营者经常面临几个核心痛点:商品数据分散难以聚合、销售趋势缺乏直观展示、库存管理缺少数据支撑。我们这个系统通过三个技术层级的配合来解决这些问题:
数据采集层:采用Selenium模拟浏览器操作,绕过淘宝的反爬机制,定时抓取商品标题、价格、销量、地域分布等关键字段。相比传统requests爬虫,Selenium能更好地处理动态加载内容。
数据处理层:原始数据经过清洗后,一方面存入MySQL供实时查询,另一方面会定期导入HDFS进行批处理。我们使用Spark SQL对历史数据进行聚合分析,比如计算各品类的周环比增长率。
应用服务层:Django不仅提供REST API,还内置了机器学习模型服务。线性回归模型会每日训练更新,预测精度随数据积累不断提升。
提示:在实际部署时,建议将爬虫模块独立部署在分布式集群上,避免因IP封锁导致数据中断。我们项目中使用的是阿里云函数计算来实现分布式爬取。
虽然项目标题提到了Hadoop和Spark,但根据国内电商数据的实际规模,我们采用了混合架构:
这种分层设计避免了"杀鸡用牛刀"的资源浪费。例如在价格预测模块中:
python复制# Spark处理历史价格的代码片段
from pyspark.sql import functions as F
df = spark.read.parquet("hdfs://taobao/price_history")
price_trend = df.groupBy("category") \
.agg(F.avg("price").alias("avg_price"),
F.stddev("price").alias("price_std")) \
.cache()
价格预测模块采用改进的多元线性回归:
code复制销量预测 = α×价格 + β×包邮标志 + γ×地域系数 + δ×季节因子 + ε
其中季节因子通过傅里叶变换从历史数据中提取周期性特征。模型每晚会用Spark MLlib重新训练:
python复制from pyspark.ml.regression import LinearRegression
from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(
inputCols=["price", "free_shipping", "location_code"],
outputCol="features"
)
lr = LinearRegression(featuresCol="features", labelCol="sales")
pipeline = Pipeline(stages=[assembler, lr])
model = pipeline.fit(training_data)
前端采用Vue3 + Echarts 5的组合,其中有两个关键创新点:
javascript复制watch(() => route.query.province, (newVal) => {
if(newVal) loadCityData(newVal)
})
javascript复制function updateWordCloud(words) {
cloud().size([800, 400])
.words(words)
.rotate(() => ~~(Math.random() * 2) * 90)
.on("end", draw)
.start()
}
淘宝的反爬机制日益严格,我们通过以下策略保证爬取稳定性:
核心爬取逻辑:
python复制def parse_item(driver):
try:
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".price"))
)
price = driver.find_element(...).text
sales = driver.find_element(...).text
return {"price": clean_price(price), "sales": clean_sales(sales)}
except TimeoutException:
log_error("元素加载超时")
return None
MySQL表结构经过精心优化:
sql复制CREATE TABLE `products` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`title` VARCHAR(200) COLLATE utf8mb4_bin,
`price` DECIMAL(10,2) INDEX,
`sales` INT,
`location` VARCHAR(20) INDEX,
`category` VARCHAR(50) INDEX,
`crawl_time` DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
我们为常用查询字段建立了索引,并使用InnoDB压缩存储节省40%空间。
大屏采用响应式布局,关键配置项:
javascript复制// Echarts地图配置
const option = {
tooltip: {
formatter: params => `
<strong>${params.name}</strong><br/>
销售额: ${formatMoney(params.value[2])}<br/>
同比增长: ${params.value[3]}%
`
},
visualMap: {
type: 'piecewise',
pieces: [
{min: 1000000, label: '>100万'},
{min: 500000, max: 1000000},
// ...
]
}
}
我们采用Docker Compose编排服务:
yaml复制version: '3'
services:
django:
image: taobao-analytics-backend
ports: ["8000:8000"]
depends_on: [redis, mysql]
spark:
image: bitnami/spark:3.3
volumes: ["./spark-jobs:/jobs"]
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
数据库层面:
前端层面:
爬虫层面:
开发初期遇到Vue前端访问Django API的CORS问题,最终解决方案:
python复制# settings.py
CORS_ALLOWED_ORIGINS = [
"http://localhost:8080",
"https://your-production-domain.com"
]
CORS_EXPOSE_HEADERS = ['Content-Disposition']
当省级地图数据点超过5000个时出现卡顿,我们采用:
线上运行三个月后模型准确率下降15%,通过以下措施解决:
python复制# 模型版本控制示例
class PredictionModel(models.Model):
version = models.CharField(max_length=20)
created_at = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=False)
model_file = models.FileField(upload_to='models/')
这个项目从技术选型到最终上线历时4个月,最大的体会是:电商数据分析系统必须平衡实时性与准确性。我们通过混合架构既满足了运营人员的实时查询需求,又为战略决策提供了精准的历史趋势分析。特别值得一提的是,将Spark与Django整合的方案,为同类项目提供了可复用的技术范本。