基于Python网络爬虫的游戏直播平台直播间数据挖掘分析可视化课程实验设计

文末获取完整课程实验报告+源码源文件等

在这里插入图片描述


1任务需求分析

用所学Python技术设计并实现一个功能完整的系统,并撰写总结报告。要求:
(1)实现时需要至少使用图形界面、多线程、文件操作、数据库编程、网页爬虫、统计分析并绘图(或数据挖掘)六项技术,缺一不可。少一项则直接影响是否及格。
(2)系统要具有一定复杂度。应用系统的业务流程不能过于简单,数据库表不能少于5张表。爬取图片不能少于500张。采集数据不能少于1000条,统计分析的目标不能少于3个。
(3)实现时要考虑模块化,不能将所有功能均在一个程序内实现。

2设计方案

1.整体结构(系统功能)
对斗鱼主页推荐直播数据进行爬取,包括直播间封面,主播头像,直播分区等等。
在这里插入图片描述

2.数据获取方案
利用python3爬虫获取数据。
1爬主播信息
定义一个原始地址,这个地址是斗鱼直播的推荐目录地址。
通过模拟浏览器的操作,获取推荐的主播列表,主播的列表信息:主播名字,主播的房间号,房间的标题和房间的分类。浏览完成一个页面后,获取这一个页面的直播间封面图片地址,每页的主播列表约为120个。要采集1000条信息,所以要翻页10次左右。将主播信息存入csv文件。如图2.2.1所示
在这里插入图片描述
在获取完直播间列表后,在主播列表中获取房间号,通过房间号拼接地址后,请求这个地址,进入直播间,获取主播的头像、订阅数和人气值等信息。
爬到数据后将数据存入数据库中下载图片,有封面图片和头像图片,从数据库中获取头像和图片的地址,然后通过这个地址下载图片,保存到本地。

2爬分类信息,原始地址为https://www.douyu.com/directory,通过这个地址获取一级分类信息,将一级分类信息存入列表中。从列表中取出一级分类信息,获取这个分类下的二级信息。

3爬热门视频,原始地址为https://v.douyu.com/,在热门视频标签下找到视频的相关信息。

2.3数据存储方案
将采集数据信息存入csv文件。下载的图片存放入pic文件。使用sqlite数据库建表,建表语句在bak文件中,如图2.3.1
在这里插入图片描述
2.4数据分析方案
使用pandas模块处理数据,使用groupby方法对数据进行分组;使用max()方法求最大值,使用sort_values()方法排序。对于处理好的数据,使用matplotlib模块回执统计图片。为了显示汉字不乱码,要设置图片的属性,代码:

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

第一个图片是饼图,第二个和第三个是柱状图。饼图实现代码:

plt.pie(data.values, labels=data.index, autopct='%.1f%%')

柱状图实现代码

data.plot(kind='bar', alpha=0.5, width=0.3)
plt.xticks(rotation=20)
plt.title("最大人气排行表")
plt.show()

2.5界面设计方案
使用wxPython模块实现界面,界面设计使用wxFormBuilder创建项目,添加框架、布局、表格、按钮等控件。
界面分为两部分:一个窗体,上半部分表格,下半部分按钮。添加一个Frame控件表示拆个难题,使用wxBoxSizer布局将Frame分为上下两部分,这两部分也分别为一个wxBoxSizer。在这两个二级布局,一个是横向,一个是纵向,表格全部放在第一个二级布局中,不考虑布局的类型;第二个二级布局要添加多个按钮,将这个布局的orient属性值设置为wxHORIZONTAL。共有6个按钮。三个用于爬虫,一个用于统计分析,两个用于界面显示操作的显示。如图2.5.1。
在这里插入图片描述

3系统实现及数据分析

