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

打印 上一主题 下一主题

主题 556|帖子 556|积分 1668

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

项目介绍

本项目首先通过爬虫获取京东电脑数据,爬虫比力OK,非常具有学习意义,数据可以不停地获取,智能化爬虫,遵守协议,属于良性获取数据。
然后举行数据预处置惩罚,将脏数据举行结构化处置惩罚,保证大数据Hadoop可以复用
采用Hadoop举行大数据分析 设计组件集群 hdfs HIve flume sqoop MySQL 等
末了使用Python调用Echarts 使用Pyecharts举行web可视化
数据收罗过程


  • 导入须要的库和设置:

    • 使用 Selenium 举行网页自动化
    • 使用 pandas 处置惩罚数据
    • 使用 time 模块举行延时操作

  • 初始化欣赏器:
    代码使用 Firefox 欣赏器举行爬取。
  • 界说辅助函数:

    • wait_until_text_disappears: 等候页面上的特定文本消失
    • scroll_to_bottom: 滚动到页面底部

  • 主爬取函数 scrape_jd_products:
    a. 处置惩罚登录 (仅在第一次运行时):

    • 打开登录页面
    • 输入用户名和密码
    • 点击登录按钮
    • 等候登录完成
    b. 打开商品列表页面:
       

    • 构造包罗页码的 URL
    • 打开页面并滚动到底部
    c. 遍历商品列表 (每页 30 个商品):
       

    • 找到全部商品列表项
    • 对每个商品:

      • 提取基本信息 (价格、名称)
      • 获取详情页 URL
      • 打开详情页
      • 提取更多详细信息 (批评数、店铺名、品牌、商品名称、商品编号等)
      • 返回列表页

    d. 处置惩罚验证码情况:
       

    • 假如碰到 “验证一下,购物无忧” 的提示,等候一段时间后刷新页面

  • 主循环:

    • 从第 1 页开始,爬取到第 200 页(京东一般只展示200页的数据,做分析已经足够了)
    • 每爬取一页,将数据生存到 CSV 文件
    • 初次生存时覆盖文件,之后追加数据

  • 数据生存:

    • 实时将数据生存到 CSV 文件
    • 末了将全部数据生存到 Excel 文件

  • 错误处置惩罚和非常捕获:

    • 使用 try-except 块处置惩罚大概出现的非常,确保纵然某些元素未找到,步伐也能继续运行

  • 延时和防反爬措施:

    • 在各个步骤中添加得当的延时,克制哀求过于频繁
    • 处置惩罚大概出现的验证码情况

这个爬虫的主要特点是:


  • 使用 Selenium 实现自动化,可以处置惩罚动态加载的内容
  • 可以或许处置惩罚登录流程
  • 分页爬取,可以获取大量数据
  • 实时生存数据,降低数据丢失风险
  • 具有一定的容错和非常处置惩罚本领
  • 思量了反爬措施,如处置惩罚验证码和添加延时
数据预处置惩罚


  • 数据加载和初步查抄:
  1. import pandas as pd
  2. import numpy as np
  3. # 加载数据
  4. df = pd.read_csv('./data/jd_products48.csv', encoding='utf-8-sig')
  5. # 查看数据基本信息
  6. print(df.info())
  7. print(df.describe())
  8. # 检查缺失值
  9. print(df.isnull().sum())
复制代码

  • 处置惩罚缺失值:
  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. # 对于分类型列,用众数填充缺失值
  6. categorical_columns = df.select_dtypes(include=['object']).columns
  7. for col in categorical_columns:
  8.     df[col].fillna(df[col].mode()[0], inplace=True)
复制代码

  • 数据范例转换:
  1. # 将价格列转换为数值类型
  2. df['价格'] = df['价格'].str.replace('¥', '').astype(float)
  3. # 将评论数转换为数值类型
  4. df['评论数'] = df['评论数'].str.replace('+', '').str.replace('万', '0000').astype(int)
复制代码

  • 特性工程:
  1. # 创建新的特征:价格区间
  2. df['价格区间'] = pd.cut(df['价格'], bins=[0, 1000, 3000, 5000, 10000, np.inf],
  3.                     labels=['低端', '中低端', '中端', '中高端', '高端'])
  4. # 提取品牌信息
  5. df['品牌'] = df['商品名称'].str.split().str[0]
  6. # 创建是否是游戏本的标志
  7. df['是否游戏本'] = df['商品名称'].str.contains('游戏本|电竞').astype(int)
复制代码

  • 非常值处置惩罚:
  1. # 使用 IQR 方法检测并处理异常值
  2. def remove_outliers(df, column):
  3.     Q1 = df[column].quantile(0.25)
  4.     Q3 = df[column].quantile(0.75)
  5.     IQR = Q3 - Q1
  6.     lower_bound = Q1 - 1.5 * IQR
  7.     upper_bound = Q3 + 1.5 * IQR
  8.     df = df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
  9.     return df
  10. df = remove_outliers(df, '价格')
