有需要本项目标代码或文档以及全部资源,或者部署调试可以私信博主
项目介绍
本项目首先通过爬虫获取京东电脑数据,爬虫比力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. 打开商品列表页面:
c. 遍历商品列表 (每页 30 个商品):
- 找到全部商品列表项
- 对每个商品:
- 提取基本信息 (价格、名称)
- 获取详情页 URL
- 打开详情页
- 提取更多详细信息 (批评数、店铺名、品牌、商品名称、商品编号等)
- 返回列表页
d. 处置惩罚验证码情况:
- 假如碰到 “验证一下,购物无忧” 的提示,等候一段时间后刷新页面
- 主循环:
- 从第 1 页开始,爬取到第 200 页(京东一般只展示200页的数据,做分析已经足够了)
- 每爬取一页,将数据生存到 CSV 文件
- 初次生存时覆盖文件,之后追加数据
- 数据生存:
- 实时将数据生存到 CSV 文件
- 末了将全部数据生存到 Excel 文件
- 错误处置惩罚和非常捕获:
- 使用 try-except 块处置惩罚大概出现的非常,确保纵然某些元素未找到,步伐也能继续运行
- 延时和防反爬措施:
- 在各个步骤中添加得当的延时,克制哀求过于频繁
- 处置惩罚大概出现的验证码情况
这个爬虫的主要特点是:
- 使用 Selenium 实现自动化,可以处置惩罚动态加载的内容
- 可以或许处置惩罚登录流程
- 分页爬取,可以获取大量数据
- 实时生存数据,降低数据丢失风险
- 具有一定的容错和非常处置惩罚本领
- 思量了反爬措施,如处置惩罚验证码和添加延时
数据预处置惩罚
- 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())
复制代码- # 对于数值型列,用中位数填充缺失值
- 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)
复制代码- # 将价格列转换为数值类型
- df['价格'] = df['价格'].str.replace('¥', '').astype(float)
- # 将评论数转换为数值类型
- df['评论数'] = df['评论数'].str.replace('+', '').str.replace('万', '0000').astype(int)
复制代码- # 创建新的特征:价格区间
- 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)
复制代码- # 使用 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, '价格')
复制代码- from sklearn.preprocessing import StandardScaler
- scaler = StandardScaler()
- df['价格_标准化'] = scaler.fit_transform(df[['价格']])
复制代码- # 提取处理器信息
- df['处理器类型'] = df['处理器(CPU)'].str.extract('(i\d|锐龙)')
- # 提取内存大小
- df['内存大小'] = df['内存容量'].str.extract('(\d+)').astype(float)
复制代码- df.drop_duplicates(subset='商品编号', keep='first', inplace=True)
复制代码- df.to_csv('./data/jd_products_processed.csv', index=False, encoding='utf-8-sig')
复制代码 这个数据预处置惩罚过程包罗了处置惩罚缺失值、数据范例转换、特性工程、非常值处置惩罚、数据标准化、文本数据处置惩罚和数据去重等步骤。这些步骤可以或许帮助清理原始数据,并为后续的数据分析和建模做好准备。根据实际数据的特点和分析需求,您大概需要调整或添加一些特定的预处置惩罚步骤。
Hadoop大数据分析
下面只是一个案例过程,真正的代码如上图所示,脚本已经封装好了,一键化运行
- # 假设您的处理后的CSV文件位于本地的 /path/to/jd_products_processed.csv
- hadoop fs -put /path/to/jd_products_processed.csv /user/hadoop/jd_data/
复制代码 首先,创建一个 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
复制代码 首先,创建 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;
复制代码 首先,在 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'
复制代码
- 使用 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 举行可视化的整个过程。
可视化展示
每文一语
每一次的注解都是最好的回忆教科书
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |