Python利用PyQt5制作一个获取网络实时NBA数据并播报的GUI程序

 更新时间:2021年06月20日 14:48:27   作者:最遥远的天秤  
现在NBA联赛也进行到半决赛了,我们怎么样才能以更快的方法获取NBA的数据呢?这里我们就自己来做一个数据播报的程序,需要的朋友可以参考下

制作NBA数据爬虫

捋顺思路

我们在这里选择的是百度体育带来的数据,我们在百度当中直接搜索NBA跳转到网页,我们可以看到,百度已经为我们提供了相关的数据

在这里插入图片描述

我们点击进去后,可以发现这是一个非常简洁的网址

在这里插入图片描述

我们看一下这个地址栏,发现毫无规律https://tiyu.baidu.com/live/detail/576O5Zu955S35a2Q6IGM5Lia56%2Bu55CD6IGU6LWbI2Jhc2tldGJhbGwjMjAyMS0wNi0xMyPniLXlo6t2c%2BWspritq%2BiIuQ%3D%3D/from/baidu_aladdin

在这里插入图片描述

好吧,只能再找找了,我们点击整个标签发现,这是一个网址,那就容易多了。

在这里插入图片描述

这里我们想要获取的无非就是具体的每一节数据和总分,然后如果用户还有其他需求的话我们就直接将其推送到百度网址上面来

在这里插入图片描述

爬取的思路大概就是这样,首先先访问主页面,然后在访问旗下今天的比赛,最后将比赛结果返回

编写代码

首先我们使用REQUESTS来访问网址

在这里插入图片描述

我们可以看到,百度没有做任何限制,直接访问也可以获得内容

在这里插入图片描述

接下来我们使用解析库进行解析

在这里插入图片描述

首先我们先将程序定位到Main标签

在这里插入图片描述

代码则是这样的,运行代码我们会发现,整个代码缩进了不少

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

获取主要的页面,我们使用FIND函数进行进一步操作

在这里插入图片描述

我们成功定位到了这个主页面,接下来就是我们开始爬取最近几次的比赛信息和详细页面了

在这里插入图片描述

更改代码,我们直接获取所有的比赛信息

在这里插入图片描述

在测试网站的时候,我发现百度竟然使用了AJAX技术,就是说你一次性获得的网站源代码可能只有五条,然后要进行再一次加载才能获取接下来的数据。但是这也对我们程序来说挺好的,我们本来也不需要那么多数据。

在这里插入图片描述

我们在这里查找了每一个的日期,查找对象为 date,接下来我们把其转换成字符串,因为百度上面这个日期有缩进,所以我们在后面添加 STRIP() 取消字符串前面的空格。按照这样的方式获取比赛地址

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

在这里,我们使用拼接字符串的方法,完成了对最后地址的解析

在这里插入图片描述

# 程序名称 : NBAReporter
# 制作时间 : 2021年6月13日
# 运行环境 : Windows 10

import requests
from bs4 import BeautifulSoup

# 基础数据定义
baidu_nba_url = "https://tiyu.baidu.com/match/NBA/"
request_url = "https:"
nba_dict = {}

# 访问网址
nba_res = requests.get(baidu_nba_url)
# print(nba_res.text)

# 开始使用解析器
nba_soup = BeautifulSoup(nba_res.text, "html.parser")
nba_main = nba_soup.main
# print(nba_main)

nba_div = nba_main.find_all("div", class_ = "wa-match-schedule-list-wrapper")

for i in nba_div:
	# 获取比赛时间
	nba_time = i.find("div", class_ = "date").string.strip()
	print(nba_time)
	# 获取比赛的次数
	nba_times = i.find("div", class_ = "list-num c-color").string
	print(nba_times)
	# 获取详细的比赛地址
	nba_href = i.find_all("div", class_ = "wa-match-schedule-list-item c-line-bottom")

	for url_nba in nba_href:
		url_nba = url_nba.a
		url_href = url_nba["href"]

		real_url = request_url + url_href
		print(real_url) 

接下来我们要开始剩余部分的解析,我们可以看到我们还有一部分的详细信息没有爬取,所以我们开始爬取详细信息

