20192204 2019-2020-2 《Python程序设计》实验四报告
20192204 2019-2020-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 1922
姓名: 李龙威
学号:20192204
实验教师:王志强
实验日期:2020年5月30日
必修/选修: 公选课
1.实验内容
实验成果
本实验是基于python网络爬虫和GUI图形界面编程的实验,实验的最终成果是提供给用户一个可视化的界面,界面上有十七个按钮,分别对应十七种不同的景色,例如湖泊、草原、峰林、丹霞等等,用户
点击按钮时会出现一个弹窗,上面有推荐的景点,同时附有景点的大致介绍,例如景点位置、推荐游玩时间等等。如图:
点击按钮前:
点击按钮后:
实现实验的主要方法
本实验涉及的主要技术有爬虫的应用、GUI图形界面编程、GUI图形界面布局、GUI按钮事件绑定、GUI背景图片设定、类和对象实践、文件的读写操作、利用正则表达式对HTML语言的处理、库函数的调用、列表的应用、PYTHON的基础语法等等。
2. 实验过程及结果
一、爬取目标的确定
在经过关于旅行目的地的推荐的查找后,我找到了一个搜狐的有关于中国最美景色推荐的网站,这里附上网址:
https://m.sohu.com/a/218787293_810494?spm=smbd.content.footer.0.1590241510593DoivELY&trans=010004_bdxcx_shw
网站截图:
二、开始爬取
调用request库对这个网址进行爬取
爬虫段代码:
# 设定要爬取的网址
url = "https://m.sohu.com/a/218787293_810494?spm=smbd.content.footer.0.1590241510593DoivELY&_trans_=010004_bdxcx_shw"
# 发送请求, 超时时间为30秒
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
三、HTML文件的保存
火狐浏览器可以非常方便的查看网址的HTML代码
下图为该网站的HTML代码:
为了能够更加方便地处理爬取到的HTML文件,我选择把HTML保存到项目文件夹下的HTML.txt文件里
爬取HTML文件成功后将其写入HTML.txt文件,文件截图:
四、HTML文件的处理
为了过滤掉其他的HTML代码及标签使得用户看到的就是原网站上的纯净文字,这里,我调用re库对文件进行处理
通过HTML的文件分析我们可以发现,文件从第135行开始进入正文部分,且每组推荐的景点之间隔有一行HTMl代码
所以在下面的代码中,我们采用readlines的方法读取已保存的HTML文档,然后只读取含有正文的行,并用正则表达式re.sub(r'<.*?>', '', lines[295 + i])去除文字中的HTML标签
共有十七段代码,对应的是图形界面中十七个弹窗所显示的景点推荐,这里为了观赏方便,只附上其中一段
将爬取到的HTML文档写入到文件中
a = r.text
f = open('html.txt', 'w', encoding="UTF-8")
f.write(a)
f = open('html.txt', 'r', encoding="UTF-8")
# 读取文档
lines = f.readlines()
# 生成洞穴文字
cave = ""
temp = []
for i in range(9): # 读取正文部分,并过滤文字中的HTML标签
temp.append(re.sub(r'<.*?>', '', lines[295 + i]))
for i in range(0, 9):
cave = cave + temp[i]
文字处理结果,此处处理得到的文字将用于后续GUI界面将要显示的窗口中
五、开始GUI编程——FRAME框架的搭建
即使本实验中只涉及一个主窗体,但为了后续程序的可拓展性我还是使用了类和对象的方法进行主窗体的搭建,同时为了方便设置背景图片,我们把背景风格设置为wx.DEFAULT_FRAME_STYLE
主窗体代码:
class Frame(wx.Frame):
def __init__(self, parent, id):
#创建主窗体
wx.Frame.__init__(self, parent, id, title = "根据喜好推荐旅行地——20192204", pos = (300, 10), size = (900, 600), style=wx.DEFAULT_FRAME_STYLE)
self.panel = wx.Panel(self)
self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
#输出推荐语,请选择你最喜欢的景色
title = self.title = wx.StaticText(self.panel, label='请选择你最喜欢的景色', pos=(18, 60)) #指定标题样式
font = wx.Font(20, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL)
title.SetFont(font)
六、开始GUI编程————页面布局
本次设计的页面包含湖泊、草原、山脉等十七个按钮,这些按钮的位置和名字需要我们一一设定
因为十七段代码之间的重复度高、为了观赏方便只展示十七段设置按钮的代码中的一段
self.bt_lake = wx.Button(self.panel, label = "湖泊", pos = (18, 140))
七、开始GUI编程————事件绑定
没有绑定事件的按钮是没有灵魂的——无论用户怎么点击按钮都不会出现任何反馈,我们要绑定的方法的功能大致为:把我们在第四步文件处理中得到的文字绑定到按钮事件上,当用户点击按钮时,这些文字将会以小窗口的形式呈现出来
绑定事件后按钮的其中一段代码
self.bt_lake = wx.Button(self.panel, label = "湖泊", pos = (18, 140))
self.bt_lake.Bind(wx.EVT_BUTTON, self.lake)
绑定的事件的其中一段代码,这个事件调用的是步骤四中处理HTML文件所得到的文字
def lake(self, event):
wx.MessageBox(lake)
八、开始GUI编程————背景图片的设置
在第五步主窗体的搭建中,我们使用了self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)来把设置背景图片的方法绑定在了主窗体上,这样当我们打开窗口时背景图片就可以自动显示了
背景图片绑定的方法代码
def OnEraseBack(self, event):
dc = event.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
bmp = wx.Bitmap('12.jpg')
dc.DrawBitmap(bmp, 0, 0)
上面代码中提到的图片“12.jpg”是我在网络中搜集的较美观的图片,我把它保存到项目工程目录里,这里是原图
九、最终结果
其实最终结果在前面就已做过展示,这里附上一些其他点击其他按钮时显示的结果
中国最美的七大丹霞
中国最美的八大海岸
中国最美的六大瀑布
中国最美的十大海岛
代码push到码云
码云仓库链接:
https://gitee.com/king_li_long/python/commit/9cbc11544fe2bfdf44f933180ac997689e51a504
3. 实验过程中遇到的问题和解决过程
- 问题1:直接处理网页HTML文件工作量大
- 问题1解决方案:把HTML文件先保存到本地然后用文件操作的方法,即降低工作量又提高工作效率
- 问题2:直接在主窗口上显示的文字难以去除且不够美观
- 问题2解决方案:使用小窗来显示处理的文字,高效且较为美观
- 问题3:每个按钮都进行一次爬虫操作会影响程序流畅性
- 问题3解决方案:在主函数里提前运行爬虫并处理好文字,使得主窗体运行时可以直接使用已处理好的文字,大大提高程序流畅性
4. 实验主要参考文献
wxpython界面美化之 wx.Frame透明背景 及Statictext控件的背景色隐藏
https://blog.csdn.net/weixin_41341221/article/details/100150033
wxPython入门中文版 (Getting Started with wxPython)
https://blog.csdn.net/chenghit/article/details/50421090
wxPython官方文档翻译第一期初稿
https://blog.csdn.net/u013884777/article/details/80388669
Python网络爬虫与信息提取_中国大学MOOC(慕课)
其他(感悟、思考等)
本课感悟
首先我要感谢王老师本学期对我们大家的引导,在一学期老师的教导下,我不仅对python语言有了一定程度的了解,同时我的自学能力和新操作的适应能力也都有了极大的提升。同时我还要感谢助教及其他负责给我们作业进行评分的或者帮助过我们的学长,你们不仅有着自己繁重的学业任务,同时还要负责我们的作业评分和对我们在这门课程上的引导。最后感谢所有和我一起学习这门课程的同学们,你们营造的努力学习、互帮互助的学习氛围也是我学习python这门语言的一大动力。
本课总结(我学到了什么)
在一个学期的学习下,我已经掌握python的基本知识,同时也意识到了python这门语言的强大,代码简洁、应用面广,从socket编程技术走向服务器的加密通讯、从类和对象走向游戏开发、从文件读写操作走向利用python操作word文档进行高效办公、从爬虫到多线程爬取快速搜集大量信息还有其他很多强大的功能,python是我见过应用面最广的机器语言之一,即使python的很多强大技能我都还没有掌握,但我会在今后的日子里继续深入学习这门强大的语言。
本课反馈(我的收获与建议)
在本门课程中我最大的收获不仅是入门了python语言,还有我自学能力的提升,本课程的课下自学 + 课上引导 + 动手实践的教学方式是最适合学习一门语言的方式,在大量的课下自学和实践中,学生的自主创造能力、实践能力、新环境和新知识适应能力都会受到极大程度的锻炼,即使这种教学模式会花费比较多的时间和精力(对于我这样的初学者来说更是如此),但当辛辛苦苦做了好久的实验终于成功时,自己能力的提升和任务完成带来的满足感都是让人十分幸福的,我非常赞同本学期课下自学 + 课上引导 + 动手实践的教学方式,并且我希望在日后的课程中老师能给大家演示更加精彩的python程序。
20192204 2019-2020-2 《Python程序设计》实验四报告的更多相关文章
- Python程序设计实验报告四:循环结构程序设计(设计型实验)
安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 姚彩琴 学号3190505129 成绩 日期 2020.4.8 指导老师 修宇 [实验名称 ...
- 20184302 2019-2020-2 《Python程序设计》实验四报告
20184302 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:184302 实验教师:王 ...
- PYTHON程序设计实验
Python程序设计实验报告一: 熟悉IDLE和在线编程平台 安徽工程大学 Python程序设计实验报告 班级 物流191 姓名 邹缕学号 3190505117成绩 ▁▁▁ 日期 2020.3.5 指 ...
- Python程序设计实验报告二:顺序结构程序设计(验证性实验)
安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 崔攀 学号3190505136 成绩 日期 2020.3.22 指导老师 修宇 [实验 ...
- Python程序设计实验报告一:熟悉IDLE和在线编程平台
安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 崔攀 学号3190505136 成绩_____ 日期 2020.3.8 指导老师 ...
- Python程序设计 实验 1 熟悉 IDLE 和在线编程平台
------------恢复内容开始------------ 安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 姚彩琴 学号3190505129 成绩 日期 2 ...
- Python程序设计实验报告三:分支结构程序设计
安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名 姚彩琴 学号3190505129 成绩 日期 2020.4.5 指导老师 修宇 [实验目的 ...
- 20145204&20145212信息安全系统实验四报告
20145204信息安全设计基础实验四报告 博客链接:信息安全设计基础实验
- 20204107 孙嘉临 《PYTHON程序设计》实验四报告
课程:<Python程序设计>班级: 2041姓名: 孙嘉临学号: 20204107实验教师:王志强实验日期:2020年6月29日必修/选修: 公选课 ##作为一个轻度游戏玩家,当然是要写 ...
随机推荐
- 安装 mysql 8.0后;root用户在客户端连接不上
--- mysql workbench Failed to Connect to MySQL at 10.211.55.6:3306 with user root Authentication plu ...
- Nginx+Tomcat 实现负载均衡 ,动静分离集群部署
Nginx + Tomcat 实现负载均衡,动静分离集群部署 1.Nginx实现负载均衡原理 2.Nginx配置反向代理主要参数 3.实验 1.Nginx实现负载均衡原理: Nginx服务器作为前端, ...
- kali中安装arpspoof 报错
情境今天在使用arpspoof这个命令的时候,提示没有命令找不到,此时就想着安装一下没想到,碰上kali源不支持的问题 解决所以,此时需要做的就是安装阿里云或者其他镜像 步骤1. vim /etc ...
- 深入Java微服务之网关系列1:什么是网关
前言 近来,在想着重构一个新的产品.准备采用微服务的技术解决方案,来搭建基础设施框架.网关,是一个必不可少的组件.那么,网关到底是什么? 其又有什么特点或者特性,成为微服务必不可少的组件呢?今天, ...
- netty系列之:JVM中的Reference count原来netty中也有
目录 简介 ByteBuf和ReferenceCounted ByteBuf的基本使用 ByteBuf的回收 ByteBuf的衍生方法 ChannelHandler中的引用计数 内存泄露 总结 简介 ...
- PyCharm编程软件详细安装教程
PyCharm编程软件安装教程&破解 一.官网下载软件 1. 网页搜索进入PyCharm官网下载页面(https://www.jetbrains.com/pycharm/download/ ) ...
- Solution -「集训队作业 2013」「洛谷 P4841」城市规划
\(\mathcal{Description}\) link. 求 \(n\) 个结点的简单无向连通图个数,对 \(1004535809~(479\times2^{21}+1)\) 取模. ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第06章 - 部署kube-apiserver组件
文章目录 1.6.部署kube-apiserver 1.6.0.创建kubernetes证书和私钥 1.6.1.生成kubernetes证书和私钥 1.6.2.创建metrics-server证书和私 ...
- ios cannot use "@throw" with objective-c exceptions disabled 问题解决方案
http://blog.csdn.net/huayu_huayu/article/details/51781182 我不转载 我跳转 哈哈哈哈哈哈 其实也就是 解决办法:修改target -&g ...
- [自动化]ssh自动化免密访问配置
ssh简介 SSH(Secure Shell)是一种通信加密协议,加密算法包括:RSA.DSA等 RSA:非对称加密算法,其安全性基于极其困难的大整数的分解(两个素数的乘积): DSA:也是非对称加密 ...