scrapy抓取数据
1.网站分析
关于scrapy爬虫架构和语法的介绍在之前的文章有讲过,本节主要分析爬虫的设计细节和代码结构。
http://www.stat-nba.com/网站对爬虫很友好,表格数据结构清晰,非常容易爬取,而且没有限制频繁访问和下载条数,所以直接写爬虫就好了。
我抓取的数据是,球员列表(http://www.stat-nba.com/playerList.php)里展示的所有球员的详细数据。
详细数据页面,以詹姆斯为例http://www.stat-nba.com/player/1862.html,有五个纬度的数据表格,分别是场均数据,总计数据,单场最高,进阶数据(一),进阶数据(二),注意到这其实是一张表格,列主键可以看作是赛季,每个表格包括球员的全部赛季值,所以各表行数相同,可以当作是表格太宽,做了分表处理,实际上我们可以用一个大的对象整合所有表的列做字段。但是在网页dom上还是要对各个表去做抽取,本次主要抽取了第一四五个,总计数据和单场最高对后面的数据分析影响不大,有需要的可以按照代码结构再拓展。
2.爬虫设计
item对象,把三个表的列去重作为要爬取的字段。
抓取球员列表和详细数据,需要两层循环,第一层:遍历球员列表,获取href属性拼接url,发送请求获取球员详细信息;第二层:详细信息页面,遍历三个表的tr、td,这里注意每一条item数据应该是对应三个表的第一条数据的汇总,再各个td取值。针对上个问题,可以分别做json映射,以要取的列所在表的下标为键,列名为值,分别做遍历即可了。映射的好处是做viewmodel,不用再判断名称,直接取键值就可以,而且字段个数多,提出来放json里,代码更容易维护。
还有些小细节,根据球员的数据特点大概分两种,一种是数值,比如得分,篮板;一种是百分比,命中率,失误率。所以命名时可以加类似”_rate”后缀作区分,便于理解。
数据文件:球星数据
代码链接:nba_stat爬虫