在这里插入图片描述

按照逻辑继续编写代码

在这里插入图片描述

然后我们获取一下这里面的值

在这里插入图片描述

获取比赛的相关分数后,我们创建两个列表,一个列表定义我们等一下需要用到NBA的样式,另一个列表则存储今天的日期,最后返回

在这里插入图片描述

我们已经在这里吧这个方法封装了,所以我们创建一个新的文件,直接导入即可

在这里插入图片描述

NBAReporter.py

# 程序名称 : NBAReporter
# 制作时间 : 2021年6月13日
# 运行环境 : Windows 10

import requests
from bs4 import BeautifulSoup

def NBAReporter():
	# 基础数据定义
	baidu_nba_url = "https://tiyu.baidu.com/match/NBA/"
	request_url = "https:"
	nba_list = []
	today_list = []
	
	# 访问网址
	nba_res = requests.get(baidu_nba_url)
	# print(nba_res.text)

	# 开始使用解析器
	nba_soup = BeautifulSoup(nba_res.text, "html.parser")
	nba_main = nba_soup.main
	# print(nba_main)

	nba_div = nba_main.find_all("div", class_ = "wa-match-schedule-list-wrapper")

	for i in nba_div:
		# 获取比赛时间
		today = i.find("div", class_ = "date").string.strip()
		# 获取比赛的次数
		nba_times = i.find("div", class_ = "list-num c-color").string
		# 获取详细的比赛地址
		nba_href = i.find_all("div", class_ = "wa-match-schedule-list-item c-line-bottom")

		for url_nba in nba_href:
			url_nba = url_nba.a
			url_href = url_nba["href"]

			real_url = request_url + url_href
			# print(real_url) 

			# 获取详细数据
			vs_time = url_nba.find("div", class_ = "font-14 c-gap-bottom-small").string
			vs_finals = url_nba.find("div",class_ = "font-12 c-color-gray").string

			team_row_1 = url_nba.find("div", class_ = "team-row")
			team_row_2 = url_nba.find("div", class_ = "c-gap-top-small team-row")

			"""team_row_1_png = team_row_1.find("div", class_ = "inline-block")["style"]
												team_row_2_png = team_row_2.find("div", class_ = "inline-block")["style"]
												print(team_row_1_png,team_row_2_png)"""
			team_row_1_name = team_row_1.find("span", class_ = "inline-block team-name team-name-360 team-name-320 c-line-clamp1").string
			team_row_2_name = team_row_2.find("span", class_ = "inline-block team-name team-name-360 team-name-320").string
			# print(team_row_1_name,team_row_2_name)
			team_row_1_score = team_row_1.find("span", class_ = "inline-block team-score-num c-line-clamp1").string
			team_row_2_score = team_row_2.find("span", class_ = "inline-block team-score-num c-line-clamp1").string
			# print(team_row_1_score,team_row_2_score)

			"""import re 		# 导入re库,不过最好还是在最前面导入,这里是为了演示的需要
									
												team_row_1_png_url = re.search(r'background:url(.*)', team_row_1_png)
												team_row_1_png_url = team_row_1_png_url.group(1)
												team_row_2_png_url = re.search(r'background:url(.*)', team_row_2_png)
												team_row_2_png_url = team_row_2_png_url.group(1)"""

			nba = [ today, nba_times,"","",
					vs_time, vs_finals, team_row_1_name, team_row_2_name,
					"","", team_row_1_score, team_row_2_score
			]

			nba_list.append(nba)
			today_list.append(today)

	return nba_list,today_list

这里我们要编写的是GUI界面的实现程序

在这里插入图片描述

首先先导入我们运行所需要的库

在这里插入图片描述

简单定义一下我们的代码,设置标题和其他的一些窗口属性# self.setWindowOpacity(0.5)这里是设置窗口透明程度的一行代码,但是经过我的测验之后,发现这样子真的对于用户体验一点也不好,所以在这里我把它注释掉了

在这里插入图片描述

程序主逻辑如上图所示,我们创建了一个单元布局,然后又创建了和比赛一样的若干个标签,最后将函数返回的列表以标签的形式放在主窗口上面

