nba比赛数据可视化专题(一):scrapy框架数据爬取

优采云 发布时间: 2022-07-03 05:27

  nba比赛数据可视化专题(一):scrapy框架数据爬取

  由于本人对nba比赛比较感兴趣,所以出于学习驱动和爱好,针对nba有史以来的常规赛,探索一下nba比赛的变化和趋势。

  选取的数据网站是(一位大佬做的网站

  ),网站中有各种球队和球员,包括教练的统计数据。由于我们要的是比赛数据,所以后续发请求的url是选定好的,每页做多150行数据,

  (/query_team.phppage=0&QueryType=game&order=1&crtcol=tm_out&GameType=season&PageNum=150)网站统计的原因只有1985年--2020年的比赛数据,后续没有更新,不过几十年的比赛数据已经足够我们使用啦~

  打开我们需要的页面后,打开网页的检查元素,用定位我们可以发现每一行数据的每一个数据会包括在每一行tr里的td元素中,里面的文本数据就是我们想要的。

  通过对xpath方法进行解析就可以拿到我们想要的数据了

  一、新建工程以及修改配置文件

  首先定位到我们要建立工程的文件下新建一个newnbapro工程

  在工程目录下新建一个newnba爬虫文件,起始url设置为,后续可在文件中更改

  

  建立好上述过程后有如下文件

  打开settings文件并加上如下代码

  # 协议不遵从由true改为falseROBOTSTXT_OBEY = False# 不打印日志信息LOG_LEVEL = "ERROR"# 用户代理,请求头的身份标识USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51'

  注意要在settings文件下面把管道开启,注释取消掉!(血的教训,忘了注释一直在找bug

  )

  二、编写爬虫文件

  编写爬虫文件把起始url设定为指定爬取的链接,文章开头我们说到每一行数据保存在一个tr标签中,我们把tr存入列表再遍历,就可以拿到tr标签内的每一个信息,然后将所得到信息提交到管道,由于链接中不同页面page表示不同页面,所以可以采取拼接字符串方式获取其他页面的数据(全部数据共532页,79826条数据意味着1985年到2020年有79826场常规赛

  

  ),使用scrapy.Request里有个回调参数,用同样的解析方法解析其他页面的数据。

  打开item文件,把对应变量进行声明

  三、管道数据本地化存储

  把管道内的数据存储到csv格式,用对应变量接收item里的数据,话不多说,上代码

  import csvclass NewnbaproPipeline(object): def __init__(self): self.writer = csv.writer(open('datanba1.csv', 'w+', newline=''))        # 设置表头 self.writer.writerow(['number', 'name', 'time', 'result', 'home_or_out', 'game', 'total_probability', 'total_in', 'total_handout', 'three_point_probability', 'three_point_in', 'three_point_handout', 'free_throw_probability', 'free_throw_in', 'free_throw_handout','backboard', 'assist', 'steal', 'caps', 'error','foul', 'score'])<br /> # 重写父类的一个方法:该方法只在开始爬虫的时候被调用一次 def open_spider(self, spider): print('开始爬虫。。。。')<br /> def process_item(self, item, spider): number = item['number'] name = item['name'] time = item['time'] result = item['result'] home_or_out = item['home_or_out'] game = item['game'] total_probability = item['total_probability'] total_in = item['total_in'] total_handout = item['total_handout'] three_point_probability = item['three_point_probability'] three_point_in = item['three_point_in'] three_point_handout = item['three_point_handout'] free_throw_probability = item['free_throw_probability'] free_throw_in = item['free_throw_in'] free_throw_handout = item['free_throw_handout'] backboard = item['backboard'] assist = item['assist'] steal = item['steal'] caps = item['caps'] error = item['error'] foul = item['foul'] score = item['score'] rows = [number, name, time, result, home_or_out, game, total_probability, total_in, total_handout, three_point_probability, three_point_in, three_point_handout, free_throw_probability, free_throw_in, free_throw_handout, backboard, assist, steal, caps, error, foul, score] self.writer.writerow(rows) return item def close_spider(self, spider):        print('结束爬虫!!')

  四、运行爬虫程序

  在对应工程目录下输入scrapycrawl+爬虫文件名 运行爬虫程序,这里是scrapy crawl newnba,每一个响应被打印意味着该页数据被成功抓取

  运行完毕后,目录下会出现一个datanba.csv文件,

  打开后如下,包含1985年以来的nba常规赛数据就被我们拿到啦~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线