业余练习之作,不喜欢也别喷。有错可以赐教。谢谢

import requests

import sys

from bs4 import BeautifulSoup

import json

import urllib

import re

import os

import tkinter as tk

from tkinter import filedialog

header = { #伪造浏览器头部,不然获取不到网易云音乐的页面源代码

'User-Agent':'Mozilla/5.0(Windows NT 6.3;WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/46.0.0.2490.80 Safari/537.36',

'Referer':'

',

}

print("""

************ ************

************ 1. 排行榜 ************

************ 2. 歌 手 ************

************ 3. MV ************

************ 0. 退 出 ************

************ ************

""")

numg=[0,1,2,3]

numg2 = [0,1,2,3,4,5,6]

bdlist = ["19723756","71384707","1978921795","3778678","2250011882","21845217"]

def userinput(content = '请输入选择:',secd = numg):

count =0

while count < 3: #累计输入不超过3次

num = input(content)

if num.isalpha() == 1: #判断是否字符串

print("请正确输入选择项!")

count = count + 1

print('你还有 %s 次机会'%(3-count))

continue

elif not re.search(u'^[_a-zA-Z0-9\u4e00-\u9fa5]+$', num): #判断是否包含非法字符

#\u4e00-\u9fa5是unicode编码,正好是中文编码的开始和的两个值

count = count + 1

print('你还有 %s 次机会'%(3-count))

continue

elif len(num)>1 or int(num) > secd[-1] :#判断长度是否超过1个字符或字符是否包含在预设列表中

count = count + 1

print('你还有 %s 次机会'%(3-count))

continue

elif int(num) in secd:

return num

break

sys.exit()

def gs_input(content = '请输入歌手网址ID:'):

count = 0

while count < 3:

id = input(content)

if not re.search(u'^[0-9]+$', id):

count = count + 1

print('你还有 %s 次机会'%(3-count))

continue

else:

return id

break

sys.exit()

def bdlink(linkid): #榜单地址

return link

def choice_folder():#选择下载文件存放位置

root =tk.Tk()

root.withdraw() #隐藏TK窗口

folderpath = filedialog.askdirectory()

#filepath = filedialog.askopenfilename()

return folderpath

def songget(linaddr):

header = { #伪造浏览器头部,不然获取不到网易云音乐的页面源代码

'User-Agent':'Mozilla/5.0(Windows NT 6.3;WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/46.0.0.2490.80 Safari/537.36',

}

r = requests.get(linaddr, headers = header)#通过requests模块的get方法获取网页数据

html = r.content #获取网页内容

soup = BeautifulSoup(html, "html.parser") #通过BeautifulSoup模块解析网页

songs = soup.find("ul", class_ = "f-hide").select("a", limit = 1) #通过分析网页源代码发现排行榜中的歌曲信息全部放在类名称为f-hide的ul中,于是根据特殊的类名称查找相应ul,然后找到里面的全部a标签,限制数量为10,即排行榜的前200首歌

i = 1 #设置一个自增参数,表示歌曲的数目

for s in songs: #遍历输出数组songs中的内容

maxnum = 5

for tries in range(maxnum): #下载失败尝试5次

song_id = s['href'][9:] #只截取歌曲链接中的ID部分,因为网页中链接的形式为"/song?id=496870798",从=号之后的就是歌曲的ID号

song_name = s.text #获取a标签的文本内容,即上歌曲的名称

#下载歌手歌曲

song_down_link = "网易云音乐" + song_id + ".mp3" #根据歌曲的ID号拼接出下载的链接,歌曲直链获取的方法参考文前的注释部分

print("第 " + str(i) + " 首歌曲:" + song_down_link)

print("请选择要存放的文件夹")

response = requests.get(song_down_link, headers = header).content #亲测必须要加 headers 信息,不然获取不了

f_path = choice_folder() + '\\'

f = open(f_path + song_name + ".mp3", 'wb') #"d:\music\",报错:SyntaxError:EOL while scannig string literal. 如去掉最后的\,则文件名变成MUSICXXX.MP3;加双\后,达成目标。以二进制的形式写入文件中

f.write(response)

f.close()

#以下为下载歌词

url = 'http://music.163.com/api/song/lyric?' + 'id=' + str(song_id) + '&lv=1&kv=1&tv=-1'

htm = requests.post(url,headers=header)

htm2 = htm.text

json_obj = json.loads(htm2)

