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(慕课)
https://www.icourse163.org/learn/BIT-1001870001?tid=1450316449#/learn/content?type=detail&id=1214620500&cid=1218397671&replay=true
其他(感悟、思考等)
本课感悟
首先我要感谢王老师本学期对我们大家的引导,在一学期老师的教导下,我不仅对python语言有了一定程度的了解,同时我的自学能力和新操作的适应能力也都有了极大的提升。同时我还要感谢助教及其他负责给我们作业进行评分的或者帮助过我们的学长,你们不仅有着自己繁重的学业任务,同时还要负责我们的作业评分和对我们在这门课程上的引导。最后感谢所有和我一起学习这门课程的同学们,你们营造的努力学习、互帮互助的学习氛围也是我学习python这门语言的一大动力。
本课总结(我学到了什么)
在一个学期的学习下,我已经掌握python的基本知识,同时也意识到了python这门语言的强大,代码简洁、应用面广,从socket编程技术走向服务器的加密通讯、从类和对象走向游戏开发、从文件读写操作走向利用python操作word文档进行高效办公、从爬虫到多线程爬取快速搜集大量信息还有其他很多强大的功能,python是我见过应用面最广的机器语言之一,即使python的很多强大技能我都还没有掌握,但我会在今后的日子里继续深入学习这门强大的语言。
本课反馈(我的收获与建议)
在本门课程中我最大的收获不仅是入门了python语言,还有我自学能力的提升,本课程的课下自学 + 课上引导 + 动手实践的教学方式是最适合学习一门语言的方式,在大量的课下自学和实践中,学生的自主创造能力、实践能力、新环境和新知识适应能力都会受到极大程度的锻炼,即使这种教学模式会花费比较多的时间和精力(对于我这样的初学者来说更是如此),但当辛辛苦苦做了好久的实验终于成功时,自己能力的提升和任务完成带来的满足感都是让人十分幸福的,我非常赞同本学期课下自学 + 课上引导 + 动手实践的教学方式,并且我希望在日后的课程中老师能给大家演示更加精彩的python程序。