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

制作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数据播报程序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python3+PyQt5重新实现QT事件处理程序

    本文是对<Python Qt GUI快速编程>的第10章的例子events用Python3+PyQt5进行改写,涉及到重新实现QWidget的事件处理程序.本例子涉及到上下文菜单,鼠标事件,键盘事件,可作为重新实现事件处理程序的参考. 注:在创建上下文菜单最简单的方式使用Qwidget.addAction()把动作添加到窗口部件中,再把窗口部件的上下文菜单策略设置为Qt.ActionsContextMenu即可,但是如果像本例子一样要根据不同的状态来提供不同的选项,则要重新实现上下文菜单事件处

  • python3+PyQt5实现支持多线程的页面索引器应用程序

    本文通过Python3+pyqt5实现了python Qt GUI 快速编程的19章的页面索引器应用程序例子. /home/yrd/eric_workspace/chap19/walker_ans.py #!/usr/bin/env python3 import codecs import html.entities import re import sys from PyQt5.QtCore import (QMutex, QThread,pyqtSignal,Qt) class Walker

  • python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序

    本文通过Python3+PyQt5实现<python Qt Gui 快速编程>这本书的page Designer应用程序,采用QGraphicsView,QGraphicsScene,QGraphicsItem,这个程序包含有多个文本,图片和框的页面.有些图形类在PyQt5已过时,所以本代码改动幅度比较大.主要的类或方法的改变如下: QMatrix==>QTransform setMatrix==>setTransform rotate ==> setRotation 本例中

  • Python PyQt5运行程序把输出信息展示到GUI图形界面上

    概述:最近在赶毕业设计,遇到一个问题,爬虫模块我用PyQt5写了图形界面,为了将所有的输出信息都显示到图形界面上遇到了问题. 先演示一下效果最终效果吧,下面两张图用来镇楼.可以看到我们图形界面和程序运行的返回的信息是一样的,并且成功把数据展示到图形界面.   1.怎么获取输出信息.eg:我们平时用编译器,例如pycharm,运行的时候,会有很多信息,或者直接在cmd窗口输入命令的时候,也有同样信息.例如我启动数据库. cmd窗口下执行命令返回的信息 Pycharm运行的效果 我就想把这种类似输出

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

    制作NBA数据爬虫 捋顺思路 我们在这里选择的是百度体育带来的数据,我们在百度当中直接搜索NBA跳转到网页,我们可以看到,百度已经为我们提供了相关的数据 我们点击进去后,可以发现这是一个非常简洁的网址 我们看一下这个地址栏,发现毫无规律https://tiyu.baidu.com/live/detail/576O5Zu955S35a2Q6IGM5Lia56%2Bu55CD6IGU6LWbI2Jhc2tldGJhbGwjMjAyMS0wNi0xMyPniLXlo6t2c%2BWspritq%2Bi

  • Python利用PyQt5制作一个获取网络实时数据NBA数据播报GUI功能

    制作NBA数据爬虫 捋顺思路 我们在这里选择的是百度体育带来的数据,我们在百度当中直接搜索NBA跳转到网页,我们可以看到,百度已经为我们提供了相关的数据 我们点击进去后,可以发现这是一个非常简洁的网址 我们看一下这个地址栏,发现毫无规律https://tiyu.baidu.com/live/detail/576O5Zu955S35a2Q6IGM5Lia56%2Bu55CD6IGU6LWbI2Jhc2tldGJhbGwjMjAyMS0wNi0xMyPniLXlo6t2c%2BWspritq%2Bi

  • Python中利用pyqt5制作指针钟表显示实时时间(指针时钟)

    文末附完整源代码实现过程... 想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现.说到绘图的话,turtle框架无疑是最常见的选择,但其实通过pyqt5的QPainter组件也是可以实现的.而且最后呈现出来的效果还是挺漂亮的. 实现思路:通过使用pyqt5的QPainter组件来绘制好时钟的图表,最后通过定时器不断的改变当前当前时间在图表上面的显示位置.这样最终就实现了一个指针时钟在不断的走动的过程. 和前面的UI应用一样,我们用到的UI相关的组件

  • 利用PyQt5制作一个豆瓣电影信息查看器

    制作一个查看器可以查看豆瓣前100名电影的信息,当然这个爬取信息比较简单.所以重点放在 QThread 多线程的应用上面. QThread 子线程是 PyQt5 自带的一个线程使用,因为如果使用 PyQt5 的主线程去做所有的事情.如果处理速度太慢的情况下主线程就会直接出现卡死状态. 网络信息提取的相关模块有下面这些,主要是一个获取 Html 信息,另一个解析 Html5 的页面信息. import requests # 网络请求库 from bs4 import BeautifulSoup #

  • 如何利用PyQt5制作一个简单的登录界面

    目录 环境配置 额外工具配置 生成UI界面 总结 环境配置 新建python虚拟环境并激活 conda create -n pyqt python=3.8 conda activate py36 安装pyqt5 pip install pyqt5 安装pyqt5-tools pip install pyqt5-tools 在PyCharm中新建一个qtdemo工程,并使用这个新建的python虚拟环境作为工程环境 额外工具配置 依次点击File---Settings---Tools---Exte

  • python 利用pywifi模块实现连接网络破解wifi密码实时监控网络

    python 利用pywifi模块实现连接网络破解wifi密码实时监控网络,具体内容如下: import pywifi from pywifi import * import time def CrackWifi(password): wifi = pywifi.PyWiFi() iface = wifi.interfaces()[0] # 取一个无限网卡 # 是否成功的标志 isok = True if(iface.status()!=const.IFACE_CONNECTED): profi

  • Python+PyQt5制作一个图片查看器

    目录 前言 实现方式 测试 前言 在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEvent().mouseMoveEvent 等事件,但是如果要在图像上多添加一些形状,那么在对图像进行缩放旋转等仿射变换时需要对这些形状也这些变换,虽然不难,但是从头实现这些变换还有形状还是挺讨厌的.好在 Qt 提供了图形视图框架,关于这个框架的基本使用可以参见 深入了解PyQt5中的图形视图框架,下面进入正题. 实现方式 一个最基本的照片查看器应该具有以下功能

  • 利用Python为女神制作一个专属网站

    目录 数据准备 网站搭建 服务部署 先来看一下效果吧,只要有足够的照片素材,捕获女神的心就指日可待 怎么样,看起来还可以吧 下面就一起来完成吧 数据准备 首先是测试图片的获取,毕竟萝卜哥当前还没有那么多女神的照片 这里我使用如下网站的高清图片,嗯,各个都是大美女 抓取的代码比较简单 import requests import json def get_pic():     headers = {"Accept": "application/json, text/javasc

  • 基于PyQt5制作一个动态指针时钟

    想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现.说到绘图的话,turtle框架无疑是最常见的选择,但其实通过pyqt5的QPainter组件也是可以实现的.而且最后呈现出来的效果还是挺漂亮的. 实现思路:通过使用pyqt5的QPainter组件来绘制好时钟的图表,最后通过定时器不断的改变当前当前时间在图表上面的显示位置.这样最终就实现了一个指针时钟在不断的走动的过程. 和前面的UI应用一样,我们用到的UI相关的组件库还是这三个. from PyQ

  • Python利用PyQT5设置闹钟功能

    通过PyQt5实现设置一个小闹钟的功能,到了设置的时间后可以响起一段音乐来提醒. 导入UI界面组件相关的模块 from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * 导入应用操作相关的模块 import sys from PyQt5.QtMultimedia import * 初始化函数 init_ui() 函数,PyQt5 界面布局使用了三种,分别是垂直化布局.水平化布局.栅格布局.

随机推荐