nba比赛数据可视化专题(一):scrapy框架数据爬取
优采云 发布时间: 2022-07-03 05:27nba比赛数据可视化专题(一):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常规赛数据就被我们拿到啦~