Python初学者的经历
- 刚开始安装了个python3.6的版本,自己写了个hello world ,发现可以运行,后面又网上找到了下载酷狗音乐的代码,结果报各种包没有,使用pip安装也各种安装不起来
- 又从网上找了python要用什么idea工具,找到了一款好用的工具Anaconda,安装完以后会有个编辑器Spyder发现特别好用,实现效果如图
#!/usr/bin/env python # encoding: utf-8 """ @author: sergiojune @contact: 2217532592@qq.com @site: @software: PyCharm @file: music.py @time: 2018/8/8 16:15 """ import requests import random, math from Crypto.Cipher import AES import base64 import codecs import os """ 获取歌曲地址:https://music.163.com/weapi/song/enhance/player/url?csrf_token=429d8812f4449bb9acb60e7647113999 """ class Spider(object): def __init__(self): self.headers = { # 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'Cookie':'_iuqxldmzr_=32; _ntes_nnid=8d4ef0883a3bcc9d3a2889b0bf36766a,1533782432391; _ntes_nuid=8d4ef0883a3bcc9d3a2889b0bf36766a; __utmc=94650624; WM_TID=GzmBlbRkRGQXeQiYuDVCfoEatU6VSsKC; playerid=19729878; __utma=94650624.1180067615.1533782433.1533816989.1533822858.9; __utmz=94650624.1533822858.9.7.utmcsr=cn.bing.com|utmccn=(referral)|utmcmd=referral|utmcct=/; WM_NI=S5gViyNVs14K%2BZoVerGK69gLlmtnH5NqzyHcCUY%2BiWm2ZaHATeI1gfsEnK%2BQ1jyP%2FROzbzDV0AyJHR4YQfBetXSRipyrYCFn%2BNdA%2FA8Mv80riS3cuMVJi%2BAFgCpXTiHBNHE%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6ee84b674afedfbd3cd7d98b8e1d0f554f888a4abc76990b184badc4f89e7af8ece2af0fea7c3b92a91eba9b7ec738e8abdd2b741e986a1b7e87a8595fadae648b0b3bc8fcb3f8eafb69acb69818b97ccec5dafee9682cb4b98bb87d2e66eb19ba2acaa5bf3b6b7b1ae5a8da6ae9bc75ef49fb7abcb5af8879f87c16fb8889db3ec7cbbae97a4c566e992aca2ae4bfc93bad9b37aab8dfd84f8479696a7ccc44ea59dc0b9d7638c9e82a9c837e2a3; JSESSIONID-WYYY=sHwCKYJYxz6ODfURChA471BMF%5CSVf3%5CTc8Qcy9h9Whj6CfMxw4YWTMV7CIx5g6rqW8OBv04YGHwwq%2B%5CD1N61qknTP%2Fym%2BHJZ1ylSH1EabbQASc9ywIT8YvOr%2FpMgvmm1cbr2%2Bd6ssMYXuTlpOIrKqp%5C%2FM611EhmfAfU47%5CSQWAs%2BYzgY%3A1533828139236' } def __get_songs(self, name): d = '{"hlpretag":"<span class=\\"s-fc7\\">","hlposttag":"</span>","s":"%s","type":"1","offset":"0","total":"true","limit":"30","csrf_token":""}' % name wyy = WangYiYun(d) # 要搜索的歌曲名在这里 data = wyy.get_data() url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token=' response = requests.post(url, data=data, headers=self.headers).json() return response['result'] def __get_mp3(self, id): d = '{"ids":"[%s]","br":320000,"csrf_token":""}' % id wyy = WangYiYun(d) data = wyy.get_data() url = 'https://music.163.com/weapi/song/enhance/player/url?csrf_token=' response = requests.post(url, data=data, headers=self.headers).json() print(response) return response['data'][0]['url'] def __download_mp3(self, url, filename): """下载mp3""" abspath = os.path.abspath('.') # 获取绝对路径 os.chdir(abspath) response = requests.get(url, headers=self.headers).content path = os.path.join(abspath, filename) with open(filename + '.mp3', 'wb') as f: f.write(response) print('下载完毕,可以在%s 路径下查看' % path + '.mp3') def __print_info(self, songs): """打印歌曲需要下载的歌曲信息""" songs_list = [] for num, song in enumerate(songs): print(num, '歌曲名字:', song['name'], '作者:', song['ar'][0]['name']) songs_list.append((song['name'], song['id'])) return songs_list def run(self): while True: name = input('请输入你需要下载的歌曲:') songs = self.__get_songs(name) if songs['songCount'] == 0: print('没有搜到此歌曲,请换个关键字') else: songs = self.__print_info(songs['songs']) num = input('请输入需要下载的歌曲,输入左边对应数字即可') url = self.__get_mp3(songs[int(num)][1]) if not url: print('歌曲需要收费,下载失败') else: filename = songs[int(num)][0] self.__download_mp3(url, filename) flag = input('如需继续可以按任意键进行搜歌,否则按0结束程序') ': break print('程序结束!') class WangYiYun(object): def __init__(self, d): self.d = d self.e = ' self.f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5a" \ "a76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46be" \ "e255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7" self.g = "0CoJUm6Qyw8W8jud" self.random_text = self.get_random_str() def get_random_str(self): """js中的a函数""" str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' res = '' for x in range(16): index = math.floor(random.random() * len(str)) res += str[index] return res def aes_encrypt(self, text, key): iv = ' # 偏移量 pad = 16 - len(text.encode()) % 16 # 使加密信息的长度为16的倍数,要不会报下面的错 # 长度是16的倍数还会报错,不能包含中文,要对他进行unicode编码 text = text + pad * chr(pad) # Input strings must be a multiple of 16 in length encryptor = AES.new(key, AES.MODE_CBC, iv) msg = base64.b64encode(encryptor.encrypt(text)) # 最后还需要使用base64进行加密 return msg def rsa_encrypt(self, value, text, modulus): '''进行rsa加密''' text = text[::-1] rs = int(codecs.encode(text.encode('utf-8'), 'hex_codec'), 16) ** int(value, 16) % int(modulus, 16) return format(rs, 'x').zfill(256) def get_data(self): # 这个参数加密两次 params = self.aes_encrypt(self.d, self.g) params = self.aes_encrypt(params.decode('utf-8'), self.random_text) enc_sec_key = self.rsa_encrypt(self.e, self.random_text, self.f) return { 'params': params, 'encSecKey': enc_sec_key } def main(): spider = Spider() spider.run() if __name__ == '__main__': main()
初学者先运行看效果,之后再慢慢研究代码啦
Python初学者的经历的更多相关文章
- Python初学者之网络爬虫(二)
声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...
- Python初学者的一些编程技巧
#####################喜欢就多多关注哦######################### Python初学者的一些编程技巧 交换变量 ? 1 2 3 4 5 6 7 8 9 ...
- Python初学者常见错误详解
Python初学者常见错误详解 0.忘记写冒号 在 if.elif.else.for.while.class.def 语句后面忘记添加 “:” if spam == 42 print('Hello ...
- 给Python初学者的一些编程技巧
展开这篇文章主要介绍了给Python初学者的一些编程技巧,皆是基于基础的一些编程习惯建议,需要的朋友可以参考下交换变量 x = 6y = 5 x, y = y, x print x>>&g ...
- 致 Python 初学者们!
前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长.在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫.我非常理解你们所面临的处 ...
- python 初学者
明确学习目标,不急于求成 当下是一个喧嚣.浮躁的时代.我们总是被生活中大量涌现的热点所吸引,几乎没有深度阅读和思考的时间和机会.我始终认为,学习是需要沉下心来慢慢钻研的,是长 期的:同时,学习不应该被 ...
- Python初学者随笔Week1
Python从入门到放弃 本文主要是描述的是作为初学者对python学习的过程与经历分享,包括一些历程的分享与重要的时间节点记录,对于python学习的笔记与心得. 如果你也是初学者,我们可以一起学习 ...
- 写给已有编程经验的 Python 初学者的总结【转】
当我开始学习Python的时候,有些事我希望我一早就知道.我花费了很多时间才学会这些东西.我想要把这些重点都编纂到一篇文章当中.这篇文章的目标读者,是刚刚开始学习Python语言的有经验的程序员,想要 ...
- Python初学者需要注意的问题
一.注意你的Python版本 Python官方网站为http://www.python.org/,当前最新版本为3.4.0 alpha,稳定版本为3.3.2,在3.0版本时,Python的语法改动较大 ...
随机推荐
- 浏览器兼容性之ECMAScript
1 IE中不能操作TR标签的innnerHTML. 2 日期处理函数不一致. (1)IE 8- new Date().getYear()返回的是到当前日期到1900年的差值,FF返回的是当前的年. ( ...
- 图灵机(Turing Machine)
图灵机,又称图灵计算.图灵计算机,是由数学家阿兰·麦席森·图灵(1912-1954)提出的一种抽象计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人们进行数学运算. 所谓的图 ...
- Codeforces #264 (Div. 2) D. Gargari and Permutations
Gargari got bored to play with the bishops and now, after solving the problem about them, he is tryi ...
- WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能
原文:WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能 对于CAD图形来说,3D旋转比较常用,具体实现方法在上篇文章<WPF中3D旋转的实现 >中做了 ...
- sklearn、theano、TensorFlow 以及 theras 的理解
sklearn ⇒ 机器学习算法和模型: theras theano TensorFlow 1. 理解模型以及函数,参数返回值的实际意义 一定要注意模型的构造函数,接收的参数列表,以及该模型本身所要解 ...
- 2015微软创新杯Imaginecup正在进行参赛(报名截止日期2014年12月31日本23:59)
CSDN高校俱乐部与微软官方合作,2015微软创新杯大赛中国区官网落户CSDN高校俱乐部:http://student.csdn.net/mcs/imaginecup2015 在微软官方设置创新杯中国 ...
- WPF中的PathAnimation(路径动画)
原文:WPF中的PathAnimation(路径动画) WPF中的PathAnimation(路径动画) ...
- 给Delphi程序添加版本信息(EXE和Dll)
我们在用Delphi编译完程序,准备发布产品时,总希望随产品发布个性信息以标示产品的来源以及开发者等信息,就像windows的程序一样,使我们一看属性就知道他是微软的产品,这些在Delphi中是如何实 ...
- Qt4可以使用trUtf8函数,其内容可以是中文,也可以是\F硬编码
显示在textBrowser->setText 中文乱码 转成QObject::trUtf8即可. ui->textBrowser->setText((QObject::trUtf8 ...
- C# System.Windows.Forms.WebBrowser中判断浏览器内核和版本
参考 [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器 利用js来判断 namespac ...