前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >scrapy框架爬取虎扑NBA球员球队数据

scrapy框架爬取虎扑NBA球员球队数据

原创
作者头像
小明要加油
发布2023-05-11 15:40:32
4780
发布2023-05-11 15:40:32
举报
文章被收录于专栏:自学的专栏

目标网站:虎扑体育

需求:使用scrapy框架爬取目标网站的数据信息 一、网页分析 首先我们打开目标网站,去到我们需要获取数据的页面,打开开发者工具,我们可以看到,实际上数据就写在源码中,这就很好获取了

二、代码实操

先创建一个scrapy项目,如何创建我就不细说了。代码如下:

代码语言:javascript
复制
class ExampleSpider(scrapy.Spider):  
  name = "example"  
  # allowed_domains = ["example.com"]  
  start_urls = ['https://nba.hupu.com/stats/players']  
  
  def parse(self, response):  
       res = response.xpath('//*[@id="data_js"]/div[4]/div')

解析网页之后,就是我们熟悉的获取数据的环节了

代码语言:javascript
复制
for i in res:  
    player_name = res.xpath('.//td[2]/a/text()').extract()  
    team_name = res.xpath('.//tr/td[3]/a/text()').extract()  
    score = res.xpath('.//tr/td[@class="bg_b"]/text()').extract()  
    hit_shoot = res.xpath('.//tr/td[5]/text()')[2:].extract()  
    hit_rate = res.xpath('.//tr/td[6]/text()')[2:].extract()  
    Hit_Three = res.xpath('.//tr/td[7]/text()')[2:].extract()  
    Three_point_rate = res.xpath('.//tr/td[8]/text()')[2:].extract()  
    Free_throw = res.xpath('.//tr/td[9]/text()')[2:].extract()  
    Free_throw_rate = res.xpath('.//tr/td[10]/text()')[2:].extract()

获取到数据之后,可以把数据提交到管道实现持久化存储

代码语言:javascript
复制
item = NbaItem()  
item['player_name'] = player_name  
item['team_name'] = team_name  
item['score'] = score  
item['hit_rate'] = hit_rate  
item['hit_shoot'] = hit_shoot  
item['Hit_Three'] = Hit_Three  
item['Three_point_rate'] = Three_point_rate  
item['Free_throw'] = Free_throw  
item['Free_throw_rate'] = Free_throw_rate  
# 提交到管道  
yield item

这里我们就需要去到items.py文件设置相关配置了,因为我们把player_name等数据提交给了管道,管道需要接收数据 ,所以需要设置相关变量去接收数据

代码语言:javascript
复制
player_name = scrapy.Field()  
team_name = scrapy.Field()  
score = scrapy.Field()  
hit_shoot = scrapy.Field()  
hit_rate = scrapy.Field()  
Hit_Three = scrapy.Field()  
Three_point_rate = scrapy.Field()  
Free_throw = scrapy.Field()  
Free_throw_rate = scrapy.Field()

在管道文件pipelines文件中,可以正式开始接收数据了,但是由于一开始,我们的获取数据的代码是写在for循环下的,这就意味着,如果后续我们需要保存文件的话,会多次打开同一个文件夹,所以这里我们需要写一个函数,使得我们只需要打开一次csv文件,该函数只在开始爬虫的时候调用一次

代码语言:javascript
复制
def open_spider(self,spider):  
print('开始爬虫。。。。。。。')  
self.fp = open('./players_data.csv','w',encoding='utf-8')  
  
def process_item(self, item, spider):  
player_name = item['player_name']  
team_name=item ['team_name']  
score= item['score']  
hit_rate= item['hit_rate']  
hit_shoot= item['hit_shoot']  
Hit_Three = item['Hit_Three']  
Three_point_rate=item['Three_point_rate']  
Free_throw=item['Free_throw']  
Free_throw_rate=item['Free_throw_rate']  
self.fp.write(','.join(player_name)+'\n'+','.join(team_name)+'\n'+','.join(score)+'\n'+','.join(hit_rate)+'\n'+','.join(hit_shoot)+'\n'+','.join(Hit_Three)+'\n'+','.join(Three_point_rate)+'\n'+','.join(Free_throw)+'\n'+','.join(Free_throw_rate))
return item

打开文件之后需要写一个函数去关上之前写的打开文件的函数

代码语言:javascript
复制
def close_spider(self,spider):  
print('结束爬虫.......')  
self.fp.close()

实现功能的代码我们就写完了,别忘了修改setting文件下的参数,当我们执行scrapy项目的时候,它会自动给我们返回日志信息,但是我们只需要得到报错的日志就可以了,因为大篇幅的日志不方便我们查看项目执行结果,我们只需要在setting文件下添加LOG_LEVEL = 'ERROR',修改ROBOTSTXT_OBEY = False,添加UA协议,开启item管道,也就是ITEM_PIPELINES 做完这些我们就可以执行程序了 爬取到的数据展示:

我们需要去jupyter notebook将爬取到的数据处理一下,通过观察不难发现,数据是按行写入的,可以把数据转置一下

代码语言:javascript
复制
data = pd.read_csv('E:/pythonfile/爬虫实例/playerdata.csv')
data = data.T
data

转置前后对比

可以看得出转置之后数据更方便我们后续处理,给所有的列增加列名,方便我们理解数据含义

代码语言:javascript
复制
data.columns=['所属球队','得分','命中-出手','命中率','命中三分','三分命中率','命中罚球','罚球命中率']

可以看到球员姓名没有被处理到,是因为默认了姓名是索引,处理代码如下

代码语言:javascript
复制
data = data.reset_index().rename(columns={'index':'球员姓名'})
data.head()

处理过后的数据就变成了这样,数据看起来更美观了,治好了我的强迫症

后续我们可以根据需求进行数据的可视化

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档