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

大家好,我们来探讨如何爬取虎扑NBA官网数据,并且将数据写入Excel中同时自动生成折线图,主要有以下几个步骤:


本文将分以下两个部分进行分别讲解:

在虎扑NBA官网球员页面中进行爬虫,获取球员数据。

清洗整理爬取的球员数据,对其进行可视化。

项目主要涉及的Python模块:

requests
pandas
bs4

爬虫部分

爬虫部分整理思路如下

观察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标签中<span class><a href = “...">下,进而找到它的父框与祖父框,下面的思路都是如此,图如下:

此时,可以利用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') 
forlable inlables: 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

推荐 :020 持续更新,精品小圈子每日都有新内容,干货浓度极高。
结实人脉、讨论技术 你想要的这里都有!
抢先入群,跑赢同龄人!(入群无需任何费用)
点击此处,与Python开发大牛一起交流学习。
群号:745895701
申请即送:
Python软件安装包,Python实战教程
资料免费领取,包括 Python基础学习、进阶学习、爬虫、人工智能、自动化运维、自动化测试等

就此得到了对应球队的URL2,接着观察URL2网页的内容,可以看到球员名称在标签a中<a target = "_blank" href = ....>下,同时也存放着对应球员的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_textdata.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中的所有球队的标准名称;

通过指定的一只球队获取球队中所有球员的标准名称;

通过指定的球员获取到对应的基本信息以及常规赛与季后赛数据;

可视化部分

思路:创建文件夹 创建表格和折线图

自定义函数创建表格,运用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):  
#此为表格名称——球员名称+chartEXCEL=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))//18a=0
for i in range(num):a=a+18c=a+18i=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界面任务设计中的”可视化“按钮事件绑定,感兴趣的读者可以自己进一步研究!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容