1. 刚开始安装了个python3.6的版本,自己写了个hello world ,发现可以运行,后面又网上找到了下载酷狗音乐的代码,结果报各种包没有,使用pip安装也各种安装不起来
  2. 又从网上找了python要用什么idea工具,找到了一款好用的工具Anaconda,安装完以后会有个编辑器Spyder发现特别好用,实现效果如图

  附加完整代码,适合初学者直接运行
 

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3.  
  4. """
  5. @author: sergiojune
  6. @contact: 2217532592@qq.com
  7. @site:
  8. @software: PyCharm
  9. @file: music.py
  10. @time: 2018/8/8 16:15
  11. """
  12. import requests
  13. import random, math
  14. from Crypto.Cipher import AES
  15. import base64
  16. import codecs
  17. import os
  18. """
  19. 获取歌曲地址:https://music.163.com/weapi/song/enhance/player/url?csrf_token=429d8812f4449bb9acb60e7647113999
  20. """
  21.  
  22. class Spider(object):
  23. def __init__(self):
  24. self.headers = {
  25. # 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',
  26. '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'
  27.  
  28. }
  29.  
  30. def __get_songs(self, name):
  31. d = '{"hlpretag":"<span class=\\"s-fc7\\">","hlposttag":"</span>","s":"%s","type":"1","offset":"0","total":"true","limit":"30","csrf_token":""}' % name
  32. wyy = WangYiYun(d) # 要搜索的歌曲名在这里
  33. data = wyy.get_data()
  34. url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token='
  35. response = requests.post(url, data=data, headers=self.headers).json()
  36. return response['result']
  37.  
  38. def __get_mp3(self, id):
  39. d = '{"ids":"[%s]","br":320000,"csrf_token":""}' % id
  40. wyy = WangYiYun(d)
  41. data = wyy.get_data()
  42. url = 'https://music.163.com/weapi/song/enhance/player/url?csrf_token='
  43. response = requests.post(url, data=data, headers=self.headers).json()
  44. print(response)
  45. return response['data'][0]['url']
  46.  
  47. def __download_mp3(self, url, filename):
  48. """下载mp3"""
  49. abspath = os.path.abspath('.') # 获取绝对路径
  50. os.chdir(abspath)
  51. response = requests.get(url, headers=self.headers).content
  52. path = os.path.join(abspath, filename)
  53. with open(filename + '.mp3', 'wb') as f:
  54. f.write(response)
  55. print('下载完毕,可以在%s 路径下查看' % path + '.mp3')
  56.  
  57. def __print_info(self, songs):
  58. """打印歌曲需要下载的歌曲信息"""
  59. songs_list = []
  60. for num, song in enumerate(songs):
  61. print(num, '歌曲名字:', song['name'], '作者:', song['ar'][0]['name'])
  62. songs_list.append((song['name'], song['id']))
  63. return songs_list
  64.  
  65. def run(self):
  66. while True:
  67. name = input('请输入你需要下载的歌曲:')
  68. songs = self.__get_songs(name)
  69. if songs['songCount'] == 0:
  70. print('没有搜到此歌曲,请换个关键字')
  71. else:
  72. songs = self.__print_info(songs['songs'])
  73. num = input('请输入需要下载的歌曲,输入左边对应数字即可')
  74. url = self.__get_mp3(songs[int(num)][1])
  75. if not url:
  76. print('歌曲需要收费,下载失败')
  77. else:
  78. filename = songs[int(num)][0]
  79. self.__download_mp3(url, filename)
  80. flag = input('如需继续可以按任意键进行搜歌,否则按0结束程序')
  81. ':
  82. break
  83. print('程序结束!')
  84.  
  85. class WangYiYun(object):
  86. def __init__(self, d):
  87. self.d = d
  88. self.e = '
  89. self.f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5a" \
  90. "a76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46be" \
  91. "e255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
  92. self.g = "0CoJUm6Qyw8W8jud"
  93. self.random_text = self.get_random_str()
  94.  
  95. def get_random_str(self):
  96. """js中的a函数"""
  97. str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  98. res = ''
  99. for x in range(16):
  100. index = math.floor(random.random() * len(str))
  101. res += str[index]
  102. return res
  103.  
  104. def aes_encrypt(self, text, key):
  105. iv = ' # 偏移量
  106. pad = 16 - len(text.encode()) % 16 # 使加密信息的长度为16的倍数,要不会报下面的错
  107. # 长度是16的倍数还会报错,不能包含中文,要对他进行unicode编码
  108. text = text + pad * chr(pad) # Input strings must be a multiple of 16 in length
  109. encryptor = AES.new(key, AES.MODE_CBC, iv)
  110. msg = base64.b64encode(encryptor.encrypt(text)) # 最后还需要使用base64进行加密
  111. return msg
  112.  
  113. def rsa_encrypt(self, value, text, modulus):
  114. '''进行rsa加密'''
  115. text = text[::-1]
  116. rs = int(codecs.encode(text.encode('utf-8'), 'hex_codec'), 16) ** int(value, 16) % int(modulus, 16)
  117. return format(rs, 'x').zfill(256)
  118.  
  119. def get_data(self):
  120. # 这个参数加密两次
  121. params = self.aes_encrypt(self.d, self.g)
  122. params = self.aes_encrypt(params.decode('utf-8'), self.random_text)
  123. enc_sec_key = self.rsa_encrypt(self.e, self.random_text, self.f)
  124. return {
  125. 'params': params,
  126. 'encSecKey': enc_sec_key
  127. }
  128.  
  129. def main():
  130. spider = Spider()
  131. spider.run()
  132.  
  133. if __name__ == '__main__':
  134. main()

