django获取div id_手把手教你用Python获取最全NBA数据

点击上方“迷途小球迷”,关注并“星标”

每日接收Python干货!

喜欢NBA的朋友可能知道有个非常全面和专业的NBA中文数据库--Stat-NBA

3eceede813442936c3d9565b89c2eecc.png

上面不仅有所有球队球员的各项数据,还统计了从NBA创立的的1946年来的所有数据,还是中文版本的,还可以通过各种筛选进阶数据。但如果想要下载来自己分析,就比较麻烦。今天就专门写一个python如何获取stat-nba数据的教程,并用工具做一个简单的动态变化图。视频效果:

01

选取数据

说到NBA数据,很多人首先想到的是得分榜,那今天我们就拿历年来的得分榜前10数据。

http://www.stat-nba.com/season/1946.html

ce5338e4583f908971861f28ac2a6ee9.png

这个页面可以获取到每个赛季的各项排行榜,而且重点是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)

8a657c240c426c4ad72cb58c1dea9ec1.png

# 再使用etree进行提取页面element,etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符html = etree.HTML(html)print(type(html))print(html)

566d5ca07f67307785505d92a244f487.png

获取到页面源码的element格式后,可以使用xpath轻松提前指定标签下的内容。从图中可以看出,得分榜的内容存放在一个div中,id=“allpts0"中,球员名称和数据存放在下面的div class='content'中,总共10个,那我们只需要把这10个标签下面的a和p标签内容获取到即可:

3209c604b382c20134f763cc5d6bd346.png

# 使用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))

最终的数据是:

1d9ef6349ed73deb40629eb5efec50c7.png

为了按照工具的数据格式要求,只需要稍微转置一下:

df.T.to_excel('ptsrank.xlsx','utf-8-sig')

04

上传数据制作视频

火花的URL:https://hanabi.data-viz.cn/templates

选择动态条形图即可。注:火花很多图表是付费的,免费的可以使用Flourish。

619fa834de8bd48242906596bc75e1b4.png

制作完成,导出即可。如对数据或者代码有兴趣,请联系小编微信

18d84f771f4fc484ab3a769d71b0b40a.gif

声明

1.本数据分析只做学习研究之用途,勿用他途,提供的结论仅供参考;

2.公开数据不建议抓取太多,以免对服务器造成负担,如有侵权,马上删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值