lyric2 = json_obj['lrc']['lyric']

f_ric = open(f_path + song_name + ".lrc", 'w', encoding = 'utf-8')

f_ric.write(lyric2)

f_ric.close()

print(song_name + ".mp3")

print("下载完成\n\r")

i = i + 1

break

if tries < (maxnum -1):

continue

else:

print("Has tried %d times to acces url %s, all failed!\n\n" %(maxnum,song_down_link + "\n"))

break

num = userinput("输入选择:",numg)

if int(num) ==1:

print('''

######################################################

############## ##############

############## 1. 云音乐说唱榜 ##############

############## 2. 云音乐古典音乐榜 ##############

############## 3. 云音乐电音榜 ##############

############## 4. 云音乐热歌榜 ##############

############## 5. 抖音排行榜 ##############

############## 6. KTV 唛 唠 ##############

############## 0. 退出 ##############

############## ##############

######################################################

''')

num2 = userinput("输入选择:",numg2)

if int(num2) ==1:

urlsr = bdlink(bdlist[0]) #说唱榜

songget(str(urlsr))

elif int(num2) == 2:

urlsr = bdlink(bdlist[1]) #古典音乐

songget(urlsr)

elif int(num2) == 3:

urlsr = bdlink(bdlist[2]) #电音榜

songget(urlsr)

elif int(num2) == 4:

urlsr = bdlink(bdlist[3]) #热歌榜

songget(urlsr)

elif int(num2) == 5:

urlsr = bdlink(bdlist[4]) #抖音排行榜

songget(urlsr)

elif int(num2) == 6:

urlsr = bdlink(bdlist[5]) #KT唛唠

songget(urlsr)

elif int(num2) == 0:

sys.exit()

if int(num) ==2:

gs_id = gs_input()

gs_link = "网易云音乐"%(gs_id)

songget(gs_link)

sys.exit()

if int(num) == 3:

mv_id = gs_input()

url = '网易云音乐' + str(mv_id)

req = requests.get(url, headers = header)

req.encoding='utf-8'

try:

pattern = re.compile(r'',re.S)#re.S(DOTALL): 点任意匹配模式,改变’.’的行为

result = re.findall(pattern ,req.text)[0].strip()

file_name = json.loads(result)['title']

pattern_1 = re.compile(r'&murl=http(.*?(:?&auto))(?!\.)')

pattern2 = re.findall(pattern_1,req.text)

if len(pattern2) == 0:

pattern_1 = re.compile(r'hurl=http(.*?(:?&murl))(?!\.)')

pattern2 = re.findall(pattern_1,req.text)

elif len(pattern2) == 0:

pattern_1 = re.compile(r'hurl=&murl=http(.*?(:?&auto))(?!\.)')

pattern2 = re.findall(pattern_1,req.text)

s = [str(i) for i in pattern2]

s4 = ' '.join(s)

"""一.parse.urlencode() 与parse.unquote()

urllib 和urllib.request都是接受URL请求的相关模块,但是提供了不同的功能。两个最显著的不同如下:

1.urllib 仅可以接受URL,不能创建 设置了headers 的Request 类实例;

2.但是 urllib 提供 urlencode 方法用来GET查询字符串的产生,而urllib.request 则没有。(这是 urllib 和urllib.request 经常一起使用的主要原因)

3.编码工作使用urllib的parse.urlencode()函数,帮我们将key:value这样的键值对转换成"key=value"这样的字符串,解码工作可以使用urllib的parse.unquote()函数。(注意,不是urllib.request.urlencode() )

"""

url2 = urllib.parse.unquote(s4)

s = url2.split(',')[0]

url3 = s[3:-6]

url4 ="http:" + url3

req2 = requests.get(url4, headers = header)

print("请选择存放位置:")

fpath = choice_folder() + "\\"

f = open(fpath + file_name + ".mp4", 'wb')

f.write(req2.content)

f.close()

print(" \n %s *已成功下载,尽请聆听!\n"%(file_name))

except:

if len(pattern2)<1:

print(file_name + "因版权问题,无法下载\n")

sys.exit()

else:

print("视频不可下载:( 或是出现未知错误")

sys.exit()

sys.exit()

if int(num)== 0:

print('0')

sys.exit()

