20212213龙瑞颖《Python程序设计》实验四 Python综合实践报告

20212213龙瑞颖Python程序设计》实验四 Python综合实践报告

课程:《Python程序设计》
班级: 20212213
姓名: 龙瑞颖
学号:20212213
实验教师:王志强
实验日期:2020531
必修/选修: 公选课

 

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、主要问题

  1. 代码的编写不顺利,很多语法、模块都不熟悉;
  2. Python运行不顺利,Python对应模块的安装在putty上出现问题;
  3. 云服务器的使用购买比较陌生,云端服务器没有音乐播放装置使实验结果欠佳。
  4. 解决办法:查找资料学习相关知识模块的运用,以及环境、软件、模块的配置搭建;询问同学、百度问题解决putty出现的问题;结合C语言课上的实验完成云服务器的购买使用。

 

3、本学期课程感想

首先,选课时,我就是奔着王老师和Python来的。

作为一名计算机专业的学生,我觉得应该掌握多种语言。因此,选了Python作为拓展培训。一开始王老师纠正我们的思想说计算机专业的同学应该可以自学Python,然后可以将目标放在其他感兴趣的课上。我听了以后,深以为然。但是,我也不后悔选了Python这门课。这一学期的Python之旅,让我切实学到了许多。

王老师对元组、正则表达式等知识的详细讲解,让我对Python的基础知识有了更深的理解。特别是老师注重讲学与实践相结合,课堂上一直边讲边操作,让我收益颇多。很多晦涩难懂的知识在老师的演示过后都变得很简单了。当然也许是人数太多的原因,有时候没抢到位置坐在后排就有点难看清老师的具体操作,跟上老师的操作步骤。

Python技能树的作业让我印象深刻。虽然我的观后感不够出彩,但是我确实是自己认真看完后的感受。通过对技能树的阅读,我对Python的掌握更上一层楼了。

我最喜欢老师上课的一个环节就是老师示范Python小实验的时候。在那个环节,我可以学到很多Python的实际应用,编写一些简单有趣的小代码。也借此提升了对Python的熟练度。最后一个实验,我做了很久。困难很多,错误百出。但是,老师乐观风趣的上课方式,积极幽默的范围一直感染着我。

通过一次次实验、一次次报告,我不断总结反思,在无形中不断提升了自我。在我看来,最最最重要的一点感悟应该就是学习要自己主动,遇到问题不要怕。在一次次代码改错中,我逐渐熟练使用pycharn、键盘、百度。我不断习惯通过自己百度、看书寻找答案与出路。当然,我也学会与同学们交流分享自己的想法经验,通过信息共享更快更好的解决问题。还记得第一次实验自己搭建环境、安装pycharm,那时我一遇到问题就会慌乱。后来发现大家都会遇到差不多的问题就稍微放心了,然后自己去百度搜寻答案。

回想这一学期与王老师的Python之旅,我感觉受益良多,非常开心与幸运地选到了这门课。老师教给我的不仅是Python的编程能力,还有心态,学习方法、态度等多方面的核心素养。非常感谢王老师的辛勤教导!也十分期待能向再度学习王老师的机会!

 

posted @ 2022-05-31 22:58  jerryouy  阅读(465)  评论(0编辑  收藏  举报