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日必修/选修: 公选课 ##作为一个轻度游戏玩家,当然是要写 ...
随机推荐
- 直播媒体流red5
第一步下载 安装setup-Red5-1.0.1-java6.exe 安装教程网上有很多 显示如下页面说明安装成功 第二步 下载oflaDemo的 解压放在 第三步 打开 然后 ok了 注意:下面的 ...
- HEAAN库学习
本文主要学习HEAAN同态库,选择最老的一版:地址,最新版在:位置,HEAAN是CKKS17论文的主要代码复现. 版本 1.地址这是最老的一版,对应的论文CKKS17 2.在1的基础上,实现了boot ...
- Java用n种方法编写实现双色球随机摇号案例
方法清单 规则 实现方式一 实现方式二 实现方式三 实现方式四 实现方法五 之前我用JavaScript编写过一个实现双色球随机摇号的案例, 点击此处查看,今天我再用Java语言来实现这一效果. 规则 ...
- Netty核心原理
Netty核心原理 1. Netty介绍 1.1 原生NIO存在的问题 NIO的类库和API使用繁杂 需要具备其他额外的技能,如java多线程编程等才能编写出高质量的NIO程序 开发工作量和难度都非常 ...
- Solution -「APIO 2018」「洛谷 P4630」铁人两项
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的无向图(不保证联通),求有序三元点对 \((s,c,f)\) 的个数,满足 \(s ...
- Solution -「SDOI 2017」「洛谷 P3784」遗忘的集合
\(\mathcal{Description}\) Link. 给定 \(\{f_1,f_2,\cdots,f_n\}\),素数 \(p\).求字典序最小的 \(\{a_1,a_2,\cdot ...
- python的import语句
1.import作用 import跟C/C++中的#include作用有点类似,都是为了调用定义在其他文件中的变量.函数或者类,但实现的区别很大. C/C++中如果a.cpp include了b.h那 ...
- [题解]Codeforces Round #519 - A. Elections
[题目] A. Elections [描述] Awruk和Elodreip参加选举,n个人投票,每个人有k张票,第i个人投a[i]张票给Elodreip,投k-a[i]张票给Awruk.求最小的k,使 ...
- 【windows 访问控制】十、词汇列表和对应C#类、枚举、命名空间
principals:主体 主体包含标识(identity 对用来来说就是用户名,对程序来说就是SID)和用户角色(role 对用户来说就是 组名 对程序来说就是组SID)subject:主体.主语i ...
- NPOI导出大量数据的避免OOM解决方案【SXSSFWorkbook】
一.NPOI的基本知识 碰到了导出大量数据的需求场景:从数据读取数据大约50W,然后再前端导出给用户,整个过程希望能较快的完成.如果不能较快完成,可以给与友好的提示. 大量数据的导出耗时的主要地方: ...