资源下载地址:https://download.csdn.net/download/sheziqiong/88483386
资源下载地址:https://download.csdn.net/download/sheziqiong/88483386
Python爬虫+spring-boot的前后端分离+echarts数据可视化
开发环境:
1、后端开发:PyCharm + idea
2、前端开发:Hbuilder
使用技术:
1、后端:spring-boot + Python
2、前端:echarts
该项目旨在通过Python爬虫技术、Spring Boot前后端分离框架和ECharts数据可视化工具,实现NBA球员数据的爬取、可视化和展示。首先,使用Python爬虫技术从NBA官方网站或其他数据源获取球员数据。然后,使用Spring Boot构建后端应用程序,处理数据并将其提供给前端。最后,使用ECharts在前端展示数据可视化图表,以便用户可以直观地查看和分析球员数据。该项目可以帮助篮球爱好者更好地了解和分析球员的表现,同时提供了一个展示现代Web应用程序开发技术的示例。
一、数据爬取
import requests
from bs4 import BeautifulSoup
import pymysql # 引用库
import parsel
print('连接到mysql服务器……')
db = pymysql.connect(host='localhost',
port=3306,
user='root',
passwd='123456',
db='python',
charset='utf8')
# host 主机名,port 端口,user 数据库用户名,password 数据库root用户的密码,db 数据库名
print("连接上了!")
# 创建游标(远程操作mysql)
cursor = db.cursor()
cursor.execute("DROP TABLE IF EXISTS nba_player")
sql = """CREATE TABLE `nba_player` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
`ranks` int DEFAULT NULL COMMENT '排名',
`player` varchar(255) DEFAULT NULL COMMENT '球员名称',
`team` varchar(255) DEFAULT NULL COMMENT '球队',
`score` float DEFAULT NULL COMMENT '得分',
`hit_shot` varchar(255) DEFAULT NULL COMMENT '命中出手',
`hit_rate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '命中率',
`hit_three` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '命中-三分',
`three_rate` varchar(255) DEFAULT NULL COMMENT '三分命中率',
`hit_penalty` varchar(255) DEFAULT NULL COMMENT '命中-罚球',
`penalty_rate` varchar(255) DEFAULT NULL COMMENT '罚球命中率',
`session` int DEFAULT NULL COMMENT '场次',
`playing_time` float DEFAULT NULL COMMENT '上场时间',
PRIMARY KEY (`id`)
)
"""
cursor.execute(sql)
# 正确的url地址 分析网页(伪装)
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}
# 爬取的链接
url = "https://nba.hupu.com/stats/players"
# 2.发送网络请求, request(css/re/requests)
response = requests.get(url=url, headers=headers)
response.encoding = "utf-8"
html_data = response.text
# 3.数据解析(进行数据的筛选)
# 3.1转换数据类型
selector = parsel.Selector(html_data)
trs = selector.xpath('//tbody/tr[not(@class="color_font1 bg_a")]')
i = 1
for tr in trs:
id = i
i += 1
rank = tr.xpath('./td[1]/text()').get() # 排名
player = tr.xpath('./td[2]/a/text()').get() # 球员
team = tr.xpath('./td[3]/a/text()').get() # 球队
score = tr.xpath('./td[4]/text()').get() # 得分
hit_shot = tr.xpath('./td[5]/text()').get() # 命中-出手
hit_rate = tr.xpath('./td[6]/text()').get() # 命中率
hit_three = tr.xpath('./td[7]/text()').get() # 命中-三分
three_rate = tr.xpath('./td[8]/text()').get() # 三分命中率
hit_penalty = tr.xpath('./td[9]/text()').get() # 命中-罚球
penalty_rate = tr.xpath('./td[10]/text()').get() # 罚球命中率
session = tr.xpath('./td[11]/text()').get() # 场次
playing_time = tr.xpath('./td[12]/text()').get() # 上场时间
insert = ("INSERT INTO `nba_player` VALUES (%s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)")
data = (
id, rank, player, team, score, hit_shot, hit_rate, hit_three, three_rate, hit_penalty, penalty_rate, session,
playing_time)
print(data)
cursor.execute(insert, data)
db.commit()
print(rank, player, team, score, hit_shot, hit_rate, hit_three,
three_rate, hit_penalty, penalty_rate, session, playing_time)
del i
print("爬取数据完成,存入数据库……")
cursor.close()
二、爬取的地址以及数据如下图所示:
三、爬取的数据如下
四、接口
@RestController
@RequestMapping("/player")
public class NbaPlayerController {
@RequestMapping("/rankingList")
public List<NbaPlayer> getRankingList() {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.last("limit 10");
List<NbaPlayer> nbaPlayers = nbaPlayerMapper.selectList(queryWrapper);
return nbaPlayers;
}
}
五、前端通过get方式请求数据库中的数据(部分示例)
var ec_left1 = echarts.init(document.getElementById("l1"), "dark")
$.get('http://localhost:8080/player/list', function (res) {
var names = []
var nums = []
for (var i = 0; i < res.length; i++) {
names.push(res[i].player);
nums.push(res[i].session);
}
ec_left1.setOption({
textStyle: {
color: 'white'
},
title: {
text: 'NBA球员出场次数',
left: "auto"
},
tooltip: {
trigger: 'axis'
},
legend: {
data: ['出场数']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: names
},
yAxis: {
type: 'value'
},
series: [
{
name: '出场数',
type: 'line',
stack: '总量',
data: nums
}
]
})
})
最终效果截图:
资源下载地址:https://download.csdn.net/download/sheziqiong/88483386
资源下载地址:https://download.csdn.net/download/sheziqiong/88483386