爬取NBA球员信息并可视化小白入门

news/2025/1/23 17:37:26/

网址:虎扑体育-NBA球员得分数据排行 第1页

步骤:

  1. 分析页面 确定URL地址
  2. 模拟浏览器向服务器发送请求
  3. 数据解析 提取想要的数据
  4. 保存数据
爬虫所需要的模块
requests(发送HTTP请求)parsel(解析HTML内容)
pandas(数据保存模块)

第一步分析页面 --确定是静态页面还是动态页面
右击点击 查看网页源代码 在新窗口中搜索(Ctrl+F)我们所需要的数据

通过分析可得 此网站为静态页面  URL地址为浏览器栏中的地址

接着我们构建基本的爬虫程序 模拟浏览器 向服务器发送请求 


 

 因为此网站没有反爬虫机制 基本的浏览器伪装都不需要即可直接获取到数据

python"># 导包  需要通过pip install 包名下载
import requests
# 发送网络请求的地址
url = 'https://nba.hupu.com/stats/players'
resp = requests.get(url)
# 调用对象里面的属性 获取到返回的文本数据
print(resp.text)

确认爬取下来中的页面数据中有我们所需要的数据

Ctrl+F 快捷键打开搜索框 查看数据

然后提取我们想要的数据  点击元素面板  分析数据所在的结构

分析可得 我们要取tbody下面没有class属性color_font1 bg_a 的tr
 

python">#导包 parsel
# 实例化一个浏览器对象
selector = parsel.Selector(resp.text)
# 拿到所有的tr
lis = selector.xpath("//tbody/tr[not(@class='color_font1 bg_a')]")

接着按照元素面板的结构取值  遍历所有的tr

球员:  class属性等于left下面的a标签中的文本

球队名字:从根标签中开始写Xpath  css不好匹配
得分: class属性等于bg_b的td 中的文本

下面的数据 通过xpath 取 发现是tr标签下5-12个

python">for li in lis:name = li.css('.left a::text').get()team = li.xpath('./td[3]/a/text()').get()score = li.css('.bg_b::text').get() hit_shot = li.xpath('./td[5]/text()').get()hit_rate = li.xpath('./td[6]/text()').get()hit_three = li.xpath('./td[7]/text()').get()three_rate = li.xpath('./td[8]/text()').get()hit_penalty = li.xpath('./td[9]/text()').get()penalty_rate = li.xpath('./td[10]/text()').get()session = li.xpath('./td[11]/text()').get()play_time = li.xpath('./td[12]/text()').get()print(name, team, score,hit_shot,hit_rate,hit_three,hit_penalty,penalty_rate,session,play_time)

最后保存数据 保存为excel文件

python"># 使用字典来存储数据    
dit = {'球员': name,'球队': team,'得分': score,'命中-出手': hit_shot,'命中率': hit_rate,'命中-三分': hit_three,'三分命中率': three_rate,'命中-罚球': hit_penalty,'罚球命中率': penalty_rate,'场次': session,'上场时间': play_time,}
# 定义一个空列表 将字典数据添加进去
all.append(dit)

导入pandas 模块 保存数据到excel表格中
以下是本次案例的全部代码 供学习交流使用
 

python">import requests
import parsel
import pandas as pdurl = 'https://nba.hupu.com/stats/players'
all = []
resp = requests.get(url)
selector = parsel.Selector(resp.text)
lis = selector.xpath("//tbody/tr[not(@class='color_font1 bg_a')]")
for li in lis:name = li.css('.left a::text').get()team = li.xpath('./td[3]/a/text()').get()score = li.css('.bg_b::text').get()hit_shot = li.xpath('./td[5]/text()').get()hit_rate = li.xpath('./td[6]/text()').get()hit_three = li.xpath('./td[7]/text()').get()three_rate = li.xpath('./td[8]/text()').get()hit_penalty = li.xpath('./td[9]/text()').get()penalty_rate = li.xpath('./td[10]/text()').get()session = li.xpath('./td[11]/text()').get()play_time = li.xpath('./td[12]/text()').get()dit = {'球员': name,'球队': team,'得分': score,'命中-出手': hit_shot,'命中率': hit_rate,'命中-三分': hit_three,'三分命中率': three_rate,'命中-罚球': hit_penalty,'罚球命中率': penalty_rate,'场次': session,'上场时间': play_time,}all.append(dit)pd.DataFrame(all).to_excel('NBA.xlsx', index=False)

