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

Karen110
• 阅读 1640

大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑NBA官网数据。 并且将数据写入Excel中同时自动生成折线图,主要有以下几个步骤。

实战|手把手教你用Python爬取存储数据,还能自动在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 BeautifulSoup  
import requests  
import xlsxwriter  
import os  

查看URL1源代码代码,可以看到球队名词及其对应的URL2在span标签中<span class><a href = “...">下,进而找到它的父框与祖父框,下面的思路都是如此,图如下:实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!

此时,可以通过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中<a target = "_blank" href = ....>下,同时也存放着对应球员的URL3,如下图:实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!

此时,故依然通过requests模块与bs4模块进行相对应的索引,得到球员名称列表以及对应的URL3。

#自定义函数获取队员列表和对应的URL  
def 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下,如下图:实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!

同样,依然通过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中的所有球队的标准名称;

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

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

可视化部分

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

自定义函数创建表格,运用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=0  
    for 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()  

数据表格效果展现,以詹姆斯为例如下实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!

并且此时打开自动生成的Excel,对应的折线图就直接展现出来,无需再次整理!实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!

现在结合任务一的网络爬虫与任务二的数据可视化,可以得到实时的球员常规赛数据与季后赛数据汇总,同时还有实时球员生涯折线图。便可以与上次的GUI界面任务设计中的”可视化“按钮事件绑定,感兴趣的读者可以自己进一步研究!

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

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

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/RbNfb0WCuadqsl4wFXedzg,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
菜鸟阿都 菜鸟阿都
2年前
创建免费ip代理池
&ensp;&ensp;&ensp;&ensp; 反爬技术越来越成熟,为了爬取目标数据,必须对爬虫的请求进行伪装,骗过目标系统,目标系统通过判断请求的访问频次或请求参数将疑似爬虫的ip进行封禁,要求进行安全验证,通过python的第三方库faker可以随机生成header伪装请求头,并且减缓爬虫的爬取速度,能很好的避过多数目标系统的反扒机制,但对一些安全等级
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
python爬虫增加多线程获取数据
Python爬虫应用领域广泛,并且在数据爬取领域处于霸主位置,并且拥有很多性能好的框架,像Scrapy、Request、BeautifuSoap、urlib等框架可以实现爬行自如的功能,只要有能爬取的数据,Python爬虫均可实现。数据信息采集离不开Pyt
Aidan075 Aidan075
3年前
如何用python进行数据分析——00环境配置
↑一个宝藏公众号,长的好看的人都关注了 简单介绍一下Python吧Python是一种面向对象程序设计语言,由荷兰人吉多·范罗苏姆于19
Wesley13 Wesley13
2年前
50 行代码教你爬取猫眼电影 TOP100 榜所有信息
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫架构中的HTML下载器、HTML解析器、数据存储器三大模块:HTML下载器:利用requests模块下载HTML网页;HTML解析器:利用re正则表达
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
安居客房源信息获取
最近身边有几个做房产销售的朋友经常在诉苦,找不到客户,没有业绩,所以就比较好奇他们现在的行情,所以今天我们就使用python获取下安居客的一些房源数据。之前分享过很多关于爬虫的实践示例,今天这个也算是实践内容。我们就以户型结构、装修情况、水肥情况进行房源数据获取。爬取数据的通用流程:1、根据url请求页面,获取页面响应对象2、将页面响应对象转化为对象3、定
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这