#coding:utf8
'''
程序制作:冷鱼闲风
制作日期:2021年12月06日
申明:本程序仅供学习,请勿用作商业用途和违法行为。
ps:程序还有很多值得改进的地方,欢迎大神帮我指出可以优化的地方吧,谢谢大家。
'''#导入必要的库
from pkgutil import get_data
import sys,re,threading,requests,json,os #系统,正则表达式,多线程,爬虫,json,系统
from PySide2.QtWidgets import * #Qt
from PySide2.QtCore import QStringListModel #Qt
from ui_video import Ui_MainWindow #Qt界面
from lxml import etree #html解析#定义Video类
class Video(QMainWindow, Ui_MainWindow):#设置请求头headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'}#申明列表,存放视频数据VideoName=[]Url=[]ID=0def __init__(self):super().__init__()self.setupUi(self)#显示界面self.show() self.getdata('xxxxxxxxxx')def getdata(self,url):'''请求数据GET,并HTML格式化后返回。'''r = requests.get(url, headers=self.headers)r.encoding = 'utf-8' self.Iterate(etree.HTML(r.text))def Iterate(self,data):'''赋值给列表'''for i in range(1, 20):#获取到视频列表后,循环20次定位Html元素,提取标题和链接self.base="//div[@class='container']/div[@class='']/ul/li["+str(i)+"]/a/"#把获取到的数据加入列表里面。self.VideoName.append(data.xpath(self.base+"text()")[0]) self.Url.append(data.xpath(self.base+"@href")[0])self.ScreenShow()def ScreenShow(self):'''展示界面,传递数据。'''#开始设置列表,传入数据layout = QVBoxLayout()listview = QListView()listModel = QStringListModel()listModel.setStringList(self.VideoName)listview.setModel(listModel)#设置列表数据self.listView.setModel(listModel) #设置按钮点击事件self.pushButton.clicked.connect(self.Dispose) #设置列表点击事件self.listView.clicked.connect(self.Prompt) def OpenVideo(self):'''cmd调用系统播放器并传递视频参数'''#子线程,调用cmd命令打开系统播放器并且全屏。os.system(r"cd %SystemDrive%\Program Files\Windows Media Player && wmplayer "+self.rr+" /fullscreen")def Dispose(self):'''爬取界面数据,调用系统播放器。'''#获取标签4的数据,使用正则表达式提取纯数字。把除数字外的字符替换成空self.data = re.compile(r'\D',re.S).sub('', self.label_4.text()) self.progressBar.setValue(60)#获取视频界面的数据r = requests.get(self.Url[int(self.data)], headers=self.headers)r.encoding = 'utf-8'#获取后,截取字符,然后在用json获取视频链接。o=r.text.split('var json = eval(')o=o[1].split('var playerCode')o=o[0][0:len(o[0])-8]rr = json.loads(o)self.rr=rr['video'][0]['mp4Address']['host']+rr['video'][0]['mp4Address']['clips'][0]['urls'][0]self.progressBar.setValue(100)#开启子线程。避免主线程堵塞,防止用户误按Qt界面导致程序无响应thread = threading.Thread(target=self.OpenVideo)thread.start()#隐藏界面self.hide()#等待视频播放器关闭后,杀死程序全部进程。避免占用进程池。sys.exit()def Prompt(self,item):'''选择列表后,提醒交互。'''#设置列表项,方便提取数字self.ID=item.row()self.progressBar.setValue(40)self.label_4.setText("你已经选择"+str(1+item.row())+"号")#程序入口
if __name__ == '__main__':app = QApplication(sys.argv)window = Video()sys.exit(app.exec_())
ui_video.py文件的内容
# -*- coding: utf-8 -*-################################################################################
## Form generated from reading UI file 'video.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *class Ui_MainWindow(object):def setupUi(self, MainWindow):if not MainWindow.objectName():MainWindow.setObjectName(u"MainWindow")MainWindow.resize(334, 385)MainWindow.setMinimumSize(QSize(334, 385))MainWindow.setMaximumSize(QSize(334, 385))self.centralwidget = QWidget(MainWindow)self.centralwidget.setObjectName(u"centralwidget")self.progressBar = QProgressBar(self.centralwidget)self.progressBar.setObjectName(u"progressBar")self.progressBar.setGeometry(QRect(290, 10, 21, 341))self.progressBar.setValue(0)self.progressBar.setOrientation(Qt.Vertical)self.pushButton = QPushButton(self.centralwidget)self.pushButton.setObjectName(u"pushButton")self.pushButton.setGeometry(QRect(20, 310, 141, 41))font = QFont()font.setFamily(u"Aharoni")font.setPointSize(12)font.setBold(True)font.setWeight(75)self.pushButton.setFont(font)self.tabWidget = QTabWidget(self.centralwidget)self.tabWidget.setObjectName(u"tabWidget")self.tabWidget.setGeometry(QRect(20, 10, 251, 291))self.tab = QWidget()self.tab.setObjectName(u"tab")self.listView = QListView(self.tab)self.listView.setObjectName(u"listView")self.listView.setGeometry(QRect(10, 10, 221, 241))self.tabWidget.addTab(self.tab, "")self.tab_2 = QWidget()self.tab_2.setObjectName(u"tab_2")self.label = QLabel(self.tab_2)self.label.setObjectName(u"label")self.label.setGeometry(QRect(10, 40, 171, 16))self.label_2 = QLabel(self.tab_2)self.label_2.setObjectName(u"label_2")self.label_2.setGeometry(QRect(10, 200, 231, 16))self.label_3 = QLabel(self.tab_2)self.label_3.setObjectName(u"label_3")self.label_3.setGeometry(QRect(10, 120, 231, 16))self.tabWidget.addTab(self.tab_2, "")self.label_4 = QLabel(self.centralwidget)self.label_4.setObjectName(u"label_4")self.label_4.setGeometry(QRect(180, 320, 101, 21))MainWindow.setCentralWidget(self.centralwidget)self.statusbar = QStatusBar(MainWindow)self.statusbar.setObjectName(u"statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)self.tabWidget.setCurrentIndex(0)QMetaObject.connectSlotsByName(MainWindow)# setupUidef retranslateUi(self, MainWindow):MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u300a\u6742\u5fd7\u5929\u4e0b\u300b\u5ba2\u6237\u7aef", None))self.pushButton.setText(QCoreApplication.translate("MainWindow", u"\u64ad\u653e\u89c6\u9891", None))self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"\u89c6\u9891\u5217\u8868", None))self.label.setText(QCoreApplication.translate("MainWindow", u"\u672c\u63d2\u4ef6\u662f\u7531\u51b7\u9c7c\u4e0e\u70ed\u732b\u5f00\u53d1", None))self.label_2.setText(QCoreApplication.translate("MainWindow", u"\u672c\u63d2\u4ef6\u5236\u4f5c\u4ec5\u4f9b\u5b66\u4e60\uff0c\u8bf7\u52ff\u7528\u4f5c\u8fdd\u6cd5\u7528\u9014", None))self.label_3.setText(QCoreApplication.translate("MainWindow", u"\u58f0\u660e\uff1a\u611f\u8c22\u6c5f\u897f\u5e7f\u64ad\u7535\u89c6\u53f0\u63d0\u4f9b\u89c6\u9891\u6e90", None))self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"\u5173\u4e8e\u63d2\u4ef6", None))self.label_4.setText(QCoreApplication.translate("MainWindow", u"\u4f60\u5df2\u7ecf\u9009\u62e90\u53f7", None))# retranslateUi
导入后的效果应该是这样的:因为版权问题,我修改了很多次,具体链接请看图片里。
更详细的教程:https://www.yuque.com/vifanlyrs/bcm/cifyfq