本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理,
以下文章最早早起Python ,作者投稿君
前言
大家好,在之前我們講過如何使用Python內置一個帶有GUI的爬蟲小程式,很多這里將迎合熱點,延續上次的NBA?爬蟲GUI,探討如何爬取虎撲NBA官網資料, 并且將資料寫入Excel中同時自動生成折線圖,主要有以下幾個步驟
本文將分為以下兩個部分進行講解
- 在虎撲NBA官網球員頁面中進行爬蟲,獲取球員資料,
- 清洗整理爬取的球員資料,進行進行可視化,
專案主要涉及的Python模塊:
- requests
- pandas
- bs4
爬蟲部分
爬蟲部分整理思路如下
觀察URL1的源代碼找到球隊名稱與對應URL2觀察URL2的源代碼找到球員對應的URL3觀察URL3源代碼找到對應球員基本資訊與比賽資料并進行篩選存盤
其實爬蟲就是在html上操作,而html的結構很簡單就只有一個,就是一個大框套一個小框,小框在套小框,這樣的一層層疊,
目標URL如下:
網址1:http://nba.hupu.com/players/ URL2(此處以湖人球隊為例):https://nba.hupu.com/players/lakers URL3(此處以詹姆斯為例):https://nba.hupu.com/players/lebronjames-650.html
先參考模塊
from bs4 import BeautifulSoup import requests import xlsxwriter import os
查看URL1源代碼,可以看到球隊名詞及其對應的URL2在span標簽中<span class><a href = https://www.cnblogs.com/hhh188764/p/“...">下,看上去找到它的父框與祖父框,下面的思路都是如此,圖如下:
此時,可以通過requests模塊與bs4模塊進行有目的性的索引,得到球隊的名稱串列,
def Teamlists(url): TeamName=[] TeamURL=[] GET=requests.get(URL1) soup=BeautifulSoup(GET.content,'lxml') lables=soup.select('html body div div div ul li span a') for lable in lables: ballname=lable.get_text() TeamName.append(ballname) print(ballname) teamname=input("請輸入想查詢的球隊名:")#此處可變為GUI界面中的按鍵值 c=TeamName.index(teamname) for item in lables: HREF=item.get('href') TeamURL.append(HREF) URL2=TeamURL[c] return URL2
就此得到了對應球隊的URL2,接著觀察URL2網頁的內容,可以看到球員名稱在標簽a中<a target = "_blank" href = https://www.cnblogs.com/hhh188764/p/....>下,同時也放置著對應球員的URL3,如下圖:
此時,故依然通過requests模塊與bs4模塊進行相對應的索引,得到球員名稱串列以及對應的URL3,
#自定義函式獲取隊員串列和對應的URL def playerlists(URL2): PlayerName=[] PlayerURL=[] GET2=requests.get(URL1) soup2=BeautifulSoup(GET2.content,'lxml') lables2=soup2.select('html body div div table tbody tr td b a') for lable2 in lables2: playername=lable2.get_text() PlayerName.append(playername) print(playername) name=input("請輸入球員名:") #此處可變為GUI界面中的按鍵值 d=PlayerName.index(name) for item2 in lables2: HREF2=item2.get('href') PlayerURL.append(HREF2) URL3=PlayerURL[d] return URL3,name
現在就此得到了對應球隊的URL3,接著觀察URL3頁面的內容,可以看到球員基本資訊在標簽p下,球員常規賽生涯資料與季后賽生涯資料在標簽td下,如下圖:
同樣,依然通過requests模塊與bs4模塊進行相對應的索引,得到球員基本資訊與職業資料,而對于球員的常規賽與季候賽的職業資料將進行篩選與儲存,得到資料串列,
def Competition(URL3): data=[] GET3=requests.get(URL3) soup3=BeautifulSoup(GET3.content,'lxml') lables3=soup3.select('html body div div div div div div div div p') lables4=soup3.select('div div table tbody tr td') for lable3 in lables3: introduction=lable3.get_text() print(introduction) #球員基本資訊 for lable4 in lables4: competition=lable4.get_text() data.append(competition) for i in range(len(data)): if data[i]=='職業生涯常規賽平均資料': a=data[i+31] a=data.index(a) del(data[:a]) for x in range(len(data)): if data[x]=='職業生涯季后賽平均資料': b=data[x] b=data.index(b) del(data[b:]) return data
通過上述網路爬蟲得到了以下的資料,提供可視化資料的同時替換系結之后的GUI界面按鍵事件:
- 獲取NBA中的所有球隊的標準名稱;
- 通過指定的一只球隊獲取球隊中所有球員的標準名稱;
- 通過指定的球員獲取到對應的基本資訊以及常規賽與季后賽資料;
可視化部分
思路:創建檔案夾創建表格和折線圖
自定義函式創建表格,運用os模塊進行撰寫,回傳已創建檔案夾的路徑,代碼如下:
def file_add(path): #此時的內函式path可與GUI界面的Statictext系結 creatpath=path+'\\Basketball' try: if not os.path.isdir(creatpath): os.makedirs(creatpath) except: print("檔案夾存在") return creatpath
運用xlsxwriter模塊在creatpath路徑下的自定義函式創建excel表格同時添加資料與構造折線圖,代碼如下:
def player_chart(name,data,creatpath): #此為表格名稱——球員名稱+chart EXCEL=xlsxwriter.Workbook(creatpath+'\\'+name+'chart.xlsx') worksheet=EXCEL.add_worksheet(name) bold=EXCEL.add_format({'bold':1}) headings=data[:18] worksheet.write_row('A1',headings,bold) #寫入表頭 num=(len(data))//18 a=0 for i in range(num): a=a+18 c=a+18 i=i+1 worksheet.write_row('A'+str(i+1),data[a:c]) #寫入資料 chart_col = EXCEL.add_chart({'type': 'line'}) #創建一個折線圖 chart_col.add_series({ 'name': '='+name+'!$R$1', #設定折線描述名稱 'categories':'='+name+'!$A$2:$A$'+str(num), #設定圖表類別標簽范圍 'values': '='+name+'!$R$2:$R$'+str(num-1), #設定圖表資料范圍 'line': {'color': 'red'}, }) #設定圖表線條屬性 #設定圖示的標題和想x,y軸資訊 chart_col.set_title({'name': name+'生涯常規賽平均得分'}) chart_col.set_x_axis({'name': '年份 (年)'}) chart_col.set_y_axis({'name': '平均得分(分)'}) chart_col.set_style(1) #設定圖表風格 worksheet.insert_chart('A14', chart_col, {'x_offset':25, 'y_offset':3,}) #把圖示插入作業臺中并設定偏移 EXCEL.close()
資料表格效果展現,以詹姆斯為例如下
并且然后打開自動生成的Excel,對應的折線圖就直接展現出來,無需再次整理!
現在結合任務一的網路爬蟲與任務二的資料可視化,可以得到實時的球員常規賽資料與季后賽資料匯總,同時還有實時球員生涯折線圖,便可以與上次的GUI界面任務設計中的”可視化”按鈕事件系結,研究者的讀者可以自己進一步研究!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/224962.html
標籤:Python
