1. 程式人生 > >Swaggy教你用python實現NBA資料統計的爬取

Swaggy教你用python實現NBA資料統計的爬取

相信很多喜歡NBA的小夥伴們經常會關注NBA的資料統計,今天我就用虎撲NBA的得分榜為例,實現NBA資料的簡單爬取。

https://nba.hupu.com/stats/players是虎撲體育的NBA球員得分榜:


當我們右鍵檢視該網站的原始碼時,會發現所有的資料統計都存放在<tbody>的標籤下,而<tbody>下的每個<tr>標籤則表示每個球員的資訊,第1、2、4個<td>標籤分別表示球員排名、球員名字和得分。

eg.

<tr>
<td width="46">1</td>
<td class="bg_b">33.20</td>
<td>12.30-22.50</td>
<td>54.7%</td>
<td>1.60-5.10</td>
<td>30.9%</td>
<td>7.00-9.60</td>
<td>73.2%</td>
<td width="50">16</td>
<td width="70">40.60</td>
</tr>

運用requests庫和bs4庫,我們可以將球員的資料爬取下來。

首先,我們編寫一個getHTMLText方法,用於爬取網頁的資訊:

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

其次,我們編寫一個fillList方法。

因為所有的資料統計都存放在<tbody>的標籤下,而<tbody>下的每個<tr>標籤則表示每個球員的資訊,第1、2、4個<td>標籤分別表示球員排名、球員名字和得分,我們採用html.parser直譯器,遍歷<tbody>標籤的所有兒子節點,將球員資料的第1、2、4個<td>標籤新增至列表中即可:

def fillList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].string, tds[3].string])

最後,我們編寫printList方法,將列表中的資料依次輸出:

def printUnivList(ulist, num):
    for i in range(num):
        u = ulist[i]
        print("{0:<6}\t{1:{3}<10}\t{2:<6}".format(u[0],u[1],u[2],chr(12288)))
其中chr(12288)是用來將輸出的空格轉換成中文空格,以便對齊。

將以上方法組合編寫主函式如下:

def main():
    uinfo = []
    url = 'http://nba.hupu.com/stats/players'
    html = getHTMLText(url)
    fillList(uinfo, html)
    printList(uinfo, 21)
便將NBA得分榜的前20名球員輸出了:是不是很簡單呢?趕緊上手嘗試一下吧(手動滑稽)