复制代码

  • 数据标准化:
  1. from sklearn.preprocessing import StandardScaler
  2. scaler = StandardScaler()
  3. df['价格_标准化'] = scaler.fit_transform(df[['价格']])
复制代码

  • 文本数据处置惩罚:
  1. # 提取处理器信息
  2. df['处理器类型'] = df['处理器(CPU)'].str.extract('(i\d|锐龙)')
  3. # 提取内存大小
  4. 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大数据分析


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

  • 将数据上传到 HDFS:
  1. # 假设您的处理后的CSV文件位于本地的 /path/to/jd_products_processed.csv
  2. hadoop fs -put /path/to/jd_products_processed.csv /user/hadoop/jd_data/
复制代码

  • 使用 Flume 自动加载数据到 Hive:
首先,创建一个 Flume 设置文件 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
复制代码

  • Hive 大数据分析:
首先,创建 Hive 表:
  1. CREATE TABLE 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
  16. ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
复制代码
然后,举行一些示例分析:
  1. -- 各品牌的平均价格
  2. SELECT 品牌, AVG(价格) as 平均价格
  3. FROM jd_products
  4. GROUP BY 品牌
  5. ORDER BY 平均价格 DESC
  6. LIMIT 10;
  7. -- 各价格区间的商品数量
  8. SELECT 价格区间, COUNT(*) as 商品数量
  9. FROM jd_products
  10. GROUP BY 价格区间
  11. ORDER BY 商品数量 DESC;
  12. -- 游戏本vs非游戏本的平均价格
  13. SELECT 是否游戏本, AVG(价格) as 平均价格
  14. FROM jd_products
  15. GROUP BY 是否游戏本;
  16. -- 评论数最多的前10款产品
  17. SELECT 商品名称, 评论数
  18. FROM jd_products
  19. ORDER BY 评论数 DESC
  20. LIMIT 10;
复制代码

  • 使用 Sqoop 导出数据到 MySQL:
首先,在 MySQL 中创建目标表:
  1. CREATE TABLE 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
  16. );
复制代码
然后,使用 Sqoop 导出数据:
  1. sqoop export --connect jdbc:mysql://localhost:3306/jd_database \
  2. --username your_username --password your_password \
  3. --table jd_products --export-dir /user/hive/warehouse/jd_database.db/jd_products \
  4. --input-fields-terminated-by ',' --input-lines-terminated-by '\n'
复制代码

  • 使用 ECharts 毗连 MySQL 举行可视化:
首先,创建一个 PHP 文件来从 MySQL 获取数据并返回 JSON 格式:
  1. <?php
  2. $servername = "localhost";
  3. $username = "your_username";
  4. $password = "your_password";
  5. $dbname = "jd_database";
  6. $conn = new mysqli($servername, $username, $password, $dbname);
  7. if ($conn->connect_error) {
  8.     die("连接失败: " . $conn->connect_error);
  9. }
  10. $sql = "SELECT 品牌, AVG(价格) as 平均价格 FROM jd_products GROUP BY 品牌 ORDER BY 平均价格 DESC LIMIT 10";
  11. $result = $conn->query($sql);
  12. $data = array();
  13. while($row = $result->fetch_assoc()) {
  14.     $data[] = $row;
  15. }
  16. echo json_encode($data);
  17. $conn->close();
  18. ?>
复制代码
然后,创建一个 HTML 文件使用 ECharts 举行可视化:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>JD产品数据分析</title>
  5.     <script src="https://cdn.jsdelivr.net/npm/echarts@5.0.0/dist/echarts.min.js"></script>
  6.     <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  7. </head>
  8. <body>
  9.     <div id="main" style="width: 600px;height:400px;"></div>
  10.     <script type="text/javascript">
  11.         var myChart = echarts.init(document.getElementById('main'));
  12.         
  13.         $.get('get_data.php', function (data) {
  14.             var brands = data.map(item => item.品牌);
  15.             var prices = data.map(item => item.平均价格);
  16.             
  17.             var option = {
  18.                 title: {
  19.                     text: '各品牌平均价格'
  20.                 },
  21.                 tooltip: {},
  22.                 legend: {
  23.                     data:['平均价格']
  24.                 },
  25.                 xAxis: {
  26.                     data: brands
  27.                 },
  28.                 yAxis: {},
  29.                 series: [{
  30.                     name: '平均价格',
  31.                     type: 'bar',
  32.                     data: prices
  33.                 }]
  34.             };
  35.             myChart.setOption(option);
  36.         }, 'json');
  37.     </script>
  38. </body>
  39. </html>
复制代码
这个完整的流程涵盖了从数据上传到 HDFS、使用 Flume 加载到 Hive、举行 Hive 分析、使用 Sqoop 导出到 MySQL,末了使用 ECharts 举行可视化的整个过程。
可视化展示








每文一语

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表