课程:《Python程序设计》
班级: 1912
姓名: 李浩鹏
学号:20191204
实验教师:王志强
实验日期:2021年6月01日
必修/选修: 公选课
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
批阅:注意本次实验不算做实验总分,前三个实验每个实验10分,累计30分。本次实践算入综合实践,打分为25分。
评分标准:
(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。10分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。5分
爬虫网站:https://movie.douban.com/top250?start=0&filter=
通过观察页面获取url地址的规律以及总的页码数:构造url地址的列表。
观察发现每一个页面的url地址的区别,发现它有以start=“(页面数-1)*25”这样的规律。
由此构造函数
#url中间值 url_temp = "https://movie.douban.com/top250?start={}&filter=" def get_url_list(): url_list =[url_temp.format(i*25) for i in range(0,10)] return url_list
response.encoding = response.apparent_encoding html = BeautifulSoup(response.text, features='lxml')
关于电影评分的部分
picture_url = picture_src picture_response = requests.get(url=picture_url)
#主函数 def main(): pygame.init() # 模块初始化 snake_speed_clock = pygame.time.Clock() # 创建Pygame时钟对象 screen = pygame.display.set_mode((windows_width, windows_height)) # screen.fill(white) pygame.display.set_caption("Python 贪吃蛇小游戏") #设置标题 show_start_info(screen) #欢迎信息 while True: running_game(screen, snake_speed_clock) show_gameover_info(screen)
pygame.display.set_mode((windows_width, windows_height))
生成windows窗口,pygame.display.set_mode(resolution=(0,0),flags=0,depth=0)。返回的是一个surface对象(surface对象是用于表示图像的图像,只要指定尺寸,就可以利用),resolution可以控制生成windows窗口的大小,flags代表的是扩展选项,depath不推荐设置。
screen.fill(white)
pygame.surface.fill(color),对窗口背景颜色的填充。
2def running_game(screen,snake_speed_clock): 3 startx = random.randint(3, map_width - 8) #开始位置 4 starty = random.randint(3, map_height - 8) 5 snake_coords = [{'x': startx, 'y': starty}, #初始贪吃蛇 6 {'x': startx - 1, 'y': starty}, 7 {'x': startx - 2, 'y': starty}] 8 9 direction = RIGHT # 开始时向右移动 10 11 food = get_random_location() #实物随机位置 12 13 while True: 14 for event in pygame.event.get(): 15 if event.type == QUIT: 16 terminate() 17 elif event.type == KEYDOWN: 18 if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT: 19 direction = LEFT 20 elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT: 21 direction = RIGHT 22 elif (event.key == K_UP or event.key == K_w) and direction != DOWN: 23 direction = UP 24 elif (event.key == K_DOWN or event.key == K_s) and direction != UP: 25 direction = DOWN 26 elif event.key == K_ESCAPE: 27 terminate() 28 29 move_snake(direction, snake_coords) #移动蛇 30 31 ret = snake_is_alive(snake_coords) 32 if not ret: 33 break #蛇跪了. 游戏结束 34 snake_is_eat_food(snake_coords, food) #判断蛇是否吃到食物 35 36 screen.fill(BG_COLOR) 37 #draw_grid(screen) 38 draw_snake(screen, snake_coords) 39 draw_food(screen, food) 40 draw_score(screen, len(snake_coords) - 3) 41 pygame.display.update() 42 snake_speed_clock.tick(snake_speed) #控制fps
关于贪吃蛇
采用一个元组存储贪吃蛇身体各个部分的坐标(一条贪吃蛇不是由很多节组成的嘛)。最后再写个方法根据元组坐标把贪吃蛇画出来。
关于食物
同样做法。存坐标,最后画出来。
关于移动
监听键盘,根据用户按键,用direction变量记录移动方向。然后更新贪吃蛇元组里面的坐标(其实每次移动只用更新头尾就行)。最后统一画出来。移动做法具体是,我们把每次头部移动的新坐标插入贪吃蛇元组,然后删掉尾部一节。
开始阶段
先把贪吃蛇和食物的坐标随机生成,贪吃蛇一开始3节长,先设置向右移动。
移动我们的贪吃蛇
监听键盘,用户按下键盘只是改变direction的值,再用move_snake(direction, snake_coords)函数更新贪吃蛇坐标。如果不按,那direction值一直不变,贪吃蛇就一直向前走。
相关判断
要判断贪吃蛇是否挂了,表现为:
头坐标超出地图范围
头坐标等于身体某节坐标。
判断贪吃蛇是否吃到食物,表现为:
头坐标等于食物坐标,那么吃到食物。这时候注意,我们就不用删尾部一节了,因为吃到食物变长了嘛。
如果没有吃到食物,那么是正常移动,删掉尾部一节坐标。
问题1:不会翻页操作,如果信息只是分布在一个网页上,还会处理,如果分布在多个网页上就不会了
问题1解决方案:百度了下,通过学习别人的经验并仔细观察各个页面之间的url的区别与联系,发现同一个系列的网页的url通常不会是完全不一样的,大多情况下存在着或多或少的联系,即url之间是相似的,这一系列url中很可能存在一个或几个特征值来进行彼此间的区分,我们只要抓住特征值的变化规律,就能通过规律构造函数,进而通过循环实现这一系列网站间的自动跳转访问、信息爬取。
如:豆瓣上就为(页码-1)*25
问题2:对于如何在网页之上找到自己想要信息那部分对应的html代码有些迷茫。
问题2解决方案:通过百度发现,在网页之上选取F12后,在页面的左上角有一个选取的标志,可以通过点亮这个标志后,选择自己想要的信息,系统会自动对准html中的代码。
爬虫
snake
本学期我们首先初识了python,了解了python的发展历程、未来前景和优势 。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
在学习了基本的输入输出操作后,我们学习了基本数据类型:整数类型,四种进制表示形式、浮点类型。对python的计算有了初步的认识,并且在第一次实验中自己设计了一个功能强大的计算器。相信这个计算器对我以后的学习也会起到很大的帮助。
之后又学习了有关字符串的操作字符串类型,单引号,双引号,都只能表示一行字符串,三单引号,形成的是多行字符串,但也可以当多行注释来使用。正向递增序号、反向递减序号,索引和切片[ : ],字符串的操作符,字符串处理函数,字符串处理”方法”字符串类型格式化等等。接着我们学习了python的分支语句(分支结构)if elif else 和循环语句(循环结构)while for continue break,这一部分感觉何c语言中的差别不大,只是形式不一样而已。
·在之后我们学习了序列,序列是 Python 中最基本的数据结构。序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推Python 有 6 个序列的内置类型,但最常见的是列表和元组。列表都可以进行的操作包括索引,切片,加,乘,检查成员。Python 的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号 ( ),列表使用方括号 [ ]。元组创建也很简单,只需要在括号中添加元素,并使用逗号隔开即可。随后的下一节课学习了字典,字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 。最后学习的是集合,集合是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。通过3次课我们对这些结构的基本操作进行了深度的学习和了解,并且也通过实验二加强了对这些结构的掌握。也让我发现了这些结构的便捷。
之后我们介绍了面向对象程序设计 三要素:封装、继承、多态 介绍了对象、类,class 如果类是盖楼的图纸,那么对象就是盖好的大楼__init__()方法,创建数据成员和方法并访问,访问限制。接下来我们学习python的模块,Modules 模块,提高代码重用性和可维护性,if name == 'main':的作用,Python包以及python的异常处理,try except else finally 。接着我们学习了socket套接字,自己感受了对服务器和客户端的模拟。最后就是网络爬虫,当初真的没想到python选修会讲到网络爬虫,虽然现在还不是很会,但我决定真的是太酷了。十分感谢老师领我并提供契机让我初识了网络爬虫。并且对爬虫技术有了一定的入门。
首先我感觉我们的课程的不论是进度还是课程顺序的非常好,不仅从最基础的输入输出还是到之后的python的基本语法,还是最后的爬虫等技术,由浅及深,由表及里十分适合小白学习。因为我之前学过c语言,相比之下我觉得python的重大优势就在于庞大的第三方库。云班课的资料也非常丰富,但也同时考虑到了同学的水平差距和时间精力问题,没有做硬性要求,我觉得这也是很明智的。王老师上课也比较风趣幽默,课堂的内容也比较比较吸引人,我觉的这是区别的其他编程课程的优势。同时老师还积极鼓励我们背英语单词,这一点是别的选修所没有的,英语对于我们专业来说可以说是很重要的语言,但是由于大学以来没人督促,我的英语停滞不前,很感谢老师通过这种方式督促我们背英语单词,这对我本次的六级考试起到了很大的帮助。而且在答疑的过程中,老师指点我让我学会提问,学会利用百度搜索,让我受益匪浅。让我提建议的话,就是前面的特别基础的一些东西,例如输入输出,字符串,循环控制结构我觉得可以在压缩一下,从而腾出来时间给后面的比较有挑战的内容,如爬虫等。(这只代表我的看法,可能因为我有一定编程基础才会提出这样的想法)。
总之还是很感谢老师一学期的教导,真的是受益匪浅。
贪吃蛇教程
Python爬虫一:抓取豆瓣电影Top250
python爬虫实战--第一章:爬取豆瓣电影
······