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. 数据加载和初步检查:
import pandas as pd
import numpy as np

# 加载数据
df = pd.read_csv('./data/jd_products48.csv', encoding='utf-8-sig')# 查看数据基本信息print(df.info())print(df.describe())# 检查缺失值print(df.isnull().sum())
  1. 处理缺失值:
# 对于数值型列,用中位数填充缺失值
numeric_columns = df.select_dtypes(include=[np.number]).columns
for col in numeric_columns:
    df[col].fillna(df[col].median(), inplace=True)# 对于分类型列,用众数填充缺失值
categorical_columns = df.select_dtypes(include=['object']).columns
for col in categorical_columns:
    df[col].fillna(df[col].mode()[0], inplace=True)
  1. 数据类型转换:
# 将价格列转换为数值类型
df['价格']= df['价格'].str.replace('¥','').astype(float)# 将评论数转换为数值类型
df['评论数']= df['评论数'].str.replace('+','').str.replace('万','0000').astype(int)
  1. 特征工程:
# 创建新的特征:价格区间
df['价格区间']= pd.cut(df['价格'], bins=[0,1000,3000,5000,10000, np.inf], 
                    labels=['低端','中低端','中端','中高端','高端'])# 提取品牌信息
df['品牌']= df['商品名称'].str.split().str[0]# 创建是否是游戏本的标志
df['是否游戏本']= df['商品名称'].str.contains('游戏本|电竞').astype(int)
  1. 异常值处理:
# 使用 IQR 方法检测并处理异常值defremove_outliers(df, column):
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 -1.5* IQR
    upper_bound = Q3 +1.5* IQR
    df = df[(df[column]>= lower_bound)&(df[column]<= upper_bound)]return df

df = remove_outliers(df,'价格')
  1. 数据标准化:
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df['价格_标准化']= scaler.fit_transform(df[['价格']])
  1. 文本数据处理:
# 提取处理器信息
df['处理器类型']= df['处理器(CPU)'].str.extract('(i\d|锐龙)')# 提取内存大小
df['内存大小']= df['内存容量'].str.extract('(\d+)').astype(float)
  1. 数据去重:
df.drop_duplicates(subset='商品编号', keep='first', inplace=True)
  1. 保存处理后的数据:
df.to_csv('./data/jd_products_processed.csv', index=False, encoding='utf-8-sig')

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

在这里插入图片描述

Hadoop大数据分析

在这里插入图片描述

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

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

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

jd_flume.conf

# 定义源、通道和接收器
agent.sources = csv_source
agent.channels = memory_channel
agent.sinks = hive_sink

# 配置源(CSV文件)
agent.sources.csv_source.type = spooldir
agent.sources.csv_source.spoolDir = /user/hadoop/jd_data/
agent.sources.csv_source.fileHeader = true

# 配置通道
agent.channels.memory_channel.type = memory
agent.channels.memory_channel.capacity = 10000
agent.channels.memory_channel.transactionCapacity = 1000

# 配置接收器(Hive)
agent.sinks.hive_sink.type = hive
agent.sinks.hive_sink.hive.metastore = thrift://localhost:9083
agent.sinks.hive_sink.hive.database = jd_database
agent.sinks.hive_sink.hive.table = jd_products
agent.sinks.hive_sink.useLocalTimeStamp = true

# 将源和接收器与通道关联
agent.sources.csv_source.channels = memory_channel
agent.sinks.hive_sink.channel = memory_channel

然后,启动 Flume 代理:

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

首先,创建 Hive 表:

CREATETABLE jd_products (
    价格 FLOAT,
    名称 STRING,
    评论数 INT,
    店铺名 STRING,
    品牌 STRING,
    商品名称 STRING,
    商品编号 STRING,
    处理器 STRING,
    内存容量 STRING,
    硬盘容量 STRING,
    显卡 STRING,
    系统 STRING,
    价格区间 STRING,
    是否游戏本 INT)ROW FORMAT DELIMITED FIELDSTERMINATEDBY',' STORED AS TEXTFILE;

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

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

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

CREATETABLE jd_products (
    价格 FLOAT,
    名称 VARCHAR(255),
    评论数 INT,
    店铺名 VARCHAR(255),
    品牌 VARCHAR(255),
    商品名称 VARCHAR(255),
    商品编号 VARCHAR(255),
    处理器 VARCHAR(255),
    内存容量 VARCHAR(255),
    硬盘容量 VARCHAR(255),
    显卡 VARCHAR(255),
    系统 VARCHAR(255),
    价格区间 VARCHAR(50),
    是否游戏本 INT);

然后,使用 Sqoop 导出数据:

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 \
--input-fields-terminated-by ',' --input-lines-terminated-by '\n'
  1. 使用 ECharts 连接 MySQL 进行可视化:

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

<?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 进行可视化:

<!DOCTYPEhtml><html><head><title>JD产品数据分析</title><scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/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'));
        
        $.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
                },yAxis:{},series:[{name:'平均价格',type:'bar',data: prices
                }]};

            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的网购笔记本电脑大数据分析与可视化系统”的评论:

还没有评论