本次我们将爬取Ajax动态加载数据并进行简单数据分析,其主要方式是找到数据的json包,将其保存到本地目录,进行数据分析

文章目录

  • 一、业务分析
  • 二、步骤
    • 1.找到数据
    • 2.抓取数据
    • 3.分析数据
  • 总结

一、业务分析

目标网站:NBA中国官方网站https://china.nba.com/statistics/
爬取字段:

使用到的库:requests, json,csv,pandas numpy ,matplotlib
其中requests,json进行数据抓取
cxv保存到本地
pandas,numpy进行数据分析
matplotlib可视化

二、步骤

1.找到数据

首先,我们要找到储存数据的json包,F12进入开发者模式

点击网络,选择XHR,进行刷新,就可以看到json包了

这里我们可以得到请求头信息以及json包

这就是一会儿要抓取的数据

2.抓取数据

这里我选择了抓取本赛季前50球员的数据,在json包中寻找,可以看到

这里存放的是本赛季的数据
导入库

import requests
import json
import csv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

先定义抓取json包方法

def getJson(url):headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.53'}response = requests.get(url,headers=headers)json_data = json.loads(response.text)return json_data

定义抓取数据的方法

def  getData(json_data):playerList=[]for item in json_data['payload']['players']:player_dataDict={}#球员名字name=item['playerProfile']['code']#出场次数games=item['statAverage']['games']#先发gamesStarted=item['statAverage']['gamesStarted']#分钟mins=item['statAverage']['minsPg']#三分命中tpm=item['statAverage']['tppct']#罚球命中ftm=item['statAverage']['ftpct']#进攻offRebs=item['statAverage']['offRebsPg']#防守defRebs=item['statAverage']['defRebsPg']#篮板rebs=item['statAverage']['rebsPg']#助攻assists=item['statAverage']['assistsPg']#抢断steals=item['statAverage']['stealsPg']#盖帽blocks=item['statAverage']['blocksPg']#失误turnovers=item['statAverage']['turnoversPg']#犯规fouls=item['statAverage']['foulsPg']#得分points=item['statAverage']['pointsPg']player_dataDict['球员']=nameplayer_dataDict['场次']=gamesplayer_dataDict['先发']=gamesStartedplayer_dataDict['出场时间']=minsplayer_dataDict['三分命中率']=tpmplayer_dataDict['罚球命中率']=ftmplayer_dataDict['进攻效率']=offRebsplayer_dataDict['防守效率']=defRebsplayer_dataDict['篮板']=rebsplayer_dataDict['助攻']= assistsplayer_dataDict['抢断']=stealsplayer_dataDict['盖帽']=blocksplayer_dataDict['失误']=turnoversplayer_dataDict['犯规']=foulsplayer_dataDict['得分']=pointsprint(player_dataDict)playerList.append(player_dataDict) return playerList

接下来进行存储

def writeData(playerList):#写入数据with open('player_data.csv','w',encoding='utf-8',newline='')as f:write=csv.DictWriter(f, fieldnames=['球员','场次','先发','出场时间','三分命中率','罚球命中率','进攻效率','防守效率','篮板','助攻','抢断','盖帽','失误','犯规','得分'])write.writeheader()for each in playerList:write.writerow(each)

完整代码

