20193415 实验四《Python程序设计》实验报告
20193415 2020-2021-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 1934
姓名: 简文翔
学号: 20193415
实验教师:王志强
实验日期:2021年6月15日
必修/选修:公选课
1. 实验内容
- 完成Python综合实践任务,有关爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等
经过反复思考,我决定结合最后几节课介绍的有关网络爬虫的内容,使用第三方库GoPUP来爬取百度指数的游戏关键词指数,并利用第三方库pyecharts制作柱状图,实现游戏热度可视化。
2. 实验过程及结果
(1) 安装第三方库
-
安装GoPUP
打开命令提示符,输入
pip install gopup
-
安装pyecharts 1.1.0
打开命令提示符,输入
pip install pyecharts==1.1.0
(2) 使用GoPUP来爬取百度指数的游戏关键词指数
-
初步爬取
将登录百度指数后的cookie填入单引号中,设置关键词为“王者荣耀”,爬取2021年6月1日至2021年6月10日间的指数数据,如图所示:
爬取结果如下:
-
提取数据
根据初步爬取的结果易知,GoPUP将爬取到的数据类型为“dataframe”类型,无法直接使用
利用iterrows迭代器,每次只提取一天的数据,分别输出“item[1][0]”,这样就实现了数据的提取:
-
存入字典
新建一个列表name_list用于存放游戏关键词
新建一个字典data_baidu,用于存放6月1日至6月10日间10个游戏关键词的百度指数数据
对上述程序进行如下修改
成功将数据存入字典
(3) 利用Pyecharts制作柱状图实现可视化
-
调用所需要的库
import pyecharts.options as opts from pyecharts.charts import Timeline, Bar
-
将data_baidu中的数据格式化
def format_data(data: dict) -> dict: for year in range(1, 11): max_data, sum_data = 0, 0 temp = data[year] max_data = max(temp) for i in range(len(temp)): sum_data += temp[i] data[year][i] = {"name": name_list[i], "value": temp[i]} data[str(year) + "max"] = int(max_data / 100) * 100 data[str(year) + "sum"] = sum_data return data
-
绘制柱状图
def get_year_overlap_chart(year: int) -> Bar: bar = ( Bar() .add_xaxis(xaxis_data=name_list) .add_yaxis( series_name="百度热度", yaxis_data=total_data["dataBAIDU"][year], category_gap=50, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color='LightSeaGreen') ) .set_global_opts( title_opts=opts.TitleOpts( title="6月{}日游戏热度可视化".format(year), subtitle="数据由GoPUP获取" ), xaxis_opts=opts.AxisOpts( axislabel_opts={"interval": "0"} ), tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", axis_pointer_type="shadow" ), legend_opts=opts.LegendOpts( is_show=False, ), ) .set_series_opts( label_opts=opts.LabelOpts(is_show=False), # 设置最大值、最小值、平均值的标记线 markline_opts=opts.MarkLineOpts( data=[ opts.MarkLineItem(type_="min", name="最小值"), opts.MarkLineItem(type_="max", name="最大值"), opts.MarkLineItem(type_="average", name="平均值"), ] ), ) ) return bar
-
生成时间轴实现轮播
timeline = Timeline(init_opts=opts.InitOpts(width="1600px", height="800px")) for y in range(1, 11): timeline.add(get_year_overlap_chart(year=y), time_point="6月{}日".format(y)) timeline.add_schema(is_auto_play=True, play_interval=1000) # 生成html文件,用于在浏览器中查看效果图 timeline.render("game.html")
-
效果图
数据的柱状图在6月1日至6月10日间自动跳变,可暂停,点击日期对应的圆圈可查看当日数据。纵坐标随数据大小自行变化。
-
程序代码托管到码云
3. 课程总结
(1) 知识小结
课程学习中,我们主要接触了如下Python知识:流程控制语句、序列、字符串、正则表达式、函数、面向对象程序设计、文件操作及异常处理、网络爬虫等。
通过学习,我得知了Python这门语言的定义:Python是一种高级动态、完全面向对象的语言,函数、模块、数字、字符串都是对象,并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性,具有代码少、简单、运行速度慢的特点。
Python具有如下数据类型:整数、浮点数、字符串、布尔值、空值(None)。
序列包含可变、可重复、有序的列表,不可变、可重复、有序、元素不能删除的元祖,键值对组成的字典,可以去重的集合。序列可以进行索引与切片操作。
字符串可以进行拼接、截断、分割、检索、格式化等操作;正则表达式则较为复杂,它描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
Python中的函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,我们也可以自己创建用户自定义函数。
Python的类与对象由三个关键词组成:封装+继承+多态,类又等于属性+方法。
Python的模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用python标准库的方法。
而关于Python的网络编程技术,我了解到了Socket套接字技术,即端口+IP地址,这也是我其他课程所涉及到的知识。
最重要的网络爬虫,它就是一个探测机器。它的基本操作就是模拟人的行为去各个网站溜达,点点按钮,查查数据,或者把看到的信息背回来。就像一只虫子在一幢楼里不知疲倦地爬来爬去。简单来讲,就是通过程序去获取web页面上自己想要的数据,也就是自动抓取数据。关于爬虫,我只学到一点皮毛,希望以后有机会还能继续深入学习。
(2) 感想与建议
首先很庆幸自己选到了这门选修课。在王志强老师的Python程序设计这门选修课中,我第一次接触Python这门编程语言,以前对Python的了解仅限于道听途说,只知道这是一门上手简单、功能强大的语言,但其中蕴含的奥秘在我上课之后才得以深入了解。我个人认为这门课程所用的语言很特别很奇妙,老师也很风趣很有个性,能够帮助我们更好的了解Python这门语言真正的用途。在整个课程学习的过程中,我最大的感触就是,老师不仅是在教我们学Python,更多是把我们向“程序猿”的方向培养。
在学习Python这门课程的这段时间以来,我认识到并且学习到了很多知识。不仅如此,做Python实验的过程也是一个学习的过程,从激活专业版Pycharm到配置Gitee再到在博客园用Markdown写实验报告,全是个人经历上的第一次,能够利用的只有搜索引擎、云班课中的链接与老师的只言片语,所有东西都需要自己去搜索去学习。对于一个完美主义者与强迫症患者,写一篇实验报告往往要用不下十个小时的时间,一遍遍地编辑博客后台一遍遍地预览、调整图片尺寸、缩进段落,才能修改出勉强令自己满意的博客。
而对于王老师的这门课程,我有一点小小的建议,那就是老师现场编写代码的时候有时会写错,跟着思路走的初学者(比如我们)很容易被绕晕,要是老师的备课能更加充分、少一些报错就更完美了。
至此,Python程序设计这门课程已经圆满结束了。在这个过程之中,我交出了一份还算满意的答卷,也在多次失败的教训之中收获了许多宝贵的经验:做好提前预习,亲自动手实践,及时查漏补缺……这些经验对我将来的学习都有着很大的帮助。
最后,感谢老师的惇惇教导!您辛苦了!