python综合程序设计-20183122 综合实验《Python程序设计》实验报告

学号 2019-2020-2 《Python程序设计》实验四报告

课程:《Python程序设计》

班级: 1831

姓名: 陈介

学号:20183122

实验教师:王志强

实验日期:2020年6月7日

必修/选修: 公选课

1.实验内容

1) 爬取豆瓣院线电影信息,编写GUI用户图形界面展示信息

2) 添加文件操作内容以及网络编程,使结果可写入文件也可从文件读出之前的结果,也能上传至服务器

2. 实验过程及结果

1) 编写爬虫从豆瓣主页爬取相关信息并使用BeautifulSoup解析,剥离出有用的数据

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '

'Chrome/83.0.4103.61 Safari/537.36'

}

re = requests.get(url, headers=headers)

soup = BeautifulSoup(re.text, 'html.parser')

# 信息存储在li标签下的list-item类下

movies = soup.findAll('li', {'class': 'list-item'})

# 数据处理过程较为冗长,请移步码云查看

2) 编写可视化图形界面

首先建立GUI框架

def Win_build():

app = QApplication(sys.argv)

frame = Frame()

frame.init_text()

frame.show()

sys.exit(app.exec_())

其中Frame是一个自定义的继承自QMainWindow的类;

接着在自定义类中创建一系列的函数,其中需要初始显示的控件可以放在__init__函数下自动执行;

class Frame(QMainWindow):

def __init__(self):

super().__init__()

self.init_MainWin()

self.setFixedSize(self.width(), self.height())

self.init_buttons()

再逐步绑定各种信号和槽,使界面完善。

3) 将信息展示添加到图形化界面中

我使用的方法是定义全局变量,用列表嵌套字典的方式存储处理过后的信息,在自定义类中使用的时候就不用考虑参数的传递问题;

def init_text(self, string=' '):

"""

这个函数更新在文本框中显示的内容,同时限定此文本框为只读模式,不允许用户修改查询到的地方

:param string: 想在文本框中显示的内容

:return: None

"""

mo_text = QTextEdit(self)

mo_text.setFont(QFont("fangsong", 12))

mo_text.clear()

mo_text.setPlainText(string)

mo_text.setToolTip("这个文本框显示了爬虫爬取的即将上映或正在上映的电影信息")

mo_text.setGeometry(100, 100, 800, 450)

mo_text.setReadOnly(True)

mo_text.show()

其中string为存储电影信息的字符串,设定默认值是为了防止用户未爬取就查询时由于内容为空会报错。

4) 添加文件操作,可写入数据,保存海报,读出之前数据

打开文件并将数据写入文件

def openfile(self):

"""

选择并打开文件,将爬取到的结果写入文件

:return: None

"""

global string

filename = QFileDialog.getOpenFileName(self, '打开文件', './', "txt(*.txt)")

if filename[0]:

with open(filename[0], 'w', encoding="utf-8") as f:

f.write(string)

QMessageBox.information(self, "提示", "院线电影信息成功写入指定文件>_<")

打开.txt类型的文件并将文本提取出来显示到GUI界面中

def readfile(self):

"""

让用户选择并打开.txt文件并将其内容显示到文本栏中

:return: None

"""

filename = QFileDialog.getOpenFileName(self, '打开文件', './', "txt(*.txt)")

if filename[0]:

with open(filename[0], 'r', encoding='utf-8') as f:

read_info = f.read()

detail_text = QTextEdit(self)

detail_text.setGeometry(950, 200, 600, 500)

detail_text.setToolTip("这个文本框显示了读取到的文件的内容")

detail_text.setReadOnly(False)

detail_text.show()

detail_text.setText(read_info)

查看电影海报时会先将海报缓存到本地文件中,再从本地读取,设定不同颜色的边框区分不同类型的电影

def show_picture_up(self):

"""

展示即将上映的电影的海报

:return: None

"""

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '

