当前位置: 首页 > 后端技术 > Python

实战|教你用python制作一款带界面的NBA爬虫小程序

时间:2023-03-26 16:31:46 Python

实战|教你用python做一个有界面的NBA爬虫程序有很多现成的GUI系统,但是套用别人的代码难免觉得有点尴尬,所以本文将使用python爬虫结合wxpython模块构建一个小型的NBA爬虫软件。本文的框架结构将分为两部分进行讲解:以构建GUI界面为例和应用爬虫框架。很简单,先导入wx库1.引用模块importwx这里引用的模块是wxpython模块。有许多用于构建GUI的模块,例如PyQt和Tkinter。这些模块各有优缺点,读者可以从相关资料中进行选择。2.定义全局变量(创建面板和布局)classMyFrame(wx.Frame):def__init__(self,parent,id):wx.Frame.__init__(self,parent,id,'titlename',size=(400,300))panel=wx.Panel(self)self.bt_confirm=wx.Button(panel,label='name1')self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)tonself.bt_pancelBut=,标签='name2')self.bt_cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)self.InitUI()定义全局变量。对于初级GUI,就是搭建窗体窗口+按钮布局,不需要搭建模块。但是对于投资系统这样的高级GUI,全局变量就显得尤为重要。也就是说,全局变量需要在一个py文件中进行初始化。上面的代码是创建部分的代码。个性化布局需要通过添加容器来设置,后面会在通用代码中呈现。3、调用局部变量,绑定事件defInitUI(self):"""点击InitUI,执行方法"""defOnclickSubmit(self,event):"""BindOnclickSubmitevent"""简单来说就是绑定Event,事件就是你点击对应按钮的效果。这是整个GUI的核心。如果你做的是签到系统,那你就得绑定一个导入员工名单txt文件的事件。四、GUI执行脚本IF__Name__=='__main__':app=wx.app()#initializeframe=myframe(paint=none,id=-1)frame.mainLoop()#callsthemainloopDEL这个是app第四步的基本套路。3、实例实现以一个简单的NBA爬虫系统为例,首先创建面板和布局,'NBA可视化',size=(400,300))panel=wx.Panel(self)self.bt_confirm=wx.Button(panel,label='合同信息')self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)self.bt_cancel=wx.Button(panel,label='clear')self.bt_cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)self.bt_imf=wx.Button(panel,label='selfvisualization')bt_imf.Bind(wx.EVT_BUTTON,self.Onclickvisual)self.bt_team=wx.Button(panel,label='团队信息',pos=(280,20))self.bt_team.Bind(wx.EVT_BUTTON,self.Onclickteam)self.bt_obtain=wx.Button(panel,label='玩家信息',pos=(20,20))self.bt_obtain.Bind(wx.EVT_BUTTON,self.Onclickimfor)self.bt_=wx.mlButton(panel,label='scorelist')self.bt_ml.Bind(wx.EVT_BUTTON,self.Onclickmql)self.title=wx.StaticText(panel,label="NBA可视化")自己。label_user=wx.StaticText(panel,label="球队名称")self.text_user=wx.TextCtrl(panel,style=wx.TE_LEFT)self.label_pwd=wx.StaticText(panel,label="球员名称")self.text_pwd=wx.TextCtrl(panel,style=wx.TE_LEFT)self.label_path=wx.StaticText(panel,label="storagepath")self.text_pathword=wx.TextCtrl(panel,style=wx.TE_LEFT)然后添加容器,水平的hsizer_user=wx.BoxSizer(wx.HORIZONTAL)hsizer_user.Add(self.label_user,proportion=0,flag=wx.ALL,border=5)hsizer_user.Add(self.text_user,proportion=1,flag=wx.ALL,border=5)hsizer_pwd=wx.BoxSizer(wx.HORIZONTAL)hsizer_pwd.Add(self.label_pwd,proportion=0,flag=wx.ALL,border=5)hsizer_pwd.Add(self.text_pwd,proportion=1,flag=wx.ALL,border=5)hsizer_path=wx.BoxSizer(wx.HORIZONTAL)hsizer_path.Add(self.label_path,proportion=0,flag=wx.ALL,border=5)hsizer_path.Add(self.text_pathword,proportion=1,flag=wx.ALL,border=5)hsizer_button=wx.BoxSizer(wx.HORIZONTAL)hsizer_button.Add(self.bt_confirm,proportion=0,flag=wx.ALIGN_CENTER,border=5)hsizer_button.Add(self.bt_cancel,proportion=0,flag=wx.ALIGN_CENTER,border=5)hsizer_button.Add(self.bt_imf,proportion=0,flag=wx.ALIGN_CENTER,border=5)hsizer_button.Add(self.bt_ml,proportion=0,flag=wx.ALIGN_CENTER,border=5)连接添加容器,横向排列vsizer_all=wx.BoxSizer(wx.VERTICAL)vsizer_all.Add(self.title,proportion=0,wx.BOTTOM|.flag=wxTOP|wx.ALIGN_CENTER,border=15)vsizer_all.Add(hsizer_user,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=45)=vsizer_all.Add(hsizer_all.Add(hsizer_all.Add(hsizer_all.wx.EXPAND|wx.LEFT|wx.RIGHT,border=45)vsizer_all.Add(hsizer_path,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=45)vsizer_all.Add(hsizer_button,proportion=0,flag=wx.ALIGN_CENTER|wx.TOP,border=15)panel.SetSizer(vsizer_all)self.InitUI()下一步是事件绑定。defInitUI(self):"""点击指令按钮执行方法"""defOnQuit1(self,e):"""InputNotes"""defOnclickSubmit(self,event):"""点击合约信息按钮,执行方法"""defOnclickvisual(self,event):"""点击可视化按钮,执行方法"""defOnclickCancel(self,event):"""点击清除按钮,执行方法"""defOnclickimfor(self,event):"""点击玩家名称按钮,执行方法"""defOnclickteam(self,event):"""点击团队名称按钮,执行方法"""defOnclickmql(self,event):"""点击记分板按钮执行方法"""这里的事件处理难度不是很大,读者可以自己尝试创新,最后执行脚本。if__name__=='__main__':app=wx.App()#初始化frame=MyFrame(parent=None,id=-1)#实例化MyFrame类,并传参frame.Show()in(MaopLoapp)#调用主循环方法的效果如图?补充:通过插入背景图片来构建个性化系统,最不可或缺的就是把界面背景改成自己想要的样子。这里我选择使用科尔沃的照片。相信有的读者会认为一个独立的单机GUI软件会更适合自己,我也正是如此。所以设置好背景图片后,还需要对GUI进行打包,所以需要对指定的二值图片进行base64化处理。转换后保存py文件后,可以以import为媒介进行打包。二进制码转换如下:importbase64withopen("name.jpg","rb")asf:base64_str=base64.b64encode(f.read())withopen('%s.py'%picture_name.replace('.','_'),'w+')asf1:f1.write(base64_str)f1.close()至此可以得到base64编码的py文件,然后在代码中引用。由于打包不能打包图片,这里稍微复杂一点的实现“引用指定图片的base64编码-创建图片-插入背景图片”的功能!最后稍微修改一下,将文字的背景色改为透明。写这段代码的框架很固定,所以借鉴了大神们的代码。基本代码框架如下:这里需要在主事件面板中插入两句Bind(wx.EVT_ERASE_BACKGROUND,self.OnEraseBack)self.Bind(wx.EVT_ERASE_BACKGROUND,self.OnEraseBack)参考编码并从bg_png创建图片importimgasbgdefpic(picPath,picName):tmp=open(picPath,'wb')tmp.write(base64.b64decode(picName)tmp)()pic('bg.png',bg)插入图片(subeventhasindentation)defOnEraseBack(self,event):'''Addpicturebackground'''try:dc=event.GetDC()ifnotdc:Dc=wx.clientdc(self)RECT=Self.getupDateRegion().getbox()dc.setClippingRed(RECT)dc.clear()bmp=wx.bitmap(nowpath+r'bg.png')dc.drawbitmap(bmp,-500,-100)except:pass改变文字背景色为transparent第一步:将主事件中的所有wx.StaticText改为TransparentStaticText第二步:重现StaticText控件类TransparentStaticText(wx.StaticText):def__init__(self,parent,id=wx.ID_ANY,label='',pos=wx.DefaultPosition,大小=wx.DefaultSize,style=wx.TRANSPARENT_WINDOW,name='TransparentStaticText'):wx.StaticText.__init__(self,parent,id,label,pos,size,style,name)self.Bind(wx.EVT_PAINT,self.OnPaint)indself。绑定(wx.EVT_ERASE_BACKGROUND,lambda事件:无)self.Bind(wx.EVT_SIZE,self.OnSize)defOnPaint(self,事件):bdc=wx.PaintDC(self)tfacedc=wx.GCDCf=self)GetFont()font_color=self.GetForegroundColour()dc.SetFont(font_face)dc.SetTextForeground(font_color)dc.DrawText(self.GetLabel(),0,0)defOnSize(selfevent):tfresh().Skip()最终效果如图:注意,如果要打包,需要在代码中引入以下三个模块:importsiximportpackagingimportpackaging.versionimportpackaging.specifiersimportpackaging.requirements