import requests
import json
import csv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
url='https://china.nba.com/static/data/league/playerstats_All_All_All_0_All_false_2021_2_All_Team_points_All_perGame.json'
def getJson(url):headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.53'}response = requests.get(url,headers=headers)json_data = json.loads(response.text)return json_data
def  getData(json_data):playerList=[]for item in json_data['payload']['players']:player_dataDict={}#球员名字name=item['playerProfile']['code']#出场次数games=item['statAverage']['games']#先发gamesStarted=item['statAverage']['gamesStarted']#分钟mins=item['statAverage']['minsPg']#三分命中tpm=item['statAverage']['tppct']#罚球命中ftm=item['statAverage']['ftpct']#进攻offRebs=item['statAverage']['offRebsPg']#防守defRebs=item['statAverage']['defRebsPg']#篮板rebs=item['statAverage']['rebsPg']#助攻assists=item['statAverage']['assistsPg']#抢断steals=item['statAverage']['stealsPg']#盖帽blocks=item['statAverage']['blocksPg']#失误turnovers=item['statAverage']['turnoversPg']#犯规fouls=item['statAverage']['foulsPg']#得分points=item['statAverage']['pointsPg']player_dataDict['球员']=nameplayer_dataDict['场次']=gamesplayer_dataDict['先发']=gamesStartedplayer_dataDict['出场时间']=minsplayer_dataDict['三分命中率']=tpmplayer_dataDict['罚球命中率']=ftmplayer_dataDict['进攻效率']=offRebsplayer_dataDict['防守效率']=defRebsplayer_dataDict['篮板']=rebsplayer_dataDict['助攻']= assistsplayer_dataDict['抢断']=stealsplayer_dataDict['盖帽']=blocksplayer_dataDict['失误']=turnoversplayer_dataDict['犯规']=foulsplayer_dataDict['得分']=pointsprint(player_dataDict)playerList.append(player_dataDict) return playerList
def writeData(playerList):#写入数据with open('player_data.csv','w',encoding='utf-8',newline='')as f:write=csv.DictWriter(f, fieldnames=['球员','场次','先发','出场时间','三分命中率','罚球命中率','进攻效率','防守效率','篮板','助攻','抢断','盖帽','失误','犯规','得分'])write.writeheader()for each in playerList:write.writerow(each)
if __name__ == "__main__":json_data = getJson(url)playerList=[]playerList += getData(json_data)writeData(playerList)

3.分析数据

数据都存放到本地了,我们当然可以为所欲为
这里我们选取了几个字段,生成了每个球员的雷达图,方便进行比较

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdf=pd.read_csv('player_data.csv')
for i in range(50):x=df.loc[i]name=x.loc[['球员']]y=x.loc[['犯规','篮板','助攻','抢断','盖帽','失误']]labels=np.array(['犯规','篮板','助攻','抢断','盖帽','失误'])data=np.array(y)plt.rcParams['font.sans-serif']=['SimHei']angles=np.linspace(0, 2*np.pi,len(labels),endpoint=False)labels=np.concatenate((labels,[labels[0]]))data=np.concatenate((data,[data[0]]))angles=np.concatenate((angles,[angles[0]]))plt.polar(angles, data,'bo-',linewidth=1)plt.thetagrids(angles*180/np.pi,labels)plt.fill(angles, data,facecolor='b',alpha=0.25)plt.title(str(name))plt.show()


就不一个个上图了

总结

Ajax动态数据还是非常容易爬取的,同时pandas和numpy库也非常值得学习
最后一句
“湖人总冠军”

