基于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. 数据加载和初步检查:
python 复制代码
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. 处理缺失值:
python 复制代码
# 对于数值型列,用中位数填充缺失值
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. 数据类型转换:
python 复制代码
# 将价格列转换为数值类型
df['价格'] = df['价格'].str.replace('¥', '').astype(float)

# 将评论数转换为数值类型
df['评论数'] = df['评论数'].str.replace('+', '').str.replace('万', '0000').astype(int)
  1. 特征工程:
python 复制代码
# 创建新的特征:价格区间
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. 异常值处理:
python 复制代码
# 使用 IQR 方法检测并处理异常值
def remove_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. 数据标准化:
python 复制代码
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df['价格_标准化'] = scaler.fit_transform(df[['价格']])
  1. 文本数据处理:
python 复制代码
# 提取处理器信息
df['处理器类型'] = df['处理器(CPU)'].str.extract('(i\d|锐龙)')

# 提取内存大小
df['内存大小'] = df['内存容量'].str.extract('(\d+)').astype(float)
  1. 数据去重:
python 复制代码
df.drop_duplicates(subset='商品编号', keep='first', inplace=True)
  1. 保存处理后的数据:
python 复制代码
df.to_csv('./data/jd_products_processed.csv', index=False, encoding='utf-8-sig')

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

Hadoop大数据分析

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

  1. 将数据上传到 HDFS:
bash 复制代码
# 假设您的处理后的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 代理:

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

首先,创建 Hive 表:

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

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

sql 复制代码
-- 各品牌的平均价格
SELECT 品牌, AVG(价格) as 平均价格
FROM jd_products
GROUP BY 品牌
ORDER BY 平均价格 DESC
LIMIT 10;

-- 各价格区间的商品数量
SELECT 价格区间, COUNT(*) as 商品数量
FROM jd_products
GROUP BY 价格区间
ORDER BY 商品数量 DESC;

-- 游戏本vs非游戏本的平均价格
SELECT 是否游戏本, AVG(价格) as 平均价格
FROM jd_products
GROUP BY 是否游戏本;

-- 评论数最多的前10款产品
SELECT 商品名称, 评论数
FROM jd_products
ORDER BY 评论数 DESC
LIMIT 10;
  1. 使用 Sqoop 导出数据到 MySQL:

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

sql 复制代码
CREATE TABLE 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 导出数据:

bash 复制代码
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 复制代码
<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "jd_database";

$conn = new mysqli($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;
}

echo json_encode($data);

$conn->close();
?>

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

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>JD产品数据分析</title>
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.0.0/dist/echarts.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div id="main" style="width: 600px;height:400px;"></div>
    <script type="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 进行可视化的整个过程。

可视化展示



每文一语

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

相关推荐
计算机编程小咖6 小时前
《基于大数据的农产品交易数据分析与可视化系统》选题不当,毕业答辩可能直接挂科
java·大数据·hadoop·python·数据挖掘·数据分析·spark
haidizym7 小时前
质谱数据分析环节体系整理
大数据·人工智能·数据分析·ai4s
khystal12 小时前
HUMS 2023齿轮箱数据分析
数据库·数据分析·信号处理
海绵宝宝汉堡包14 小时前
数据分析专栏记录之 -基础数学与统计知识 2 概率论基础与python
python·数据分析·概率论
没有梦想的咸鱼185-1037-166316 小时前
AI大模型支持下的:CMIP6数据分析与可视化、降尺度技术与气候变化的区域影响、极端气候分析
人工智能·python·深度学习·机器学习·chatgpt·数据挖掘·数据分析
WSSWWWSSW17 小时前
Seaborn数据可视化实战:Seaborn多变量图表绘制高级教程
python·信息可视化·数据分析·matplotlib·seaborn
晴友读钟17 小时前
Windows 笔记本实现仅关屏仍工作:一种更便捷的 “伪熄屏” 方案
电脑
广药门徒18 小时前
有无符号数在微机、计算机等真正执行的逻辑,如何区分,如何计算,如何输出
电脑
码界筑梦坊19 小时前
173-基于Flask的微博舆情数据分析系统
后端·python·数据分析·flask·毕业设计
人大博士的交易之路20 小时前
龙虎榜——20250822
大数据·数据挖掘·数据分析·缠中说禅·龙虎榜·道琼斯结构