当前位置: 首页 > 编程日记 > 正文

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

来源 | 早起Python

大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑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') 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,如下图:

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

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

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

 可视化部分

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

自定义函数创建表格,运用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界面任务设计中的”可视化“按钮事件绑定,感兴趣的读者可以自己进一步研究!

更多精彩推荐
  • 【官方福利】CSDN内测师限时申请,参与赢年末礼包

  • GitHub标星7000+,快速恢复像素化图像,效果惊人

  • 赠书 | AI 还原宋代皇帝,原来这么帅?!

  • 红帽"干掉" CentOS 8,CentOS Stream 上位

  • 对标鸿蒙 OS,Google 下一代操作系统 Fuchsia 源码公开!

相关文章:

删除SQL数据库中事务日志方法

DUMP TRANSACTION [数据库名] WITH NO_LOG BACKUP LOG [数据库名] WITH NO_LOG DBCC SHRINKDATABASE([数据库名])

新浪微博应用 IE下面框架嵌套框架的问题解决

新浪微博应用 IE下面框架嵌套框架的问题分为两种&#xff1a;1、回调的参数有误&#xff1b;2、session丢失&#xff1b;第一个问题&#xff0c;需要亲们仔细研读接口文档&#xff0c;App.AuthDialog.show({client_id : <?php echo $this->getParam(sub_appkey);?>,…

corosync+pacemaker+crm简单配置

# 系统 centos7.2 安装版本都是Yum源node1: 192.168.8.111 node2:192.168.8.112 vip :192.168.8.200nfs :192.168.8.113 # 互信~] ssh-keygen~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys~]# chmod go .ssh/authorized_keys~]# scp -p .ssh/i…

给AI系统做“安全体检”,阿里安全提出自动化AI对抗平台CAA | AAAI 2021

出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;安全人员曾为某车企自动驾驶系统做过一次安全测试&#xff0c;用物理对抗攻击欺骗Autopilot车道检测系统&#xff0c;导致汽车在Autopilot不发出警告的情况下驶入错误车道。假如这是一场真实的攻击&#xf…

linux新建文件权限问题

touch /etc/init.d/httpdchmod 755 /etc/init.d/httpdtouch可以新建一个空文件&#xff0c;可以修改文件的创建时间。比如&#xff1a;编译时看到提示文件的时间为将来的时间&#xff0c;可以使用touch命令来修改。Linux chmod 755和chmod 777 在linux终端先输入ls -al,可以看到…

基于MMSeg算法的中文分词类库

最近在实现基于lucene.net的搜索方案&#xff0c;涉及中文分词&#xff0c;找了很多&#xff0c;最终选择了MMSeg4j&#xff0c;但MMSeg4j只有Java版&#xff0c;在博客园上找到了*王员外*(http://www.cnblogs.com/land/archive/2011/07/19/mmseg4j.html )基于Java版的翻译代码…

关于git bush 中不能复制黏贴的问题

如果你是一个新手的话&#xff0c;在你使用个git的过程中&#xff0c;你会发现git 竟然不能复制黏贴&#xff0c;这简直是完全不能忍受的事&#xff0c;复制黏贴可以大大的节省了我们敲代码的时间&#xff0c;特别是在github中clone别人的仓库到本地&#xff0c;url地址需要一个…

linux系统proc目录进程信息详解

Proc 文件系统是一个实时的&#xff0c;常驻内存的文件系统&#xff0c;它跟踪进程在你机器上的运行情况和你系统的状态。/proc文件系统是常驻虚拟内存并且维持着操作系统的动态数据。大部分的 /proc文件系统信息被实时更新来与当前操作系统的状态一致。/proc文件系统的内容能被…

AI开源评测基准AI-Rank,为开源建立标准

当前&#xff0c;数字经济已经成为经济发展的活力引擎和促进经济结构转型升级的重要动能&#xff0c;深刻改变着人类的生产生活方式。12月11日&#xff0c;2020中关村大数据日暨数字经济融合创新发展论坛在北京举行。本届中关村大数据日以“开源共享 生态赋能”为主题&#xff…