python爬虫实操|爬取nba中国官网球员数据相关推荐

  1. python 爬取NBA中国官网球员数据

    现在很多网站的数据都是通过Ajax动态加载的,我认为这恰恰降低了我们爬取的难度,因为我们无需考虑如何解析数据,只需要将json文件转换为字典形式,通过字典的键就可以取得我们所需要的数据. 爬取网站:N ...

  2. Python爬虫实战 | (1) 爬取猫眼电影官网的TOP100电影榜单

    在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的片名,主演,上映日期,评分和封面等内容. 打开猫眼Top100,分析URL的变化:发现Top ...

  3. Python爬虫之selenium爬取英雄联盟官网英雄皮肤图片下载到本地和保存到数据库

    从英雄联盟皮肤网站的网页源代码中获取不到英雄的皮肤地址 通过selenium可以轻松获取想要的内容 源码展示 from selenium import webdriver from time impo ...

  4. python爬取天眼查存入excel表格_爬虫案例1——爬取新乡一中官网2018届高考录取名单...

    有一种非常常见并且相对简单的网络爬虫,工作流程大概是这样的: 访问目标网页 提取目标网页内表格信息 写入excel文件并保存 初次实践,我决定尝试写一个这样的爬虫.经过一番构思,我准备把爬取新乡一中官 ...

  5. 【Python爬虫实战】爬取2021中国大学排名(简单)

    目录 一.准备工作 二.进行分析 三.完整代码 一.准备工作 引入如下库: import requests from bs4 import BeautifulSoup import bs4 二.进行分 ...

  6. Python爬虫实战之 爬取全国理工类大学数量+数据可视化

    上次爬取高考分数线这部分收了个尾,今天咱们来全面爬取全国各省有多少所理工类大学,并简单实现一个数据可视化.话不多说,咱们开始吧. 第一步,拿到url地址 第二步,获取高校数据 第三步,地图可视化 第四 ...

  7. python爬虫初探,爬取我爱牙齿网,存取内容

    最近散事特别多,讨厌这种每天忙碌又迷茫的生活,一直想把这篇博客写了,前几天因为一直再弄一篇OpenCv的论文,还好能发了,今天刚抽出空就写写吧. 1.栏目dom分析 前几天有个医科学校做视频通话的项目 ...

  8. python工商银行流水_python爬取银行名称和官网地址

    话不多说直接上代码: import re from urllib import request from urllib.request import urlopen import pymysql as ...

  9. Python爬虫实战演练:爬取微博大V的评论数据

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于IT共享之家 ,作者: IT共享者 理论篇 试想一个问题,如果我们要抓取某个微博大V ...

最新文章

  1. Python爬虫2-GET_POST与开发者工具
  2. Apache Kylin在绿城客户画像系统中的实践
  3. Python使用matplotlib可视化斜率图、对比同一数据对象前后(before、after)两个状态的差异(Slope Chart)
  4. 为 MySQL/MariaDB 开启 Binlog 功能
  5. html img 指定旋转角度_ALLEN老师自动化测试小课堂 | 生成HTML可视化报告的两个常见模块...
  6. Microsoft Dynamics CRM 2015 新增功能 介绍 高级查找功能
  7. tensorflow综合示例3:对结构化数据进行分类:csv keras feature_column
  8. Java解析Json
  9. 多线程之线程可见性synchronized
  10. linux服务器的又一管理利器webmin图解教程
  11. 一文弄懂特征缩放(归一化/正则化)
  12. 水经注万能地图下载器的自定义瓦片导出功能
  13. 基于89C51单片机的智能语音拨号电话
  14. 16进制颜色码对照表
  15. php的垃圾回收机制
  16. Android前景怎么样、是不是要凉了、是不是应该考虑要转行?看完你就知道
  17. 【渝粤教育】电大中专中药炮制学作业 题库
  18. 前端做大屏显示,缩放比,分辨率怎样适配?
  19. CSDN写博客出现浏览器“不支持隐私模式,需用普通模式访问”处理
  20. 头皮溢脂性皮炎推荐联合治疗:采乐50ml+希尔生100g(请看详情页)维生素B2维生素B6...

热门文章

  1. html添加一条虚线垂直的,【html问题】在网页中添加垂直分割线
  2. Docker学习总结(46)——生产环境中遇到的Docker常见异常错误总结
  3. locust安装成功为什么运行脚本后打不开页面或运行脚本会报错
  4. 深圳区块链企业在江岸区设区域总部
  5. 如何确定自己不是高智商?蒙提霍尔三扇门问题
  6. 色域空间 sRGB Adobe RGB Pro Photo RGB
  7. IT30:30岁IT男未来10年规划第3篇(2009-2020)
  8. 为某一目录创建Internet来宾账户
  9. [转]体育运动比赛英语
  10. web利用html2canvas实现截图上传图片