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

news2024/11/25 0:57:07

文章目录

    • ==有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主==
      • 项目介绍
      • 数据采集过程
      • 数据预处理
      • 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 方法检测并处理异常值
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. 数据标准化:
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 表:

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;

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

-- 各品牌的平均价格
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 中创建目标表:

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 导出数据:

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

<!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 进行可视化的整个过程。

可视化展示

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

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

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

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

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

每文一语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】产生拷贝构造的三种形式

目录 用已存在的类对象去初始化同类另一个对象当函数类的形参是对象&#xff0c;调用函数形参和实参进行结合当函数的返回值是对象&#xff0c;函数执行完成返回调用者时 用已存在的类对象去初始化同类另一个对象 Date d1; Date d2(d1); Date d3 d2; //也会调用拷贝构造注意赋…

谷粒商城实战笔记-168-缓存-SpringCache-整合体验@Cacheable

文章目录 一&#xff0c;168-缓存-SpringCache-整合&体验Cacheable1&#xff0c;引入Spring Cache依赖2&#xff0c;配置3&#xff0c;启用cache4&#xff0c;在查询数据库的方法上加上注解Cacheable5&#xff0c;测试 二&#xff0c;169-缓存-SpringCache-Cacheable细节设…

LeetCode_sql_day16(601.体育馆的人流量)

描述&#xff1a;601. 体育馆的人流量 - 力扣&#xff08;LeetCode&#xff09; 编写解决方案找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。 返回按 visit_date 升序排列 的结果表。 输入Stadium表: ----------------------------- | id | visit_date | peop…

Linux系统移植——系统移植初步介绍(一)

一、嵌入式Linux系统软件组成及分布 1.1 内核&#xff08;Kernel&#xff09; 功能&#xff1a;负责管理硬件资源、进程调度、内存管理、文件系统、网络等。分布&#xff1a;通常是定制的Linux内核&#xff0c;以适应特定的硬件平台和应用需求。 1.2 根文件系统&#xff08;…

sql实验代码整理:创建表文件Student、Course、Sc完成下列问题

使用SQL语句创建数据库students. create database students; 创建表文件Student、Course、Sc&#xff0c;表结构如表3-7~表3-9所示。 代码及运行结果&#xff1a; 代码及运行结果&#xff1a; 代码及运行结果&#xff1a; 为表Student 添加地址列Address&#xff0c;数据类型为…

14.3 Matplotlib与Seaborn数据可视化

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

汽车保养系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;门店信息管理&#xff0c;员工信息管理&#xff0c;配件信息管理&#xff0c;保养信息管理&#xff0c;管理员管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页…

k8s部署ingress-nginx

一、拉取ingress-nginx的安装代码 地址&#xff1a;https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/cloud/deploy.yaml 如果上面的地址访问不通的话&#xff0c;可以直接使用下面的内容&#xff1a; 由于官方镜像存放…

Keepalived详解

目录 1、高可用集群keepalived 高可用集群 VRRP 相关概念 keepalived 简介 2、基础实验环境搭建 3、keepalived的虚拟路由管理 全局配置 ​编辑 配置虚拟路由器 4、虚拟路由的通讯设置 5、keepalived的日志分离 6、实现独立子配置文件 7、keepalived的抢占模式和非抢占…

ubuntu 20 安装mysql workbench 过程

ubuntu 20 安装mysql workbench 过程_ubuntu 安装mysql workbench-CSDN博客 How To Install And Use MySQL Workbench On Ubuntu 18.04 or 20.04 MySQL :: Begin Your Download sudo apt install ./mysql-apt-config_0.8.32-1_all.deb snap install mysql-workbench-communi…

【鸿蒙学习】HarmonyOS应用开发者基础 - 从简单的页面开始

学完时间&#xff1a;2024年8月13日 我的纸飞机呀&#xff01;飞呀飞&#xff01;飞到了代码中&#xff01;&#xff01;&#xff01; 一、前言叨叨 今天是HarmonyOS学习教学课第一课的第五课内容了&#xff0c;课后练习的人数已经降到了4150人了&#xff0c;预测下到 ”Harmon…

Win10 去掉桌面右上角 了解有关此图片的信息

1. 进入注册表 Win R运行regedit 2. 找到以下路径 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel 3. 新建 DWORD&#xff08;32位&#xff09;值&#xff08;D&#xff09; 右击 NewStartPanel新建 DWORD…

前端技术day01-HTML入门

一、前端介绍 技术描述HTML用于构建网站的基础结构的CSS用于美化页面的&#xff0c;作用和化妆或者整容作用一样JS实现网页和用户的交互Vue主要用于将数据填充到html页面上的Element主要提供了一些非常美观的组件 二、工具软件 VsCode 在前端领域&#xff0c;有一个公认好用…

C语言问答进阶--6、函数(1)

A&#xff1a;现在我们将研究函数这个概念。 其实这个概念很简单&#xff0c;和中学的时候学的yf(x)来对照着看&#xff0c;对于一个参数x&#xff0c;会得到一个值y&#xff0c;就会发现它和C中的函数是一个道理。 只是C函数中可以包含不传入任何参数的函数。 A&#xff1a;函…

自学嵌入式第十九天高级编程篇 文件2

标准IO的返回值判断 feof&#xff1a;判断文件流指针是否到达结尾。 feof(src) //如果文件流指针到达末尾&#xff0c;函数返回值为真 ferror&#xff1a;判断文件流指针是否出错。搭配clearerr使用可以跳过报错的地方&#xff0c;读取后面的数据 ferror(src) //如…

短视频SDK解决方案,良好的二次开发可扩展性

短视频已成为当代社交与内容消费的重要载体&#xff0c;其影响力与日俱增&#xff0c;面对这一蓬勃发展的市场&#xff0c;如何高效、创新地打造短视频应用&#xff0c;成为众多开发者和企业的核心关切。在此背景下&#xff0c;美摄科技凭借其深厚的技术积累与前瞻性的市场洞察…

奇异值分解(SVD)

1 奇异值分解(SVD)简介 Beltrami 和 Jordan 被认为是奇异值分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;的共同开创者&#xff0c;二人于19世纪70年代相继提出了相关理论。奇异值分解主要解决的问题是数据降维。在高维度的数据中&#xff0c;数据…

什么是流批一体?怎样理解流批一体?

目录 一、流式处理与批量处理概述 1.流式处理 2.批量处理 3.流批一体的定义 二、流批一体的关键特点 三、流批一体的技术实现 四、应用场景 五、实施流批一体的考虑因素 流批一体听起来很简单&#xff0c;但内涵却十分复杂。它包含了计算语义、编程模型、API、调度、执行、shuf…

Halcon玩转机器视觉专栏特殊声明

欢迎来到 PaQiuQiu 的空间 本文为【Halcon玩转机器视觉专栏特殊声明】&#xff0c;方便大家更合理的订阅! &#x1f4e2; ~特殊声明~ 鉴于很多童鞋在订阅专栏过程中&#xff0c;对于专栏中涉及到的资料&#xff08;比如中文学习手册&#xff09;和源码&#xff08;C#联合Halco…

背包九讲(动态规划)

文章目录 01背包问题题目描述解题思路&#xff1a;上代码&#xff1a;思路2&#xff1a;二维代码&#xff1a;优化代码&#xff1a; 完全背包问题题目描述&#xff1a;解题思路&#xff1a;二维代码&#xff1a;优化代码&#xff1a; 多重背包问题题目描述&#xff1a;解题思路…