初学者先运行看效果,之后再慢慢研究代码啦

Python初学者的经历的更多相关文章

  1. Python初学者之网络爬虫(二)

    声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...

  2. Python初学者的一些编程技巧

    #####################喜欢就多多关注哦######################### Python初学者的一些编程技巧   交换变量  ? 1 2 3 4 5 6 7 8 9 ...

  3. Python初学者常见错误详解

    Python初学者常见错误详解 0.忘记写冒号 在 if.elif.else.for.while.class.def 语句后面忘记添加 “:”   if spam == 42 print('Hello ...

  4. 给Python初学者的一些编程技巧

    展开这篇文章主要介绍了给Python初学者的一些编程技巧,皆是基于基础的一些编程习惯建议,需要的朋友可以参考下交换变量 x = 6y = 5 x, y = y, x print x>>&g ...

  5. 致 Python 初学者们!

    ​ 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长.在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫.我非常理解你们所面临的处 ...

  6. python 初学者

    明确学习目标,不急于求成 当下是一个喧嚣.浮躁的时代.我们总是被生活中大量涌现的热点所吸引,几乎没有深度阅读和思考的时间和机会.我始终认为,学习是需要沉下心来慢慢钻研的,是长 期的:同时,学习不应该被 ...

  7. Python初学者随笔Week1

    Python从入门到放弃 本文主要是描述的是作为初学者对python学习的过程与经历分享,包括一些历程的分享与重要的时间节点记录,对于python学习的笔记与心得. 如果你也是初学者,我们可以一起学习 ...

  8. 写给已有编程经验的 Python 初学者的总结【转】

    当我开始学习Python的时候,有些事我希望我一早就知道.我花费了很多时间才学会这些东西.我想要把这些重点都编纂到一篇文章当中.这篇文章的目标读者,是刚刚开始学习Python语言的有经验的程序员,想要 ...

  9. Python初学者需要注意的问题

    一.注意你的Python版本 Python官方网站为http://www.python.org/,当前最新版本为3.4.0 alpha,稳定版本为3.3.2,在3.0版本时,Python的语法改动较大 ...

随机推荐

  1. python实现简易采集爬虫

    #!/usr/bin/python #-*-coding:utf-8-*- # 简易采集爬虫 # 1.采集Yahoo!Answers,parseData函数修改一下,可以采集任何网站 # 2.需要sq ...

  2. SecureCRT循环检查设备状态

    1: #$language = "VBScript" 2: #$interface = "1.0" 3: 4: ' This automatically gen ...

  3. Matlab Tricks(二十一)—— 软阈值函数的实现

    dj,k^=⎧⎩⎨⎪⎪dj,k−λ,dj,k≥λ0,otherwisedj,k+λ,dj,k≤−λ function y = soft(x, T) y = (x - abs(T) > 0) .* ...

  4. maven_默认新建项目jdk1.6_默认配置

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  5. Node.js 中开源库探秘 object-assign | 全栈之路

    这篇内容呢,讲的是另一个技术栈 Node.js 系列,虽然和咱们这里的主题不是特别吻合,不过嘛,汲取多样性的养分是快速成长的好方法,也是现在流行的全栈工程师的必经之路. 由于这篇内容涉及的是 Node ...

  6. ASP .NET DropDownList多级联动事件

    思路 假如有三级省.市.区,先加载出所有省选择省之后,加载出该省所有市选择市之后,加载出该市所有区重新选择省,则清空市和区重新选择市,则清空区想好数据结构,不同的数据结构做法不同 例子 数据结构 pu ...

  7. 微信小程序入门-指南针

    微信小程序提供了众多的原生API接口,利用罗盘接口,做了个简单的指南针小程序,搜索小程序[X的实验室]可看效果. 实现方案 利用罗盘接口返回的[数据],转化为指南针偏移量[度数],利用CSS3 tra ...

  8. Linux命令扫盲 之 sar

    今天在读<大规模Web服务开发技术>一书的时候,书中提到了sar这个命令,感觉很有用,有必要整理学习一下.(对于一位Linux初学者,不能放过任何一个学习机会 :P) 打开自己的CentO ...

  9. Git 将子文件夹分离为一个新的库

    前面的需求 公司Android的项目上,想要将一些module抽取出来,作为一个可以被其它项目上使用的. 所以使用了git submodule的方案. 为了将代码库中的一个文件夹分离后,作为一个单独的 ...

  10. miniui autocomplete支持放大镜按钮(data-grid)

    <style type="text/css"> html body .searchbox .mini-buttonedit-close { background:url ...