3.1数据获取
主播信息爬虫实现
这部分的实现分为3步。
一是获取主播的名字,房间号,标题,类型和封面图片。
封面信息是动态加载的,因此需要滑动滚动条来显示图片的标签。使用selenium模块模拟浏览器滑动窗口的滚动条,当滑动到底部时获取这一页的封面图片地址。对于主播的名字,房间号,标题,类型,这些都是文字信息,在开始显示网页时就有了。因此直接获取这一页的文字信息。将文字信息和图片地址组成列表返回。翻页操作,使用模拟的浏览器找到“下一页”所在的标签,点击这个标签进入下一页,重复这个过程。这里的异常处理:第一页的一个封面只有图片没有类型,会导致后续的数据不能一一对应,因此将这条数据舍弃掉。
二是获取主播的头像和热度,这里需要进入直播间,找到头像和热度所在的标签,将标签值取下来。这一步要等到获取到主播列表后拼接网址进入直播间。https://www.douyu.com/10178905,前半部分固定,后半部分是直播间ID。这种地址直接请求就可以获取标签。但是有的地址不是直接拼接,而是带topic,这样的链接是动态变化的,这样就需要使用固定地址获取直播间信息,使用正则表达式匹配字符串:re.compile(r'"hot":"\d+"'),其中\d+表示直播间热度re.compile(r'owner_avatar":".*?"'),其中.*?表示头像地址
三是获取订阅数,每个主播的订阅数都需要模拟浏览器获取,需要较长时间,因此不直接加入前面的步骤。对于每一个主播,分别访问他们的直播间,等一段时间直播间订阅人数显示出来后,把这个数字截取下来。
分类信息和热门视频信息爬虫实现
按照参数规则调整GET参数,请求一次获得一个JSON,取json中的data字段,前面存储的详细信息,然后继续提取信息。分类分为一级分类和二级分类,一级分类的地址固定,二级分类的地址通过一级分类获得。获取后添加到数据库中。
数据存储实现
在爬完数据后,使用sqlite3模块连接数据库,conn()方法连接数据库,cursor()获取游标,查询数据使用execute()方法,返回值是一个结果集。从结果集中取得数据。向数据库中插入数据也是用execute()方法,但是执行后要使用commit()方法提交结果。
3.2数据存储
将爬取的信息保存到csv→本地数据库中,我所使用的是sqlite数据库,navicat图形管理界面。除去master还剩四个数据库表,表格信息:存储项目类型(表,索引,触发器等)、项目名称(如表名)、建表语句等
在这里插入图片描述
在这里插入图片描述
(篇幅有限,其余完整详见文末)

3.3数据分析
从3个角度分析采集到的数据:每个二级分类的热门主播比例,人气最多的二级分类的人气值排名,每个热门分类下人气数和主播数的比较。
后两个按钮的功能,一个是从数据库中查询数据,显示到表格控件上,另一个是从界面上删除一行数据。点击按钮要调用方法,给这两个控件绑定方法,发生点击事件时,就会调用绑定的方法,代码

self.m_buttonquery.Bind(wx.EVT_LEFT_DOWN,self.m_buttonqueryOnLeftDown)
self.m_buttondelete.Bind(wx.EVT_BUTTON,self.m_buttondeleteOnButtonClick)

6个按钮的实现—每个按钮绑定一个方法,当点击按钮时调用这些方法。使用AppendTextColumn()方法添加列。
表格用于显示主播信息,先设置列,将固定的列,即主播列表的属性添加到表格上。
查询按钮用于向表格输出主播信息。点击按钮,连接数据库,读取数据,然后从数据库中取出数据后放到列表中,然后按行向表格中添加数据,这样可以显示主播信息。使用表格的AppendItem()方法添加行。
删除按钮用于从表格界面上删除一条消息。点击按钮,获取表格当前选中行的行号,然后使用表格的DeleteItem()方法删除这一行。在这里的异常处理—当前没有选中任何一行,显示一个对话框“你没有选择项目”。
采集数据按钮
爬取封面图片和爬取头像按钮,获取当前行的图片地址,然后启动下载线程下载图片。使用二进制方式写入文件,下载完成后向界面线程发送消息“头像下载完成”、“封面下载完成”后退出这个线程。使用线程的原因:下载函数是一个阻塞的函数,如果图片很大就会占用很长时间,点击按钮后一直在下载中卡着不向后进行在界面上卡死,表现为点击任何控件都没有反应。在调用一个按钮对应的函数阻塞时,当前的线程会一直等着这个阻塞的函数执行后才会有时间处理点击控件的操作。而新建了一个线程启动后,这个线程自己运行自己的,主线程继续往后执行,不影响界面的操作。这样可以同时开多个线程下载多张图片。
采集数据按钮,点击按钮启动线程调用爬虫程序。
统计分析按钮,点击按钮调用绘图方法绘图显示在界面上。使用show()方法在命令行运行的情况下可以直接弹出窗体,在IDE中运行会显示在IDE的界面上。有三个统计图片,所以会弹出3个窗体,关闭了一个窗体会显示另一个窗体。
1.不同区块主播数量比例扇形图 如图3.3.1
在这里插入图片描述
2.各个分区最高人气排行柱形图
在这里插入图片描述
3.热度和订阅数量比例图 如图3.3.3
在这里插入图片描述


点击下方小卡片,那边发送“资源”两个字

获取完整课程实验报告+源码源文件等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶绿体不忘呼吸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值