点击上方“迷途小球迷”,关注并“星标”
每日接收Python干货!
喜欢NBA的朋友可能知道有个非常全面和专业的NBA中文数据库--Stat-NBA
上面不仅有所有球队球员的各项数据,还统计了从NBA创立的的1946年来的所有数据,还是中文版本的,还可以通过各种筛选进阶数据。但如果想要下载来自己分析,就比较麻烦。今天就专门写一个python如何获取stat-nba数据的教程,并用工具做一个简单的动态变化图。视频效果:
01
选取数据
说到NBA数据,很多人首先想到的是得分榜,那今天我们就拿历年来的得分榜前10数据。
http://www.stat-nba.com/season/1946.html
这个页面可以获取到每个赛季的各项排行榜,而且重点是URL非常友好,使用的后缀是年份,这样我们只需要遍历所有年份的URL即可。
02
基本思路
将要获取的目标网页的html源码保存起来;
再使用etree进行提取页面element,etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法;
最后将获取到数据按照要求格式保存到dataframe中;
最后使用花火在线生成动态图工具
使用的第三方包有:requests,lxml中的etree,pandas
03
流程与代码
# 将要获取的目标网页的html源码保存起来,这时候保存的html源码是字符串格式url = 'http://www.stat-nba.com/season/1946.html'r = requests.get(url,verify=False)html = r.content.decode('utf-8')print(html)
# 再使用etree进行提取页面element,etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符html = etree.HTML(html)print(type(html))print(html)
获取到页面源码的element格式后,可以使用xpath轻松提前指定标签下的内容。从图中可以看出,得分榜的内容存放在一个div中,id=“allpts0"中,球员名称和数据存放在下面的div class='content'中,总共10个,那我们只需要把这10个标签下面的a和p标签内容获取到即可:
# 使用html.xpath()提取指定标签的文本内容,xpath标签获取方式,可以在谷歌浏览器中,比如在上图的”乔福尔克斯“上面右键,# 选择copy-》copy xpath,即可得到://*[@id="allpts0"]/div[1]/div[1]/aplayer = html.xpath('//*[@id="allpts0"]/div[1]/div[1]/a')[0].textprint(player)
# 然后就可以将10个球员的数据都保存到字典rankrank = {}for i in range(1,11): player = html.xpath('//*[@id="allpts0"]/div[1]/div[{}]/a'.format(str(i)))[0].text data = float(html.xpath('//*[@id="allpts0"]/div[1]/div[{}]/p'.format(str(i)))[0].text.strip()) # 转化成数值 rank[player] = dataprint(rank){'乔-福尔克斯': 23.2, '鲍伯·菲里克': 16.8, '艾德-萨多夫斯基': 16.5, '斯坦-马赛克': 14.9, '马克斯尔-扎斯洛夫斯基': 14.4, '厄尔尼-卡尔费里': 14.3, '库尔比-贡特尔': 14.1, '弗兰克-鲍姆霍尔特兹': 14.0, '莱奥-默古斯': 13.0, 'Chick Halbert': 12.7}
接下来,可以批量获取全部年份的得分榜数据
df = pd.DataFrame()for i in range(1946,2020): url = 'http://www.stat-nba.com/season/{}.html' url = url.format(str(i)) r = requests.get(url,verify=False) html = r.content.decode('utf-8') html = etree.HTML(html) rank = {} for j in range(1,11): player = html.xpath('//*[@id="allpts0"]/div[1]/div[{}]/a'.format(str(j)))[0].text data = float(html.xpath('//*[@id="allpts0"]/div[1]/div[{}]/p'.format(str(j)))[0].text.strip()) # 转化成数值 rank[player] = data print(rank) df = df.append(pd.DataFrame(index=[i],data=rank))
最终的数据是:
为了按照工具的数据格式要求,只需要稍微转置一下:
df.T.to_excel('ptsrank.xlsx','utf-8-sig')
04
上传数据制作视频
火花的URL:https://hanabi.data-viz.cn/templates
选择动态条形图即可。注:火花很多图表是付费的,免费的可以使用Flourish。
制作完成,导出即可。如对数据或者代码有兴趣,请联系小编微信
声明
1.本数据分析只做学习研究之用途,勿用他途,提供的结论仅供参考;
2.公开数据不建议抓取太多,以免对服务器造成负担,如有侵权,马上删除