教你用Python制作一款帶有界面的NBA爬蟲小程序

一蒲祈、前言

有時(shí)將代碼轉(zhuǎn)成帶有界面的程序膘格,會(huì)極大的方便使用峭范,雖然在網(wǎng)上有很多現(xiàn)成的GUI系統(tǒng),但是套用別人的代碼瘪贱,心里難免有些尷尬纱控,所以本文將用Python爬蟲結(jié)合wxpython模塊構(gòu)造一個(gè)NBA爬蟲小軟件,演示效果如下

本文框架構(gòu)造將分為二個(gè)部分講解:

構(gòu)建GUI界面

舉例套用爬蟲框架

主要涉及的Python模塊有

requests

wx

pymysql

pandas

??二菜秦、GUI界面設(shè)計(jì)

首先介紹下流程:GUI界面設(shè)計(jì)講解插入界面背景圖片

設(shè)計(jì)GUI界面的代碼思路其實(shí)很簡(jiǎn)單甜害,首先導(dǎo)入wx庫(kù)

#一、引用模塊

importwx

這里引用的模塊是wxpython模塊球昨,建立GUI的模塊很多尔店,常見的有PyQt、Tkinter等。這些模塊各有各的優(yōu)缺點(diǎn)嚣州,讀者可以翻閱相關(guān)資料進(jìn)行選擇鲫售。

#二、定義全局變量(創(chuàng)建面板及布局)

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)

self.bt_cancel?=?wx.Button(panel,?label='name2')

self.bt_cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)

self.InitUI()

定義全局變量對(duì)于初級(jí)的GUI來說就是構(gòu)建一個(gè)形式窗口+按鈕布置该肴,不需要自建一個(gè)模塊情竹。但對(duì)于高級(jí)的GUI諸如投資系統(tǒng)而言,全局變量是尤為重要的沙庐,換句話說全局變量需要放在一個(gè)py文件中初始化鲤妥。

上述代碼是創(chuàng)建部分的代碼,個(gè)性化布局需要添加容器進(jìn)行設(shè)置拱雏,稍后會(huì)在總代碼中呈現(xiàn)棉安。

#三、調(diào)用局部變量并綁定事件

defInitUI(self):

"""?點(diǎn)擊InitUI铸抑,執(zhí)行方法?"""

defOnclickSubmit(self,event):

"""?綁定OnclickSubmit事件?"""

簡(jiǎn)單來說就是綁定事件贡耽,該事件是你點(diǎn)擊對(duì)應(yīng)按鈕產(chǎn)生的效果。這部是整個(gè)GUI的核心鹊汛,如果你在做簽到系統(tǒng)蒲赂,那么你就要綁定一個(gè)導(dǎo)入員工名單txt文件的事件。

#四刁憋、GUI執(zhí)行腳本

if__name__?=='__main__':

app?=?wx.App()#?初始化

frame?=?MyFrame(parent=None,id=-1)

frame.Show()

app.MainLoop()#?調(diào)用主循環(huán)

delapp

第四步的基本套路就是如此滥嘴。

??三、舉例實(shí)現(xiàn)

以一個(gè)簡(jiǎn)單的NBA爬蟲系統(tǒng)為例至耻,首先創(chuàng)建面板與布局??

classMyFrame(wx.Frame):

def__init__(self,?parent,?id):

wx.Frame.__init__(self,?parent,?id,'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='清空')

self.bt_cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)

self.bt_imf?=?wx.Button(panel,?label='可視化')

self.bt_imf.Bind(wx.EVT_BUTTON,self.Onclickvisual)

self.bt_team?=?wx.Button(panel,?label='球隊(duì)信息',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_ml?=?wx.Button(panel,?label='得分榜')

self.bt_ml.Bind(wx.EVT_BUTTON,self.Onclickmql)

self.title?=?wx.StaticText(panel,?label="NBA可視化")

self.label_user?=?wx.StaticText(panel,?label="球隊(duì)名稱")

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="儲(chǔ)存路徑")

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,?flag=wx.BOTTOM?|?wx.TOP?|?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_pwd,?proportion=0,?flag=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):

"""?點(diǎn)擊使用說明按鈕尘颓,執(zhí)行方法?"""

defOnQuit1(self,e):

"""?輸入注意事項(xiàng)?"""

defOnclickSubmit(self,event):

"""?點(diǎn)擊合同信息按鈕走触,執(zhí)行方法?"""

defOnclickvisual(self,event):

"""?點(diǎn)擊可視化按鈕,執(zhí)行方法?"""

defOnclickCancel(self,event):

"""?點(diǎn)擊清空按鈕疤苹,執(zhí)行方法?"""

defOnclickimfor(self,event):

"""?點(diǎn)擊球員名稱按鈕互广,執(zhí)行方法?"""

defOnclickteam(self,event):

"""?點(diǎn)擊球隊(duì)名稱按鈕,執(zhí)行方法?"""

defOnclickmql(self,event):

"""?點(diǎn)擊得分榜按鈕卧土,執(zhí)行方法?"""

這里的事件處理不是很難惫皱,讀者可以自己嘗試創(chuàng)新,最后執(zhí)行腳本

if__name__?=='__main__':

app?=?wx.App()#?初始化