在这里插入图片描述

最后创建事件,运行程序,这样子整个程序就完成了

NBAWindow.py

# 程序名称 : NBAWindow
# 制作时间 : 2021年6月14日
# 运行环境 : Windows 10
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from NBAReporter import *

# 首先创建一个主窗口
class NBAWindow(QTabWidget):
	def __init__(self):
		super().__init__()
		self.make_Ui()

		"""		# 两分钟自动刷新
		self.timer = QTimer()
		self.timer.setInterval(500)
		self.timer.timeout.connect(self.make_Ui)
		self.timer.start()"""

		self.setWindowTitle("NBA数据")
		self.setGeometry(1440,0,480,300)
		self.setFixedSize(480,300)
		self.setWindowIcon(QIcon('images/nba.png'))
		self.setStyleSheet("""background-color:red; """)
		# self.setWindowOpacity(0.5)
		self.setWindowFlags(Qt.WindowStaysOnTopHint|Qt.WindowMinimizeButtonHint|Qt.FramelessWindowHint)

	def make_Ui(self):
		self.nba,today = NBAReporter()
		self.tab = 0

		for a in self.nba:
			# 设置网格单元布局
			grid = QGridLayout()
			self.setLayout(grid)

			# 开始添加一个标签
			tab = QWidget()
			# 将这个标签设置为TAB并按照列表中的数值命名
			self.addTab(tab,today[self.tab])

			# 获取循环之后的位置,重写列表
			positions = [(i, j) for i in range(3) for j in range(4)]
			nba_list = self.nba[self.tab]

			# 开始创建Tab下面的标签
			for position, nba in zip(positions, nba_list):
				#print(nba)
				# 当时空值时,跳过执行
				if nba == "":
					continue
				
				# 设置文字样式
				label = QLabel("<font color='black', size=5><b>%s</b></font>"%nba)
				grid.addWidget(label, *position)

				# 设置整个窗口为表格布局
				tab.setLayout(grid)

				# grid.update()

			# 将数值加一
			self.tab += 1

if __name__ == '__main__':
	app = QApplication(sys.argv)
	window = NBAWindow()
	window.show()
	app.exec_()

NBAReporter.py

# 程序名称 : NBAReporter
# 制作时间 : 2021年6月13日
# 运行环境 : Windows 10

import requests
from bs4 import BeautifulSoup

def NBAReporter():
	# 基础数据定义
	baidu_nba_url = "https://tiyu.baidu.com/match/NBA/"
	request_url = "https:"
	nba_list = []
	today_list = []
	
	# 访问网址
	nba_res = requests.get(baidu_nba_url)
	# print(nba_res.text)

	# 开始使用解析器
	nba_soup = BeautifulSoup(nba_res.text, "html.parser")
	nba_main = nba_soup.main
	# print(nba_main)

	nba_div = nba_main.find_all("div", class_ = "wa-match-schedule-list-wrapper")

	for i in nba_div:
		# 获取比赛时间
		today = i.find("div", class_ = "date").string.strip()
		# 获取比赛的次数
		nba_times = i.find("div", class_ = "list-num c-color").string
		# 获取详细的比赛地址
		nba_href = i.find_all("div", class_ = "wa-match-schedule-list-item c-line-bottom")

		for url_nba in nba_href:
			url_nba = url_nba.a
			url_href = url_nba["href"]

			real_url = request_url + url_href
			# print(real_url) 

			# 获取详细数据
			vs_time = url_nba.find("div", class_ = "font-14 c-gap-bottom-small").string
			vs_finals = url_nba.find("div",class_ = "font-12 c-color-gray").string

			team_row_1 = url_nba.find("div", class_ = "team-row")
			team_row_2 = url_nba.find("div", class_ = "c-gap-top-small team-row")

			"""team_row_1_png = team_row_1.find("div", class_ = "inline-block")["style"]
												team_row_2_png = team_row_2.find("div", class_ = "inline-block")["style"]
												print(team_row_1_png,team_row_2_png)"""
			team_row_1_name = team_row_1.find("span", class_ = "inline-block team-name team-name-360 team-name-320 c-line-clamp1").string
			team_row_2_name = team_row_2.find("span", class_ = "inline-block team-name team-name-360 team-name-320").string
			# print(team_row_1_name,team_row_2_name)
			team_row_1_score = team_row_1.find("span", class_ = "inline-block team-score-num c-line-clamp1").string
			team_row_2_score = team_row_2.find("span", class_ = "inline-block team-score-num c-line-clamp1").string
			# print(team_row_1_score,team_row_2_score)

			"""import re 		# 导入re库,不过最好还是在最前面导入,这里是为了演示的需要
									
												team_row_1_png_url = re.search(r'background:url(.*)', team_row_1_png)
												team_row_1_png_url = team_row_1_png_url.group(1)
												team_row_2_png_url = re.search(r'background:url(.*)', team_row_2_png)
												team_row_2_png_url = team_row_2_png_url.group(1)"""

			nba = [ today, nba_times,"","",
					vs_time, vs_finals, team_row_1_name, team_row_2_name,
					"","", team_row_1_score, team_row_2_score
			]

			nba_list.append(nba)
			today_list.append(today)

	return nba_list,today_list

