0


基于Hadoop的网购笔记本电脑大数据分析与可视化系统

文章目录

有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主

项目介绍

本项目首先通过爬虫获取京东电脑数据,爬虫比较OK,十分具有学习意义,数据可以不断地获取,智能化爬虫,遵守协议,属于良性获取数据。

然后进行数据预处理,将脏数据进行结构化处理,保证大数据Hadoop可以复用

采用Hadoop进行大数据分析 设计组件集群 hdfs HIve flume sqoop MySQL 等

最后利用Python调用Echarts 使用Pyecharts进行web可视化

数据采集过程

  1. 导入必要的库和设置:- 使用 Selenium 进行网页自动化- 使用 pandas 处理数据- 使用 time 模块进行延时操作
  2. 初始化浏览器: 代码使用 Firefox 浏览器进行爬取。
  3. 定义辅助函数:- wait_until_text_disappears: 等待页面上的特定文本消失- scroll_to_bottom: 滚动到页面底部
  4. 主爬取函数 scrape_jd_products: a. 处理登录 (仅在第一次运行时):- 打开登录页面- 输入用户名和密码- 点击登录按钮- 等待登录完成b. 打开商品列表页面:- 构造包含页码的 URL- 打开页面并滚动到底部c. 遍历商品列表 (每页 30 个商品):- 找到所有商品列表项- 对每个商品: - 提取基本信息 (价格、名称)- 获取详情页 URL- 打开详情页- 提取更多详细信息 (评论数、店铺名、品牌、商品名称、商品编号等)- 返回列表页d. 处理验证码情况:- 如果遇到 “验证一下,购物无忧” 的提示,等待一段时间后刷新页面
  5. 主循环:- 从第 1 页开始,爬取到第 200 页(京东一般只展示200页的数据,做分析已经足够了)- 每爬取一页,将数据保存到 CSV 文件- 首次保存时覆盖文件,之后追加数据
  6. 数据保存:- 实时将数据保存到 CSV 文件- 最后将所有数据保存到 Excel 文件
  7. 错误处理和异常捕获:- 使用 try-except 块处理可能出现的异常,确保即使某些元素未找到,程序也能继续运行
  8. 延时和防反爬措施:- 在各个步骤中添加适当的延时,避免请求过于频繁- 处理可能出现的验证码情况

这个爬虫的主要特点是:

  • 使用 Selenium 实现自动化,可以处理动态加载的内容
  • 能够处理登录流程
  • 分页爬取,可以获取大量数据
  • 实时保存数据,降低数据丢失风险
  • 具有一定的容错和异常处理能力
  • 考虑了反爬措施,如处理验证码和添加延时

数据预处理

  1. 数据加载和初步检查:
  1. import pandas as pd
  2. import numpy as np
  3. # 加载数据
  4. df = pd.read_csv('./data/jd_products48.csv', encoding='utf-8-sig')# 查看数据基本信息print(df.info())print(df.describe())# 检查缺失值print(df.isnull().sum())
  1. 处理缺失值:
  1. # 对于数值型列,用中位数填充缺失值
  2. numeric_columns = df.select_dtypes(include=[np.number]).columns
  3. for col in numeric_columns:
  4. df[col].fillna(df[col].median(), inplace=True)# 对于分类型列,用众数填充缺失值
  5. categorical_columns = df.select_dtypes(include=['object']).columns
  6. for col in categorical_columns:
  7. df[col].fillna(df[col].mode()[0], inplace=True)
  1. 数据类型转换:
  1. # 将价格列转换为数值类型
  2. df['价格']= df['价格'].str.replace('¥','').astype(float)# 将评论数转换为数值类型
  3. df['评论数']= df['评论数'].str.replace('+','').str.replace('万','0000').astype(int)
  1. 特征工程:
  1. # 创建新的特征:价格区间
  2. df['价格区间']= pd.cut(df['价格'], bins=[0,1000,3000,5000,10000, np.inf],
  3. labels=['低端','中低端','中端','中高端','高端'])# 提取品牌信息
  4. df['品牌']= df['商品名称'].str.split().str[0]# 创建是否是游戏本的标志
  5. df['是否游戏本']= df['商品名称'].str.contains('游戏本|电竞').astype(int)
  1. 异常值处理:
  1. # 使用 IQR 方法检测并处理异常值defremove_outliers(df, column):
  2. Q1 = df[column].quantile(0.25)
  3. Q3 = df[column].quantile(0.75)
  4. IQR = Q3 - Q1
  5. lower_bound = Q1 -1.5* IQR
  6. upper_bound = Q3 +1.5* IQR
  7. df = df[(df[column]>= lower_bound)&(df[column]<= upper_bound)]return df
  8. df = remove_outliers(df,'价格')
  1. 数据标准化:
  1. from sklearn.preprocessing import StandardScaler
  2. scaler = StandardScaler()
  3. df['价格_标准化']= scaler.fit_transform(df[['价格']])
  1. 文本数据处理:
  1. # 提取处理器信息
  2. df['处理器类型']= df['处理器(CPU)'].str.extract('(i\d|锐龙)')# 提取内存大小
  3. df['内存大小']= df['内存容量'].str.extract('(\d+)').astype(float)
  1. 数据去重:
  1. df.drop_duplicates(subset='商品编号', keep='first', inplace=True)
  1. 保存处理后的数据:
  1. df.to_csv('./data/jd_products_processed.csv', index=False, encoding='utf-8-sig')