python中的英文歌_Python 爬网易音乐云歌曲,MV相关推荐

  1. python中的英文歌_Python告诉你:从《入海》到《消愁》毛不易的歌里都在唱些什么?...

    [导语]:今天我们来聊聊--B站联合毛不易发布的毕业季主题曲<入海>,以及背后不一样的毛不易.Python技术部分请看第三部分. Show me data,用数据说话!今天我们聊一聊 毛不 ...

  2. python读取文本中的英文歌_Python 实例分析 - 获取MP3歌曲的Tag信息

    下面利用一个python的实例程序,来学习python.这个程序的目的就是分析出所有MP3文件的Tag信息并输出. 其中遇到一个问题,让我深切感受到python中依靠缩进来控制流程的缺点,不多说,看程 ...

  3. python里的英文歌_python下载酷狗音乐上的歌曲

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:TM0831 准备工作:Python3.5 Pycharm 使用到的 ...

  4. python里的英文歌叫什么_Python告诉你:从《入海》到《消愁》毛不易的歌里都在唱些什么?...

    原标题:Python告诉你:从<入海>到<消愁>毛不易的歌里都在唱些什么? CDA数据分析师 出品 作者:Mika 数据:真达 后期:泽龙.Mika [导语]:今天我们来聊聊- ...

  5. python要学什么英文歌_Python分析网易云音乐近5年热门歌单

    由于同一歌单可能会有不同的分类,所以按这72种分类抓取的数据会有重复数据,剔重之后6.6万个热门歌单. 我按不同分类下歌单的相似度做了排行榜如下(红色部分表示相似度): 从相似度排行榜中看出流行音乐. ...

  6. python图片显示英文字符_Python中利用Tesseract软件来识别图片中的英文与中文

    OCR与Tesseract介绍 将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同的几 ...

  7. python网易云歌词做成词云图_Python爬取李荣浩最短歌曲贝贝的网易云评论并做成词云图...

    前言 在18 年的 10 月 17 号,李荣浩发了一张新专辑「耳朵」,专辑里有一首歌「贝贝」,只有 4 秒,歌词也就两个字.而且这首歌的作曲 .作词 .编曲.制作人.和声.录音师.混音师.录音室.混音 ...

  8. python爬去音乐_python爬去音乐

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文为大家分享了python爬取酷狗音乐排行榜的具体代码,供大家参考,具体内容如 ...

  9. python中chr的用法_python中chr()函数和ord()函数的用法

    原博文 2018-06-11 21:52 − 一,chr()函数 格式:Chr(<数值表达式>) 说明:函数返回值类型为String,其数值表达式值取值范围为0~255. 例如:Print ...

最新文章

  1. cookie 免密登录_python
  2. Struts2的Action和Servlet有什么联系,区别?
  3. centos安装python3小白_Centos7 安装Python3
  4. 网页插件学javascript还是jquery好啊?
  5. QT的QBluetoothTransferManager类的使用
  6. 【Nginx】浏览器请求URL遇到错误:no-referrer-when-downgrade
  7. 输入 3 个正数,判断能否构成一个三角形。
  8. iOS 网络通信01
  9. CVPR 2018 最具创意论文 TOP10
  10. 解决百度富文本框中添加的表格页面获取后不显示表格边框的问题
  11. 获得Oracle中刚插入的数据的ID(for produce)
  12. 计算机考研2022大纲,2022计算机408考研大纲
  13. 为什么谐振时电抗为0_108kVA/108kV/27kV变频串联谐振试验装置
  14. varchar与varchar2区别
  15. cd40系列芯片_CD40,CD45系列芯片功能大全
  16. 微信小程序wx:for 循环中item的keng
  17. 大数据入门--大数据特点
  18. [java] POI shiftRows 移动后合并的单元格被拆分了
  19. SVN服务器迁移方法(Windows环境)
  20. 基于Spring Security 的Java SaaS应用的权限管理

热门文章

  1. pg数据库数据量很小但是data目录很大的排查思路
  2. android+删除相片代码,android删除手机照片
  3. Kubernetes 管理员认证(CKA)考试笔记(四)
  4. 华为云服务器默认jdk版本,华为云服务器centos7.3 安装jdk
  5. 高绩效团队的建设与管理
  6. 【深度学习】时间注意力模块与空间注意力模块
  7. bxl文件转换为AD可以用的原理图和PCB库文件
  8. Windows下LaTex转为Word
  9. python打包程序在win10不能运行、点击无反应_win10双击安装包没反应,win10运行exe无反应...
  10. 实验室预约管理系统大型仪器预约平台