excel自动抓取网页数据(如何用Python构建一个带有GUI的爬虫小程序-之前)
优采云 发布时间: 2022-02-23 13:20excel自动抓取网页数据(如何用Python构建一个带有GUI的爬虫小程序-之前)
大家好,之前我们讲了如何使用Python构建一个带有GUI的爬虫小程序。很多文章会迎合热点,继续上一篇NBA爬虫GUI,讨论如何爬取虎扑NBA官网数据。并将数据写入Excel并自动生成折线图,主要有以下几个步骤
本文将分以下两部分进行讲解
项目涉及的主要 Python 模块:
** ** 爬虫部分
爬虫部分组织如下?
观察URL1的源码找到队名和对应的URL2 观察URL2的源码找到玩家对应的URL3 观察URL3的源码**** 找到对应的基本信息和比赛数据播放器并过滤和存储它们
其实爬虫是对html进行操作的,而html的结构很简单,只有一个,就是一个大框架协商一个小框架,小框架嵌套在小框架内,这样一层一层的层嵌套。
目标网址如下:
先引用模块
1from bs4 import BeautifulSoupimport requestsimport xlsxwriterimport os
2
查看URL1源码,可以看到团队名词及其对应的URL2在span标签下,然后找到它的父框和祖父框。下面的思路是一样的,如下图:
此时,可以使用 requests 模块和 bs4 模块进行有目的的索引以获取团队名称列表。
1def Teamlists(url):
2 TeamName=[]
3 TeamURL=[]
4 GET=requests.get(URL1)
5 soup=BeautifulSoup(GET.content,'lxml')
6 lables=soup.select('html body div div div ul li span a') for lable in lables:
7 ballname=lable.get_text()
8 TeamName.append(ballname)
9 print(ballname)
10 teamname=input("请输入想查询的球队名:")#此处可变为GUI界面中的按键值
11 c=TeamName.index(teamname)for item in lables:
12 HREF=item.get('href')
13 TeamURL.append(HREF)
14 URL2=TeamURL[c] return URL2
15
这样就得到了对应球队的URL2,然后观察URL2网页的内容,可以看到球员的名字在标签a下,对应球员的URL3也被存储了,如图下图:
此时,仍然使用requests模块和bs4模块的对应索引来获取播放器名称列表和对应的URL3。
1#自定义函数获取队员列表和对应的URLdef playerlists(URL2):
2 PlayerName=[]
3 PlayerURL=[]
4 GET2=requests.get(URL1)
5 soup2=BeautifulSoup(GET2.content,'lxml')
6 lables2=soup2.select('html body div div table tbody tr td b a')for lable2 in lables2:
7 playername=lable2.get_text()
8 PlayerName.append(playername)
9 print(playername)
10 name=input("请输入球员名:") #此处可变为GUI界面中的按键值
11 d=PlayerName.index(name)for item2 in lables2:
12 HREF2=item2.get('href')
13 PlayerURL.append(HREF2)
14 URL3=PlayerURL[d]return URL3,name
15
现在我们已经获得了对应队伍的URL3,然后观察URL3网页的内容。可以看到球员的基本信息在标签p下,球员常规赛生涯数据和季后赛生涯数据在标签td下,如下图:
同理,通过requests模块和bs4模块之间的对应索引,得到球员的基本信息和生涯数据,对球员常规赛和季后赛的生涯数据进行过滤存储,得到数据列表.
1def Competition(URL3):
2 data=[]
3 GET3=requests.get(URL3)
4 soup3=BeautifulSoup(GET3.content,'lxml')
5 lables3=soup3.select('html body div div div div div div div div p')
6 lables4=soup3.select('div div table tbody tr td')for lable3 in lables3:
7 introduction=lable3.get_text()
8 print(introduction) #球员基本信息for lable4 in lables4:
9 competition=lable4.get_text()
10 data.append(competition) for i in range(len(data)):if data[i]=='职业生涯常规赛平均数据':
11 a=data[i+31]
12 a=data.index(a)del(data[:a]) for x in range(len(data)):if data[x]=='职业生涯季后赛平均数据':
13 b=data[x]
14 b=data.index(b)del(data[b:])return data
15
通过上述网络爬虫获取以下数据,提供可视化数据,方便GUI界面按键事件的绑定:
** ** 可视化部分
**想法:创建文件夹**创建表格和折线图
自定义函数创建表,使用os模块编写,返回创建文件夹的路径。代码如下:
1def file_add(path): #此时的内函数path可与GUI界面的Statictext绑定
2 creatpath=path+'\\Basketball' try:if not os.path.isdir(creatpath):
3 os.makedirs(creatpath) except:
4 print("文件夹存在")return creatpath
5
使用xlsxwriter模块在creatpath路径下创建带有自定义函数的excel表格,同时放入数据和构造折线图。代码如下:
1def player_chart(name,data,creatpath):#此为表格名称——球员名称+chart
2 EXCEL=xlsxwriter.Workbook(creatpath+'\\'+name+'chart.xlsx')
3 worksheet=EXCEL.add_worksheet(name)
4 bold=EXCEL.add_format({'bold':1})
5 headings=data[:18]
6 worksheet.write_row('A1',headings,bold) #写入表头
7 num=(len(data))//18
8 a=0for i in range(num):
9 a=a+18
10 c=a+18
11 i=i+1
12 worksheet.write_row('A'+str(i+1),data[a:c]) #写入数据
13 chart_col = EXCEL.add_chart({'type': 'line'}) #创建一个折线图
14 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轴信息
15 chart_col.set_title({'name': name+'生涯常规赛平均得分'})
16 chart_col.set_x_axis({'name': '年份 (年)'})
17 chart_col.set_y_axis({'name': '平均得分(分)'})
18 chart_col.set_style(1) #设置图表风格
19 worksheet.insert_chart('A14', chart_col, {'x_offset':25, 'y_offset':3,}) #把图标插入工作台中并设置偏移
20 EXCEL.close()
21
数据表效果展示,以James为例如下
而此时打开自动生成的Excel,对应的折线图就会直接显示出来,不用再整理了!
现在结合任务1的网络爬虫和任务2的数据可视化,可以得到实时的球员常规赛数据和季后赛数据汇总,以及实时的球员生涯折线图。可以绑定上一个GUI界面任务设计中的“可视化”按钮事件,有兴趣的读者可以自行进一步研究!