数据可视化板块

数据可视化所需要的模块
pandas(数据处理和分析)pyecharts

 

 

python">import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Linedf = pd.read_excel('NBA.xlsx',index_col=False)players = df['球员'].tolist()
scores = df['得分'].tolist()
session = df['场次'].tolist()
# 创建柱状图对象
bar = (Line().add_xaxis(players)  # x 轴为球员.add_yaxis("得分", scores)  # y 轴为得分.add_yaxis("场次",session).set_global_opts(title_opts=opts.TitleOpts(title="球员得分情况柱状图"),toolbox_opts=opts.ToolboxOpts(is_show=True),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),  # 旋转 x 轴标签,防止重叠yaxis_opts=opts.AxisOpts(name="得分")).set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)# 渲染图表到 HTML 文件
bar.render("player_score_bar_chart.html")


http://www.ppmy.cn/news/1565542.html

相关文章

小白误入(需要一定的vue基础 )使用node建立服务器——vue前端登录注册页面连接到数据库

第一步:首先明确需要编写的文件: vue前端的登录页面:login.vue vue前端的注册页面:sign.vue vue前端的路由页面,负责vue框架内页面的跳转:index.js node后端连接数据,建立请求文件 &#xf…

线性代数概述

矩阵与线性代数的关系 矩阵是线性代数的研究对象之一: 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,是线性代数中的核心概念之一。矩阵的定义和性质构成了线性代数中矩阵理论的基础,而矩阵运算则简洁地表示和…

Erlang语言的网络编程

Erlang语言的网络编程探索 引言 在现代网络应用开发中,高并发、可扩展性以及系统容错能力是至关重要的。这些需求促使开发者寻求一种能够有效应对这些挑战的编程语言。Erlang作为一种功能强大的编程语言,其在电信行业的成功应用为其在网络编程领域的使…

vue3中使用render函数以及组合式写法实现一个配置化生成的表单组件

表单组件代码 import { h, computed, ref } from vue import type { PropType } from vue import { Form, Input, Radio, FormItem, Checkbox } from arco-design/web-vue//去除定义类型中 指定的key type RestrictKey<T, K extends keyof any> {[P in keyof T]: P ext…

零售业革命:改变行业的顶级物联网用例

mpro5 产品负责人Ruby Whipp表示&#xff0c;技术进步持续重塑零售业&#xff0c;其中物联网&#xff08;IoT&#xff09;正引领这一变革潮流。 研究表明&#xff0c;零售商们正在采用物联网解决方案&#xff0c;以提升运营效率并改善顾客体验。这些技术能够监控运营的各个方面…

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

目录 设计思路 1.为什么不直接用FlinkCDC要重写Flink Gauss CDC 2.存量同步的逻辑是什么 2.1、单主键的切片策略是什么 2.2、​​​​​复合主键作切片,怎么保证扫描到所有的数据 3、增量同步的逻辑是什么 4、存量同步结束之后如何无缝衔接增量同步 5、下游数据如何落…

电梯系统的UML文档08

5.1.2 用例 2 –处理电梯呼叫 这个用例有二个场景:乘客进入电梯和按电梯呼叫按钮。乘客可能想要去楼上或楼下&#xff0c;与电梯当前的移动方向有关。当电梯经过乘客或当在附近的楼层徘徊时&#xff0c;乘客可以到达目的层。这二个场景可以共享同一个用例。 场景 2.1 电梯呼叫…

《探秘鸿蒙Next:非结构化数据处理与模型轻量化的完美适配》

在鸿蒙Next的人工智能应用场景中&#xff0c;处理非结构化数据并使其适配模型轻量化需求是一项关键且具有挑战性的任务。以下是一些有效的方法和策略。 数据预处理 数据清洗&#xff1a;非结构化数据中往往存在噪声、重复和错误数据。对于文本数据&#xff0c;要去除乱码、特殊…