效果演示

在这里插入图片描述

到此这篇关于Python利用PyQt5制作一个获取网络实时NBA数据并播报的GUI程序的文章就介绍到这了,更多相关Python PyQt5数据播报程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python游戏开发之Pygame使用的最全教程分享

    Python游戏开发之Pygame使用的最全教程分享

    Pygame库是Python中一个专为游戏开发设计的库,它提供了大量的功能来帮助开发者创建各种2D游戏,本文就来和大家分享一下Pygame的具体使用,希望对大家有所帮助
    2023-05-05
  • 使用Python pip怎么升级pip

    使用Python pip怎么升级pip

    这篇文章主要介绍了使用Python pip怎么升级pip,本文给大家分享方法和实现步骤对python pip升级pip相关知识感兴趣的朋友跟随小编一起看看吧
    2020-08-08
  • 基于Python+Pygame实现变异狗大战游戏

    基于Python+Pygame实现变异狗大战游戏

    只有你想不到,没有我找不到写不了的好游戏!这篇文章就来和大家分享一下如何基于Python+Pygame实现变异狗大战游戏,感兴趣的可以了解一下
    2023-03-03
  • Python Pandas实现将嵌套JSON数据转换DataFrame

    Python Pandas实现将嵌套JSON数据转换DataFrame

    对于复杂的JSON数据进行分析时,通常的做法是将JSON数据结构转换为Pandas DataFrame,所以本文就来看看将嵌套JSON数据转换为Pandas DataFrame的具体方法吧
    2024-01-01
  • 详解python的函数递归与调用

    详解python的函数递归与调用

    Python中的函数递归是一种函数调用自身的编程技术,递归可以用来解决问题,特别是那些可以分解为更小、相似子问题的问题,本文将给大家详细的讲解一下python的函数递归与调用,需要的朋友可以参考下
    2023-10-10
  • Python学习之用pygal画世界地图实例

    Python学习之用pygal画世界地图实例

    这篇文章主要介绍了Python学习之用pygal画世界地图实例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • python 如何设置守护进程

    python 如何设置守护进程

    这篇文章主要介绍了python 如何设置守护进程,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-10-10
  • python库patchworklib多图表整合用法示例探究

    python库patchworklib多图表整合用法示例探究

    这篇文章主要介绍了python库patchworklib对齐matplotlib图表,将多个图表的整合为单一图表用法示例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • python解包用法详解

    python解包用法详解

    在本篇文章里小编给大家整理的是关于python解包用法详解内容,有需要的朋友们可以跟着一起学习下。
    2021-02-02
  • Python深入学习之闭包

    Python深入学习之闭包

    这篇文章主要介绍了Python深入学习之闭包,闭包(closure)是函数式编程的重要的语法结构,Python也支持这一特性,本文就这一特性做了讲解,需要的朋友可以参考下
    2014-08-08

最新评论