社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化

CDA数据分析师 • 4 年前 • 790 次点击  

来源 | 早起Python
大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑NBA官网数据,并且将数据写入Excel中同时自动生成折线图,主要有以下几个步骤:
本文将分为以下两个部分进行讲解:
  • 在虎扑NBA官网球员页面中进行爬虫,获取球员数据。
  • 清洗整理爬取的球员数据,对其进行可视化。
项目主要涉及的Python模块:
  • requests
  • pandas
  • bs4

 01 
爬虫部分

爬虫部分整理思路如下👇
观察URL1的源代码找到球队名称与对应URL2观察URL2的源代码找到球员对应的URL3观察URL3源代码找到对应球员基本信息与比赛数据并进行筛选存储
其实爬虫就是在html上操作,而html的结构很简单就只有一个,就是一个大框讨一个小框,小框在套小框,这样的一层层嵌套。
目标URL如下:
  • URL1:http://nba.hupu.com/players/
  • URL2(此处以湖人球队为例):https://nba.hupu.com/players/lakers
  • URL3(此处以詹姆斯为例):https://nba.hupu.com/players/lebronjames-650.html
先引用模块
from bs4 import BeautifulSoupimport requestsimport xlsxwriterimport os
查看URL1源代码代码,可以看到球队名词及其对应的URL2在span标签中下,进而找到它的父框与祖父框,下面的思路都是如此,图如下:

此时,可以通过requests模块与bs4模块进行有目的性的索引,得到球队的名称列表。
def Teamlists(url): TeamName=[] TeamURL=[] GET=requests.get(URL1) soup=BeautifulSoup(GET.content,'lxml') lables=soup.select('html body div div div ul li span a') for lable in lables: ballname=lable.get_text() TeamName.append(ballname) print(ballname) teamname=input("请输入想查询的球队名:")#此处可变为GUI界面中的按键值 c=TeamName.index(teamname)for item in lables: HREF=item.get('href') TeamURL.append(HREF) URL2=TeamURL[c] return URL2
就此得到了对应球队的URL2,接着观察URL2网页的内容,可以看到球员名称在标签a中下,同时也存放着对应球员的URL3,如下图:
此时,故依然通过requests模块与bs4模块进行相对应的索引,得到球员名称列表以及对应的URL3。
#自定义函数获取队员列表和对应的URLdef playerlists(URL2): PlayerName=[] PlayerURL=[] GET2=requests.get(URL1) soup2=BeautifulSoup(GET2.content,'lxml') lables2=soup2.select('html body div div table tbody tr td b a')for lable2 in lables2: playername=lable2.get_text() PlayerName.append(playername) print(playername) name=input("请输入球员名:") #此处可变为GUI界面中的按键值 d=PlayerName.index(name)for item2 in lables2: HREF2=item2.get('href') PlayerURL.append(HREF2) URL3=PlayerURL[d]return URL3,name
现在就此得到了对应球队的URL3,接着观察URL3网页的内容,可以看到球员基本信息在标签p下,球员常规赛生涯数据与季后赛生涯数据在标签td下,如下图:
同样,依然通过requests模块与bs4模块进行相对应的索引,得到球员基本信息与生涯数据,而对于球员的常规赛与季候赛的生涯数据将进行筛选与储存,得到data列表。
def Competition(URL3):data=[] GET3=requests.get(URL3) soup3=BeautifulSoup(GET3.content,'lxml') lables3=soup3.select('html body div div div div div div div div p') lables4=soup3.select('div div table tbody tr td')for lable3 in lables3: introduction=lable3.get_text() print(introduction) #球员基本信息for lable4 in lables4: competition=lable4.get_text()data.append(competition) for i in range(len(data)):if data[i]=='职业生涯常规赛平均数据': a=data[i+31] a=data.index(a) del(data[:a]) for x in range(len(data)):if data[x]=='职业生涯季后赛平均数据': b=data[x] b=data.index(b) del(data[b:])return data
通过上述网络爬虫得到了以下的数据,提供可视化数据的同时便于绑定之后的GUI界面按键事件:
  • 获取NBA中的所有球队的标准名称;
  • 通过指定的一只球队获取球队中所有球员的标准名称;
  • 通过指定的球员获取到对应的基本信息以及常规赛与季后赛数据;

 02 
可视化部分

思路:创建文件夹 创建表格和折线图
自定义函数创建表格,运用os模块进行编写,返回已创文件夹的路径,代码如下:
def file_add(path): #此时的内函数path可与GUI界面的Statictext绑定 creatpath=path+'\\Basketball'try:if not os.path.isdir(creatpath): os.makedirs(creatpath) except: print("文件夹存在")return creatpath
运用xlsxwriter模块在creatpath路径下自定义函数创建excel表格同时放入数据与构造折线图,代码如下:
def player_chart(name,data,creatpath):#此为表格名称——球员名称+chart EXCEL=xlsxwriter.Workbook(creatpath+'\\'+name+'chart.xlsx') worksheet=EXCEL.add_worksheet(name) bold=EXCEL.add_format({'bold':1}) headings=data[:18] worksheet.write_row('A1',headings,bold) #写入表头 num=(len(data))//18 a=0for i in range(num): a=a+18 c=a+18 i=i+1 worksheet.write_row('A'+str(i+1),data[a:c]) #写入数据 chart_col = EXCEL.add_chart({'type': 'line'}) #创建一个折线图 chart_col.add_series({'name': '='+name+'!$R$1', #设置折线描述名称'categories':'='+name+'!$A$2:$A$'+str(num), #设置图表类别标签范围'values': '='+name+'!$R$2:$R$'+str(num-1), #设置图表数据范围'line': {'color': 'red'}, }) #设置图表线条属性 #设置图标的标题和想x,y轴信息 chart_col.set_title({'name': name+'生涯常规赛平均得分'}) chart_col.set_x_axis({'name': '年份 (年)'}) chart_col.set_y_axis({'name': '平均得分(分)'}) chart_col.set_style(1) #设置图表风格 worksheet.insert_chart('A14', chart_col, {'x_offset':25, 'y_offset':3,}) #把图标插入工作台中并设置偏移 EXCEL.close()
数据表格效果展现,以詹姆斯为例如下
并且此时打开自动生成的Excel,对应的折线图就直接展现出来,无需再次整理!
现在结合任务一的网络爬虫与任务二的数据可视化,可以得到实时的球员常规赛数据与季后赛数据汇总,同时还有实时球员生涯折线图。便可以与上次的GUI界面任务设计中的”可视化“按钮事件绑定,感兴趣的读者可以自己进一步研究!

 

推荐阅读



 

CDA课程咨询

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/100139
 
790 次点击