这个数据预处理过程包括了处理缺失值、数据类型转换、特征工程、异常值处理、数据标准化、文本数据处理和数据去重等步骤。这些步骤能够帮助清理原始数据,并为后续的数据分析和建模做好准备。根据实际数据的特点和分析需求,您可能需要调整或添加一些特定的预处理步骤。

在这里插入图片描述

Hadoop大数据分析

在这里插入图片描述

下面只是一个案例过程,真正的代码如上图所示,脚本已经封装好了,一键化运行

  1. 将数据上传到 HDFS:
  1. # 假设您的处理后的CSV文件位于本地的 /path/to/jd_products_processed.csv
  2. hadoop fs -put /path/to/jd_products_processed.csv /user/hadoop/jd_data/
  1. 使用 Flume 自动加载数据到 Hive:

首先,创建一个 Flume 配置文件

  1. jd_flume.conf

  1. # 定义源、通道和接收器
  2. agent.sources = csv_source
  3. agent.channels = memory_channel
  4. agent.sinks = hive_sink
  5. # 配置源(CSV文件)
  6. agent.sources.csv_source.type = spooldir
  7. agent.sources.csv_source.spoolDir = /user/hadoop/jd_data/
  8. agent.sources.csv_source.fileHeader = true
  9. # 配置通道
  10. agent.channels.memory_channel.type = memory
  11. agent.channels.memory_channel.capacity = 10000
  12. agent.channels.memory_channel.transactionCapacity = 1000
  13. # 配置接收器(Hive)
  14. agent.sinks.hive_sink.type = hive
  15. agent.sinks.hive_sink.hive.metastore = thrift://localhost:9083
  16. agent.sinks.hive_sink.hive.database = jd_database
  17. agent.sinks.hive_sink.hive.table = jd_products
  18. agent.sinks.hive_sink.useLocalTimeStamp = true
  19. # 将源和接收器与通道关联
  20. agent.sources.csv_source.channels = memory_channel
  21. agent.sinks.hive_sink.channel = memory_channel

然后,启动 Flume 代理:

  1. flume-ng agent --conf-file jd_flume.conf --name agent -Dflume.root.logger=INFO,console
  1. Hive 大数据分析:

首先,创建 Hive 表:

  1. CREATETABLE jd_products (
  2. 价格 FLOAT,
  3. 名称 STRING,
  4. 评论数 INT,
  5. 店铺名 STRING,
  6. 品牌 STRING,
  7. 商品名称 STRING,
  8. 商品编号 STRING,
  9. 处理器 STRING,
  10. 内存容量 STRING,
  11. 硬盘容量 STRING,
  12. 显卡 STRING,
  13. 系统 STRING,
  14. 价格区间 STRING,
  15. 是否游戏本 INT)ROW FORMAT DELIMITED FIELDSTERMINATEDBY',' STORED AS TEXTFILE;

