20222108 2022-2023-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2221
姓名: 多乐
学号:20222108
实验教师:王志强
实验日期:2022年5月10日
必修/选修: 公选课
1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
2. 实验过程及结果
利用爬虫实现王者荣耀所有皮肤图片的爬取。
1) 寻找皮肤图片地址
进入王者荣耀官网——“游戏资料”——“英雄资料”
按F12进入调试界面,然后按F5刷新界面,图中标识的herolist.json文件就是我们所需要的英雄列表,其中包括英雄编号、英雄名称、英雄类型、皮肤的名称等信息。
在文件上右击复制链接http://pvp.qq.com/web201605/js/herolist.json
接着利用以下代码,爬取资料:
# 代码片段1
import urllib.request
import json
import os
response = urllib.request.urlopen("http://pvp.qq.com/web201605/js/herolist.json")
hero_json = json.loads(response.read())
hero_num = len(hero_json)
print(hero_json)
print("hero_num : " , str(hero_num))
接着我们选择一个英雄点开,以我最喜欢的英雄花木兰为例。
得到了原图的链接地址https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/154/154-bigskin-1.jpg
用同样的方法对比其他皮肤和英雄可以分析得到154为英雄编号,最后的1为该英雄的皮肤编号。
2) 下载图片
在第一步获取到的herolist.json文件中有**“skin_name”**字段,我们只要解析这个字段就可以获取皮肤数量和皮肤名称。测试代码(接代码片段1)如下:
# 代码片段2
hero_name = hero_json[0]['cname']
skin_names = hero_json[0]['skin_name'].split('|')
skin_num = len(skin_names)
print('hero_name: ', hero_name)
print('skin_names :', skin_names)
print('skin_num: ' + str(skin_num))
测试结果如下:
可以得到编号为1的英雄的信息。
接着我们就可以下载了。
下载文件用到urlretrieve接口,测试代码如下:
for i in range(hero_num):
# 获取皮肤名称列表
skin_names = hero_json[i]['skin_name'].split('|')
for cnt in range(len(skin_names)):
save_file_name = 'D:\heroskin\\' + str(hero_json[i]['ename']) + '-' +hero_json[i]['cname']+ '-' +skin_names[cnt] + '.jpg'
skin_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'+str(hero_json[i]['ename'])+ '/' +str(hero_json[i]['ename'])+'-bigskin-' + str(cnt+1) +'.jpg'
urllib.request.urlretrieve(skin_url, save_file_name)
效果如下:
至此,所有的皮肤海报都已经爬取下来了。
附上完整代码如下:
# time:2023/5/25 22:11
# developer: 20222108 Dollar
import urllib.request
import json
import os
response = urllib.request.urlopen("http://pvp.qq.com/web201605/js/herolist.json")
hero_json = json.loads(response.read())
hero_num = len(hero_json)
# 文件夹不存在则创建
save_dir = 'D:\heroskin\\'
if not os.path.exists(save_dir):
os.mkdir(save_dir)
for i in range(hero_num):
# 获取英雄皮肤列表
skin_names = hero_json[i]['skin_name'].split('|')
for cnt in range(len(skin_names)):
save_file_name = save_dir + str(hero_json[i]['ename']) + '-' + hero_json[i]['cname'] + '-' + skin_names[
cnt] + '.jpg'
skin_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(
hero_json[i]['ename']) + '/' + str(hero_json[i]['ename']) + '-bigskin-' + str(cnt + 1) + '.jpg'
if not os.path.exists(save_file_name):
urllib.request.urlretrieve(skin_url, save_file_name)
最后将代码提交到码云,如图
演示视频以及一些说明如下:
爬虫相关讲解及演示
3. 实验过程中遇到的问题和解决过程
- 问题1:玩王者的人其实都知道,目前廉颇不止两款皮肤,而应该是四款,所以刚刚这张图片是有一定的问题的。
- 问题1尚未解决,还在思考中。
全课总结
一开始主要是因为大创和CTF经常要使用Python语言,于是就选了王老师的课程。从安装Pycharm,学习print()函数,到列表元组字典集合,再到封装、继承、多态三巨头,无论是简单的随机random还是复杂的socket,随着知识的深入学习,Python的魅力也逐渐展现在我眼前。
初次接触Python,刚学习一学期的我可能提不出多么一针见血的宝贵建议,但是我希望强哥多强调复习的重要性。刚接触的时候,我常常觉得这门语言不用指针,相对简单一些,所以缺少了必要的复习,而每次的内容又很丰富,得不到及时的消化会导致接下来的学习相对吃力。如果多多强调课后的复习,相信学弟学妹们会学得更好。
最后,肯定要感谢王老师一学期来的教导和陪伴。所谓师傅领进门,修行在个人,今后的学习还需要自己的不断钻研。相信我在课堂上学到的,绝不止知识点,而是更多需要在日后生活中自己慢慢感悟的东西。