Linux 汇编语言开发指南

Linux 汇编语言开发指南肖文鹏 (xiaowp263.net), 北京理工大学计算机系硕士研究生本文作者 肖文鹏是北京理工大学计算机系的一名硕士研究生&#xff0c;主要从事操作系统和分布式计算环境的研究&#xff0c;喜爱Linux和Python。你可以通过 xiaowp263.net与他取得联系。 简介&am…

拦截器与filter的区别

在接触拦截器和filter以来&#xff0c;觉得这两者有太多相似之处&#xff0c;都是运用aop的思想处理事情&#xff0c;但是这两者到底有什么区别倒一直很模糊&#xff0c;今天看书的时候&#xff0c;终于看到自己满意的解答了&#xff0c;赶紧记录下来&#xff1a;1.使用范围不同…

湘苗培优 | 从入门到精通

缘起2020年长沙发出软件再出发号召&#xff0c;同时发布了《长沙市软件和信息技术服务业发展三年(2020-2022 年)行动计划》。当软件产业的生态逐渐建立&#xff0c;企业孵化培育的土壤逐渐肥沃&#xff0c;长沙软件产业焕发出前所未有的活力和生机&#xff0c;一大批软件产业项…

HBase scan setBatch和setCaching的区别

2019独角兽企业重金招聘Python工程师标准>>> HBase的查询实现只提供两种方式&#xff1a; 1、按指定RowKey获取唯一一条记录&#xff0c;get方法&#xff08;org.apache.hadoop.hbase.client.Get&#xff09; 2、按指定的条件获取一批记录&#xff0c;scan方法&…

3行Python代码就能获取海量数据?

一谈起数据分析&#xff0c;首先想到的就是数据&#xff0c;没有数据&#xff0c;谈何分析。毕竟好的菜肴&#xff0c;没有好的原材料&#xff0c;是很难做的&#xff5e;所以本期小F就给大家分享一个获取数据的方法&#xff0c;只需三行代码就能搞定。「GoPUP」&#xff0c;大…

c语言中int和指针和字符所占字节

Linux下 sizeof(int);int 4字节 sizeof(char);字符1字节 char * p"12345"; sizeof(p);指针占4字节

SCCM 2012 SP1系列(七)分发部署exe软件

2、exe软件分发以skydrive为例&#xff0c;打开SCCM控制台&#xff0c;展开应用程序管理&#xff0c;右键“包”选择“创建包”打开创建包和应用程序向导&#xff0c;填写部署包的相关信息&#xff0c;勾选“此包包含源文件”&#xff0c;然后点击“浏览”选择sykdrive文件位置…

关于勒索病毒的防御

关于勒索病毒的防御Windows的445漏洞与139漏洞由来已久&#xff0c;大面积暴发只是迟早的事情。关于防御方法其实也有很多&#xff0c;早就满地都是了。但是快速、大量、不断网的部署防御却不容易。比如使用端口排除、删除文件与打印共享服务、修改注册表、使用防火墙、以及组策…

linux的根文件系统中的proc文件夹详解

什么是proc文件系统 |linux /proc目录介绍&#xff5c;proc中文手册proc文件系统是一个伪文件系统&#xff0c;它只存在内存当中&#xff0c;而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息&#xff0c;…

学习C语言必须知道的理论知识(第一章)

计算机语言:人和计算机都能识别的语言。 程序:就是一组计算机能识别和执行的指令叫做程序。 程序设计:从确定任务到得到结果&#xff0c;写出文档的全过程。 机器指令&#xff1a;计算机能直接识别和接受的二进制代码称为机器指令&#xff08;machine instruction&#xff09; …

赠书 | 实现病人数据自动分析建模,Python能做的比你想象得更多

者 | 李秋键责编 | 晋兆雨头图 | CSDN下载自视觉中国*文末有赠书福利数据表格整理等作为我们工作学习生活中最为繁琐和无趣的任务之一&#xff0c;消耗掉了我们的大多数时间。而今天我们就将利用Python对病人数据进行建模&#xff0c;并自动生成表单&#xff0c;从而节省了我们…