然后,进行一些示例分析:

  1. -- 各品牌的平均价格SELECT 品牌,AVG(价格)as 平均价格
  2. FROM jd_products
  3. GROUPBY 品牌
  4. ORDERBY 平均价格 DESCLIMIT10;-- 各价格区间的商品数量SELECT 价格区间,COUNT(*)as 商品数量
  5. FROM jd_products
  6. GROUPBY 价格区间
  7. ORDERBY 商品数量 DESC;-- 游戏本vs非游戏本的平均价格SELECT 是否游戏本,AVG(价格)as 平均价格
  8. FROM jd_products
  9. GROUPBY 是否游戏本;-- 评论数最多的前10款产品SELECT 商品名称, 评论数
  10. FROM jd_products
  11. ORDERBY 评论数 DESCLIMIT10;
  1. 使用 Sqoop 导出数据到 MySQL:

首先,在 MySQL 中创建目标表:

  1. CREATETABLE jd_products (
  2. 价格 FLOAT,
  3. 名称 VARCHAR(255),
  4. 评论数 INT,
  5. 店铺名 VARCHAR(255),
  6. 品牌 VARCHAR(255),
  7. 商品名称 VARCHAR(255),
  8. 商品编号 VARCHAR(255),
  9. 处理器 VARCHAR(255),
  10. 内存容量 VARCHAR(255),
  11. 硬盘容量 VARCHAR(255),
  12. 显卡 VARCHAR(255),
  13. 系统 VARCHAR(255),
  14. 价格区间 VARCHAR(50),
  15. 是否游戏本 INT);

然后,使用 Sqoop 导出数据:

  1. sqoop export--connect jdbc:mysql://localhost:3306/jd_database \--username your_username --password your_password \--table jd_products --export-dir /user/hive/warehouse/jd_database.db/jd_products \
  2. --input-fields-terminated-by ',' --input-lines-terminated-by '\n'
  1. 使用 ECharts 连接 MySQL 进行可视化:

首先,创建一个 PHP 文件来从 MySQL 获取数据并返回 JSON 格式:

  1. <?php$servername="localhost";$username="your_username";$password="your_password";$dbname="jd_database";$conn=newmysqli($servername,$username,$password,$dbname);if($conn->connect_error){die("连接失败: ".$conn->connect_error);}$sql="SELECT 品牌, AVG(价格) as 平均价格 FROM jd_products GROUP BY 品牌 ORDER BY 平均价格 DESC LIMIT 10";$result=$conn->query($sql);$data=array();while($row=$result->fetch_assoc()){$data[]=$row;}echojson_encode($data);$conn->close();?>

然后,创建一个 HTML 文件使用 ECharts 进行可视化:

  1. <!DOCTYPEhtml><html><head><title>JD产品数据分析</title><scriptsrc="https://cdn.jsdelivr.net/npm/echarts@5.0.0/dist/echarts.min.js"></script><scriptsrc="https://code.jquery.com/jquery-3.6.0.min.js"></script></head><body><divid="main"style="width: 600px;height:400px;"></div><scripttype="text/javascript">var myChart = echarts.init(document.getElementById('main'));
  2. $.get('get_data.php',function(data){var brands = data.map(item=> item.品牌);var prices = data.map(item=> item.平均价格);var option ={title:{text:'各品牌平均价格'},tooltip:{},legend:{data:['平均价格']},xAxis:{data: brands
  3. },yAxis:{},series:[{name:'平均价格',type:'bar',data: prices
  4. }]};
  5. myChart.setOption(option);},'json');</script></body></html>

这个完整的流程涵盖了从数据上传到 HDFS、使用 Flume 加载到 Hive、进行 Hive 分析、使用 Sqoop 导出到 MySQL,最后使用 ECharts 进行可视化的整个过程。

可视化展示

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述

每文一语

每一次的注解都是最好的回忆教科书


本文转载自: https://blog.csdn.net/weixin_47723732/article/details/141137490
版权归原作者 王小王-123 所有, 如有侵权,请联系我们删除。

“基于Hadoop的网购笔记本电脑大数据分析与可视化系统”的评论:

还没有评论