frame?=?MyFrame(parent=None,id=-1)#?實(shí)例MyFrame類尤莺,并傳遞參數(shù)?

frame.Show()#?顯示窗口

app.MainLoop()#?調(diào)用主循環(huán)方法

效果如圖??

??補(bǔ)充:插入背景圖片

想要構(gòu)造一個(gè)個(gè)性化系統(tǒng)逸吵,最不能缺的就是將界面背景換成自己想要的。這里我選擇用一張老科的圖片缝裁。

相信有的讀者會(huì)覺得一個(gè)獨(dú)立的單機(jī)的GUI軟件會(huì)更適合自己扫皱,我也恰恰如此足绅,因此,在設(shè)置背景圖片中于之后的GUI需要進(jìn)行打包韩脑,故需要將指定的二進(jìn)制圖片base64化氢妈,轉(zhuǎn)換后存入py文件后以import為媒介才能打包。二進(jìn)制代碼轉(zhuǎn)換如下:

importbase64

withopen("name.jpg","rb")asf:

base64_str?=?base64.b64encode(f.read())

withopen('%s.py'%?picture_name.replace('.','_'),'w+')asf1:

f1.write(base64_str)

f1.close()

此時(shí)可以得到有base64編碼的py文件段多,而后在代碼中進(jìn)行引用首量。由于打包不能打包圖片,故這里稍微復(fù)雜的實(shí)現(xiàn)“引用指定圖片的base64編碼——?jiǎng)?chuàng)建圖片——插入背景圖片”功能进苍!

最后在再稍加修飾將文本底色改為透明加缘。編寫這段代碼的框架非常固定,所以我借鑒了大神們的代碼觉啊,基本代碼框架如下:

#這里需要在主事件中插入兩句話

panel.Bind(wx.EVT_ERASE_BACKGROUND,self.OnEraseBack)

self.Bind(wx.EVT_ERASE_BACKGROUND,?self.OnEraseBack)

#引用編碼并創(chuàng)建圖片

frombg_pngimportimgasbg

defpic(picPath,picName):

tmp?=?open(picPath,'wb')

tmp.write(base64.b64decode(picName))

tmp.close()

pic('bg.png',bg)

#插入圖片(子事件?有縮進(jìn))

defOnEraseBack(self,event):

'''加入圖片背景'''

try:

dc?=?event.GetDC()

ifnotdc:

dc?=?wx.ClientDC(self)

rect?=?self.GetUpdateRegion().GetBox()

dc.SetClippingRect(rect)

dc.Clear()

bmp?=?wx.Bitmap(nowpath+r'\bg.png')

dc.DrawBitmap(bmp,-500,-100)

except:

pass

#將文本底色改為透明

#第一步:將主事件中wx.StaticText全部換成TransparentStaticText

#第二步:重現(xiàn)StaticText控件

classTransparentStaticText(wx.StaticText):

def__init__(self,?parent,?id=wx.ID_ANY,?label='',?pos=wx.DefaultPosition,?size=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)

self.Bind(wx.EVT_ERASE_BACKGROUND,lambdaevent:None)

self.Bind(wx.EVT_SIZE,?self.OnSize)

defOnPaint(self,?event):

bdc?=?wx.PaintDC(self)

dc?=?wx.GCDC(bdc)

font_face?=?self.GetFont()

font_color?=?self.GetForegroundColour()

dc.SetFont(font_face)

dc.SetTextForeground(font_color)

dc.DrawText(self.GetLabel(),0,0)

defOnSize(self,?event):

self.Refresh()

event.Skip()

最終效果如圖:

注意如果你想打包的話拣宏,需要代碼中中引入下面三個(gè)模塊:

importsix

importpackaging

importpackaging.version

importpackaging.specifiers

importpackaging.requirements

?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市杠人,隨后出現(xiàn)的幾起案子勋乾,更是在濱河造成了極大的恐慌,老刑警劉巖嗡善,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辑莫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡罩引,警方通過查閱死者的電腦和手機(jī)各吨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袁铐,“玉大人揭蜒,你說我怎么就攤上這事≌烟桑” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵伪嫁,是天一觀的道長(zhǎng)领炫。 經(jīng)常有香客問我,道長(zhǎng)张咳,這世上最難降的妖魔是什么帝洪? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮脚猾,結(jié)果婚禮上葱峡,老公的妹妹穿的比我還像新娘。我一直安慰自己龙助,他們只是感情好砰奕,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般军援。 火紅的嫁衣襯著肌膚如雪仅淑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天胸哥,我揣著相機(jī)與錄音涯竟,去河邊找鬼。 笑死空厌,一個(gè)胖子當(dāng)著我的面吹牛庐船,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘲更,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼筐钟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了哮内?” 一聲冷哼從身側(cè)響起盗棵,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎北发,沒想到半個(gè)月后纹因,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琳拨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年瞭恰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狱庇。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惊畏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出密任,到底是詐尸還是另有隱情颜启,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布浪讳,位于F島的核電站缰盏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏淹遵。R本人自食惡果不足惜口猜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望透揣。 院中可真熱鬧济炎,春花似錦、人聲如沸辐真。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恨闪,卻和暖如春倘感,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咙咽。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工老玛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钧敞。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓蜡豹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親溉苛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镜廉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容