'Chrome/83.0.4103.97 Safari/537.36 Edg/83.0.478.45 '

}

try:

res = requests.get(list_show_up[up_index]['img'], headers=headers)

root = "F://python全栈//python程序设计大实验//"

path = root + '1.jpg'

if not os.path.exists(root):

os.mkdir(root)

with open(path, 'wb') as f:

f.write(res.content)

f.close()

except:

QMessageBox.information(self, "提示", "海报资源请求错误")

pix = QPixmap('1.jpg')

picture_lab = QLabel(self)

picture_lab.setGeometry(950, 400, 600, 300)

picture_lab.setPixmap(pix)

picture_lab.setStyleSheet("border: 2px solid red")

picture_lab.setScaledContents(True)

picture_lab.show()

5) 网络编程,可将数据上传到运行服务器端的主机上

调用自定义函数上传数据,反馈上传结果到GUI界面中

def ftp_push(self):

"""

调用自定义模块上传文件

:return:布尔值,上传成功为True,上传失败为False

"""

bool1 = ftp.push(sys.argv)

if bool1:

QMessageBox.information(self, "提示", "文件上传成功")

else:

QMessageBox.information(self, "提示", "文件上传失败")

6) 临时起意,添加了文本文件的编辑和保存功能,在程序中实现了记事本的功能,不仅局限于电影信息,可处理任何.txt文件

实验结果:

1939988-20200608135608003-2099323788.gif

3. 实验过程中遇到的问题和解决过程

问题1:豆瓣反爬

问题1解决方案:添加头部伪装为浏览器,豆瓣的电影搜索信息在网页源码中是可以看到的,但是爬取下来之后是没有的,需要一系列的解密过程,较为复杂,涉及加密css和js,于是我选择了加密较为简单的院线电影信息作为爬取对象。

问题2:读文件的时候编码不正确

问题2解决方案:打开文件的时候获取其编码方式,写入文件的时候指定编码方式

问题3:自定义模块不能正常使用

问题3解决方案:将自定义模块所在的文件夹改为sources root

4. 实验代码码云链接

其他(感悟、思考等)

本次实验总结

1) 此次实验涉及的知识点较多,就我的程序来说,涉及序列、文件操作、网络编程、GUI、模块、爬虫以及其它基础知识点,是对一学期以来对《Python程序设计》这门课程学习成果的检验,也用以查漏补缺;在实验过程中发现了一些问题,在解决这些问题的过程中收获颇丰;

2) 由于此次实验代码量较大,达到了500行,在代码的可读性更加需要注意,于是我清楚地标明了每个函数的功能以及接口方便查看,同时ctrl + f也是相当好用的。但养成良好的代码编写习惯有助于在函数相互调用时理清逻辑;

课程感想体会

1) 这学期都是网络授课,对于本课程,课下视频自学+课堂直播教学的效果显著,两种方式相互补充,学会了许多有用的技巧和知识,我自己也写了许多有用的小工具,处理excl表格、word文档,爬取图片等,非常实用,提高了工作和学习的效率;

2) 经过这学期的学习,我愈发地认识到Python的强大,相比于C语言对底层的重视,python帮助我们实现了许多底层的细节,比如字符串查找、拷贝、拼接,排序等,使得我们有更多的精力来关注功能的实现,Python也提供了丰富的第三方模块,用以实现丰富的扩展功,python简洁,实现同样的功能,代码量少。但python也有缺点,就是代码的执行效率较低,之前写文件加密程序的时候就体现了出来;对于一个10M的MP3文件,python采用DES加密需要三分钟左右,而用我上学期密码学课程上写的程序加密只需要不到一分钟。

建议

1) 老师在讲课的时候可以多运行程序展示结果,这样课堂会更生动,也能激发同学们的兴趣;

2) 感觉老师可以在网络编程之后讲讲多线程,可以有多样的组合方式;

最后,祝贺《Python程序设计》课完结撒花

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值