Java中元组的使用

元组在计算机领域有着特殊的意义&#xff0c;这个名字听起来似乎有些陌生&#xff0c; 平时在写代码也基本没什么应用场景&#xff0c; 然而&#xff0c; 出人意料的是&#xff0c; 元组跟程序设计密切相关&#xff0c; 可能有的同学不知道&#xff0c; 关系数据库中的「纪录」…

「修炼开始」一文带你入门深度学习

来源 | Jack Cui责编 | Carol封图 | CSDN下载自视觉中国前言图解 AI 算法系列教程&#xff0c;不仅仅是涉及深度学习基础知识&#xff0c;还会有强化学习、迁移学习等&#xff0c;再往小了讲就比如拆解目标检测算法&#xff0c;对抗神经网络&#xff08;GAN&#xff09;等等。难…

Lucene.net中文分词探究

一、中文分词方式&#xff1a; 中文分词几种常用的方式&#xff1a; A&#xff0e; 单字分词 单字分词&#xff0c;顾名思义&#xff0c;就是按照中文一个字一个字地进行分词。如&#xff1a;我们是中国人&#xff0c;效果&#xff1a;我/们/是/中/国/人。 B&#xff0e; …

httpd服务相关实验

实验环境&#xff1a; CentOS6.8 1、连接测试&#xff1a; 在/etc/httpd/conf/httpd.conf telnet 172.16.252.242 80 GET /index.html HTTP/1.1 Host: 172.16.252.242 # KeepAlive: Whether or not to allow persistent connections (more than # one request per connection).…

WMI使用集锦

1.WMI简介WMI是英文Windows Management Instrumentation的简写&#xff0c;它的功能主要是&#xff1a;访问本地主机的一些信息和服务&#xff0c;可以管理远程计算机&#xff08;当然你必须要拥有足够的权限&#xff09;&#xff0c;比如&#xff1a;重启&#xff0c;关机&…

基于Ubuntu交叉编译FFmpeg Windows SDK

写在前面 FFmpeg是一个开源且跨平台的音视频解决方案&#xff0c;集采集、转码、流式化为一身&#xff0c;项目的libavcodec编解码模块和libavformat媒体格式模块&#xff0c;支持非常非常丰富的编解码格式和容器封装格式&#xff0c;是做媒体相关开发工作必须要掌握和借鉴的一…

未来2年,程序员如何吊打高学历工程师?服气!

人工智能已成为新时代的风向标&#xff0c;如果你是对人工智能感兴趣的互联网工作者、大学生、研究生并期望在 AI 方向发展&#xff0c;建议你一定要深入学习一下人工智能。因为&#xff0c;未来将是人工智能的时代&#xff01;为什么会有这个判断呢&#xff1f;第一&#xff0…

元素宽高的获取

elem.clientWidth/Height 获取某个元素可视区的宽高&#xff08;不包括边框&#xff09;&#xff1b; elem.offsetWidth/Height 获取某个元素的宽高&#xff08;计算边框&#xff09;&#xff1b; 当元素有padding值时&#xff0c;上面两个方法获取的值都包括padding。 doc…

VC++技术内幕(三)

C*View <- Cview <- CWnd <- Cobject C*View 两个最重要的基类&#xff1a;CView和CWnd,CWnd提供了C*View的”窗口属性”&#xff0c;CView则提供了它和应用程序框架其他部分间的联系。 在视窗内绘图&#xff1a; OnDraw成员函数&#xff1a; 是CView类中的虚成员函数…

用ASP.NET如何读取NT用户名

公司有个最近要开发一个小系统,是采用ASP.NET开发,现在被一难题卡住了. 需实现功能: 用户登录进来后系统自动取得用户名&#xff0c;这样就不用用户再登录了&#xff0c; 方便用户使用&#xff0c;并根据用户名取他的权限. 难点: 现在读NT用户名读不倒. 折腾了大半…