20212213龙瑞颖《Python程序设计》实验四 Python综合实践报告
20212213龙瑞颖《Python程序设计》实验四 Python综合实践报告
课程:《Python程序设计》
班级: 20212213
姓名: 龙瑞颖
学号:20212213
实验教师:王志强
实验日期:2020年5月31日
必修/选修: 公选课
1.实验内容
在Python的综合运用中自主选题:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。并在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
2. 实验过程及结果
(1)选题
刚开始时我选择了编写小游戏,但是其他同学对小游戏的热情也比较高,与我的实验重复,我便自动放弃了写到一半的小游戏,重新学习了Python爬虫的相关知识。然后,因为我比较喜欢听网易云的音乐,就想用爬虫爬取网易云上的歌曲下载收听。
(2)代码设计:
from Crypto.Cipher import AES
from base64 import b64encode
import requests
import random
import json
import os
def to_16(data):
len1=16-len(data)%16
data+=chr(len1)*len1
return data
def encryption(data,key):
iv = '0102030405060708'
aes = AES.new(key=key.encode('utf-8'),IV=iv.encode('utf-8'),mode=AES.MODE_CBC)
data1 = to_16(data)
bs=aes.encrypt(data1.encode('utf-8'))
return str(b64encode(bs),'utf-8')
def get_enc(data):
param4 = '0CoJUm6Qyw8W8jud'
#enc='NA5SxhePf6dxIxX7'
#enc='GLvjERPvSFUw6EVQ'
enc='g4PXsCuqYE6icH3R'
first=encryption(data,param4)
return encryption(first,enc)
if __name__ == '__main__':
# 得到搜索歌曲的列表信息
song=input('请输入歌曲名称:')
param1 = {"hlpretag": "<span class=\"s-fc7\">", "hlposttag": "</span>", "s": song, "type": "1", "offset": "0",
"total": "true", "limit": "30", "csrf_token": ""}
data=json.dumps(param1)
# 对请求参数的加密
params=get_enc(data)
data={
'params': params,
#'encSecKey': 'c2bcf219b2d727ff351d8fc4e5cbb86b09c32055345c098b8a8faf9c1c8b2bc506623ffc2b45db3e72cf040c750848f4408147c881a494c99dc8596415ce27d7b8ff7128e41a2b987bc9b78b3f4d4e0f0f5925b9ae24d99d1923a0d0c5cae5a3ebaf83c1097cfc3fd876f77582f38b79bbd03718cc562c15877abe9628e89ff1'
#'encSecKey':'cd99d0f0c4210c9dfbd2fafec8640dae914f5d359e593338f699d98c0643dcc385a3889c89c98b3dcbe8f389aa91f47608ec236cd204adbd0236aae23125776c294f28d1753b685710e0173349e71715153e76c93a100ad682eab00033d3ebf3b5001a0046994800332cfc43445e59f28f5e874cb1dc04482d57da9cc67f6e8e'
'encSecKey':'bb20ee9409e57057e4d1b55e4d77c94bff4d8cbf181c467bbd3fa156e3419665c6c1e643621d5d82c128251fb85f0cb34d4f08c88407b4148924ffa818f59a64b3814784e7e3837bad4f6f9690cb2cf721d9ea1af12c16a32a9df00be710b70ee8ed32036cc6a465b28ef43f4382cbcb4595b3121be75ecba9171876b611b8fc'
}
url='https://music.163.com/weapi/cloudsearch/get/web?csrf_token='
headerList=[ # user-agent列表,用于构造随机取值
"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12",
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'
]
value=random.choice(headerList)
headers={'user-agent':value}
response=requests.post(url=url,data=data,headers=headers)
dict1=json.loads(response.text)
lists=dict1['result']['songs']
for i in range(len(lists)):
print('[{}]-{}-->{}'.format(i+1,lists[i]['name'],lists[i]['ar'][0]['name']))
id=int(input('请输入想下载的歌曲序号:(从1开始)'))
song_id=lists[id-1]['id']
song_name=lists[id-1]['name']+"_"+lists[id-1]['ar'][0]['name'] # 歌曲名称
# 下面代码为下载歌曲的代码
url2='https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token='
param2= {"ids": "[{}]".format(song_id), "level": "standard", "encodeType": "aac", "csrf_token": ""} # post请求的参数
data2=json.dumps(param2)
params=get_enc(data2)
data['params']=params
headers['user-agent']=random.choice(headerList)
response2=requests.post(url=url2,data=data,headers=headers)
dict2=json.loads(response2.text)
downloadUrl=dict2['data'][0]['url']
downloadDir='./网易云音乐'
try: # 自动创建文件夹
os.mkdir(downloadDir)
except Exception as e:
print(e)
# 下载歌曲代码
response3=requests.get(url=downloadUrl,headers=headers)
# 以二进制的形式写入到文件中
with open(file='{}/{}.mp3'.format(downloadDir,song_name),mode='wb') as f:
f.write(response3.content)
(3)实验结果:
3、主要问题
- 代码的编写不顺利,很多语法、模块都不熟悉;
- Python运行不顺利,Python对应模块的安装在putty上出现问题;
- 云服务器的使用购买比较陌生,云端服务器没有音乐播放装置使实验结果欠佳。
-
解决办法:查找资料学习相关知识模块的运用,以及环境、软件、模块的配置搭建;询问同学、百度问题解决putty出现的问题;结合C语言课上的实验完成云服务器的购买使用。
3、本学期课程感想
首先,选课时,我就是奔着王老师和Python来的。
作为一名计算机专业的学生,我觉得应该掌握多种语言。因此,选了Python作为拓展培训。一开始王老师纠正我们的思想说计算机专业的同学应该可以自学Python,然后可以将目标放在其他感兴趣的课上。我听了以后,深以为然。但是,我也不后悔选了Python这门课。这一学期的Python之旅,让我切实学到了许多。
王老师对元组、正则表达式等知识的详细讲解,让我对Python的基础知识有了更深的理解。特别是老师注重讲学与实践相结合,课堂上一直边讲边操作,让我收益颇多。很多晦涩难懂的知识在老师的演示过后都变得很简单了。当然也许是人数太多的原因,有时候没抢到位置坐在后排就有点难看清老师的具体操作,跟上老师的操作步骤。
Python技能树的作业让我印象深刻。虽然我的观后感不够出彩,但是我确实是自己认真看完后的感受。通过对技能树的阅读,我对Python的掌握更上一层楼了。
我最喜欢老师上课的一个环节就是老师示范Python小实验的时候。在那个环节,我可以学到很多Python的实际应用,编写一些简单有趣的小代码。也借此提升了对Python的熟练度。最后一个实验,我做了很久。困难很多,错误百出。但是,老师乐观风趣的上课方式,积极幽默的范围一直感染着我。
通过一次次实验、一次次报告,我不断总结反思,在无形中不断提升了自我。在我看来,最最最重要的一点感悟应该就是学习要自己主动,遇到问题不要怕。在一次次代码改错中,我逐渐熟练使用pycharn、键盘、百度。我不断习惯通过自己百度、看书寻找答案与出路。当然,我也学会与同学们交流分享自己的想法经验,通过信息共享更快更好的解决问题。还记得第一次实验自己搭建环境、安装pycharm,那时我一遇到问题就会慌乱。后来发现大家都会遇到差不多的问题就稍微放心了,然后自己去百度搜寻答案。
回想这一学期与王老师的Python之旅,我感觉受益良多,非常开心与幸运地选到了这门课。老师教给我的不仅是Python的编程能力,还有心态,学习方法、态度等多方面的核心素养。非常感谢王老师的辛勤教导!也十分期待能向再度学习王老师的机会!