实战|手把手教你用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 源码公开!
实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化相关推荐
- 手把手教你使用Python爬取西刺代理数据,不用担心我封IP了!
/1 前言/ 前几天小编发布了手把手教你使用Python爬取西次代理数据(上篇),木有赶上车的小伙伴,可以戳进去看看.今天小编带大家进行网页结构的分析以及网页数据的提取,具体步骤如下. /2 首页分析 ...
- 【爬虫实战】手把手教你用Python爬取某图网4000张图片
相信很多设计小伙伴有好的灵感,但是没有好的设计素材,今天它来了.摄图网4000张设计素材,取之不尽,如下图所示: 好了,废话不多说,开始用Python采集. 01需求分析 采集摄图网的素材图片,目标网 ...
- 手把手教你用python爬取人人贷网站借款人信息
P2P是近年来很热的一个行业,由于这个行业在国内兴起才不久,国内的很多学者对这个行业都兴趣盎然,在大学研究互联网金融的学者更是有一大群.小编是学金融出身,深知数据在做学术研究的重要性,之前有不少学互联 ...
- python爬取京东商品数据要先登录_手把手教你用python 爬取京东评论
本次python实战,主要目标是利用 Python爬取京东商品评论数,如上图所示:爬取"Python之父"推荐的小蓝书,这些信息主要包括用户名.书名.评论等信息. 爬取的网址url ...
- python爬取物流信息_手把手教你用Python爬取快递100查询你的物流信息
前言 我们经常会去查快递的物流单号,可是这些物流单号是从哪里来的呢? 快递鸟集合了多家快递公司查询接口,输入相应快递公司编码和快递单号就可以获取到对应的物流信息很方便快捷. 项目目标 教会大家如何用P ...
- python怎么爬虎牙_手把手教你利用Python爬取虎牙平台数据
首先打开我们所需要爬取的网站,这里我们挑选的是虎牙直播. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道 ...
- 教你用python爬取网站数据
编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲起.原本的英文编码只有0~255,刚好是8位1个字节.为了表示各种不同的语言,自然要进行 ...
- python爬取微博数据存入数据库_Python爬取微博数据并存入mysql,excel中
寒假期间做微博数据统计,由于是部门要求,也没办法,自己又是一个懒人,直接用python实现吧.写的很粗糙,也很差,请大家别介意. 总的来说分成两个模块:一个爬取微博数据存入数据库,一个从数据库调取数据 ...
- 【爬虫实战】手把手教你使用python爬取美女图片
本文目录 写作缘起 上代码 思路分析 效果展示 写在最后 写作缘起 用python爬虫实现的图片资源下载器,一页页下载图片过于缓慢,当我们要欣赏一些好看的图片时一页页翻太复杂了,干脆写一个图片下载器 ...
最新文章
- 344. Reverse String
- android: 使用 AsyncTask
- 论中国和欧洲程序员对加班的态度
- TensorFlow(九)eval函数
- 远程控制工具_不要让您的工具控制您
- leetcode 1. 两数之和(map)
- 例题 2 最敏捷的机器人
- 爬虫-代理的质量控制
- 好慌!支付宝App现“不锈钢内裤” 官方解释:已改为“煮内裤的锅”
- CEF与快速交换的比较
- 计算某日是该年的第几天
- matlab基本图形处理实验,MATLAB数字图像处理实验讲义(指导书)
- YOLO算法之车型识别
- 《WF本质论》第一章OpenSesame我的实现
- BRVAH的基本使用
- js调用数科阅读器_js调用ocx控件(读写IC卡
- VBox 快照备份虚拟机
- F28335第十篇——增强型捕获模块(eCAP)
- mysql memory leak,项目在Tomcat中启动出现内存泄露memory leak
- 图片数据增强的方法——收藏
热门文章
- 详解原生AJAX请求demo(兼容IE5/6)
- AlwaysVisibleControlExtender
- 什么是类型别名?什么是潜在类型?
- Java:多个文档合并输出到一个文档
- __cplusplus的用处
- 装饰模式(Decorator Pattern)
- object.ReferenceEquals(a,b)
- Linux配置文件bashrc
- WPF Layout System
- nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping