Python抓取NBA現役球員的基本資訊資料
一、要求
選擇一個熱點或者你感興趣的主題、爬取的對象與範圍,爬取相應的内容并做資料分析與文本分析,形成一篇有說明、技術要點、有資料、有資料分析圖形化展示與說明、文本分析圖形化展示與說明的文章。
資料來源:NBA中國官網
庫:
requests 用于解析頁面文本資料
pandas 用于處理資料
import requests
import pandas as pd
user_agent = 'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)'
headers = {'User-Agent':user_agent}
url='http://china.nba.com/static/data/league/playerlist.json'
#解析網頁
r=requests.get(url,headers=headers).json()
num=int(len(r['payload']['players']))-1 #得到清單r['payload']['players']的長度
p1_cols=[] #用來存放p1數組的列
p2_cols=[] #用來存放p2數組的列
#周遊其中一個['playerProfile'],['teamProfile'] 得到各自列名,添加到p1_cols和p2_cols清單中
for x in r['payload']['players'][0]['playerProfile']:
p1_cols.append(x)
for y in r['payload']['players'][0]['teamProfile']:
p2_cols.append(y)
p1=pd.DataFrame(columns=p1_cols) #初始化一個DataFrame p1 用來存放playerProfile下的資料
p2=pd.DataFrame(columns=p2_cols) #初始化一個DataFrame p1 用來存放playerProfile下的資料
#周遊一次得到一個球員的資訊,分别添加到DataFrame數組中
for z in range(num):
player=pd.DataFrame([r['payload']['players'][z]['playerProfile']])
team=pd.DataFrame([r['payload']['players'][z]['teamProfile']])
p1=p1.append(player,ignore_index=True)
p2=p2.append(team,ignore_index=True)
p3=pd.merge(p1,p2,left_index=True,right_index=True)
p3.to_csv('f://nba_player.csv',index=False)

資料:
了解下基本的資料情況
截止全明星賽前有498名現役球員
那麼城市球員數量具體是多少呢?
p3['country'].value_counts()
球隊的球員數:
p3['displayAbbr'].value_counts()
也就是說498名現役大名單球員裡,有385名美國人
每一屆球員的情況
p3['draftYear'].value_counts()
2019年4月29日火箭VS勇士賽前分析頁面 https://sports.qq.com/a/20190428/006551.htm
from bs4 import BeautifulSoup
url='https://sports.qq.com/a/20190428/006551.htm'
res=requests.get(url)
res.encoding='gb2312'
res.text
生成詞雲:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
txt=open(r'123.txt','r',encoding='utf-8').read()
wcdict1=[line.strip() for line in open('123.txt',encoding='utf-8').readlines()]
jieba.load_userdict(wcdict1)
# wcdict2=[line.strip() for line in open('stop_chinese2.txt',encoding='utf-8').readlines()]
# jieba.load_userdict(wcdict2)
wordsls = jieba.lcut(txt)
wcdict = {}
for word in wordsls:
if word not in wcdict1:
if len(word)==1:
continue
else:
wcdict[word]=wcdict.get(word,0)+1
wails=list(wcdict.items())
wails.sort(key=lambda x:x[1], reverse=True)
cut_text = " ".join(wordsls)
'print(cut_text)'
mywc = WordCloud(font_path = 'msyh.ttf').generate(cut_text)
plt.imshow(mywc)
plt.axis("off")
plt.show()
for i in range(25):
print(wails[i])