Python爬虫_音乐案例
【案例目的】:下载音乐
【第三方库】:1.requests 2.perttytable
【开发环境】:1.Python3.8 2.PyCharm 2022.1
# https://y.qq.com/n/ryqq/search?w=undefined&t=song&remoteplace=txt.yqq.top
# https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w=
import requests # 发送网络请求
import json
import prettytable as pt # 别名pt
headers = {
'cookie': 'pgv_pvid=6059813169; fqm_pvqid=258cc782-da53-49d1-a236-aba7b8985f01; fqm_sessionid=c70e9301-3c6d-4807-a89d-cf5cfc09f7e0; pgv_info=ssid=s1828238326; ts_refer=www.baidu.com/link; ts_uid=7928555294; _qpsvr_localtk=0.9363751939798446; RK=WZn1bTXRwO; ptcz=1c9d0da30fa3ece9bf5512399904deaeabeb9506e96bc0a99381a3b3748bd431; login_type=1; qm_keyst=Q_H_L_52P_lJGzHJHODFUttRP8yG7VI40Xdw7ddiUdLfqtsLuhW3Wqs2shG-g; psrf_qqrefresh_token=2F3493E6330D695E614A03419E0A687C; euin=oinP7i-F7iEsoc**; psrf_qqopenid=B18700D95DBBB7F21C7BA46FDB487BC3; psrf_access_token_expiresAt=1664956757; uin=3047287962; qqmusic_key=Q_H_L_52P_lJGzHJHODFUttRP8yG7VI40Xdw7ddiUdLfqtsLuhW3Wqs2shG-g; psrf_qqunionid=365E52FB57F5FA5A827467C3C4145A8F; qm_keyst=Q_H_L_52P_lJGzHJHODFUttRP8yG7VI40Xdw7ddiUdLfqtsLuhW3Wqs2shG-g; tmeLoginType=2; psrf_qqaccess_token=2FF58F4E9A98E54D15C95ED08D93DE05; psrf_musickey_createtime=1657180757; wxopenid=; wxrefresh_token=; wxunionid=; ts_last=y.qq.com/n/ryqq/player'
}
# 1.发送请求 向搜索功能接口发送请求
name = input('请输入需要下载的歌手或歌曲名称:')
url = f'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w={name}'
response = requests.get(url)
# print(response)
# 2.获取数据 获取所有歌曲信息数据
# print(response.text)
json_str = response.text
# 3.解析数据 歌曲名 歌手名 专辑 歌曲mid(用来下载歌曲的必要参数)
# 将callback({"code":0,"data":{"keyword":"陈奕迅","priority":0,"qc":[],"semantic":{"curnum":0,"curpage":1,"list":[],"totalnum":0},"song":{"curnum":10,"curpage":1,"list":[{"albumid":23277502,"albummid":"001uaPM93kxk1R","albumname":"孤勇者","albumname_hilight":"孤勇者","alertid":23,"belongCD":0,"cdIdx":1,"chinesesinger":0,"docid":"6848470612341681209","grp":[],"interval":256,"isonly":0,"lyric":"《英雄联盟:双城之战》动画剧集中文主题曲","lyric_hilight":"《英雄联盟:双城之战》动画剧集中文主题曲","media_mid":"003UkWuI0E8U0l","msgid":16,"newStatus":2,"nt":1491932878,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":80768,"tryend":116032,"trysize":960887},"pubtime":1636336800,"pure":0,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":4097029,"size320":10242283,"sizeape":0,"sizeflac":28729027,"sizeogg":5558885,"songid":331839675,"songmid":"003UkWuI0E8U0l","songname":"孤勇者","songname_hilight":"孤勇者","strMediaMid":"003UkWuI0E8U0l","stream":1,"switch":16888579,"t":1,"tag":11,"type":0,"ver":0,"vid":"y0041ywgpm7"},{"albumid":89526,"albummid":"000GDz8k03UOaI","albumname":"黑白灰","albumname_hilight":"黑白灰","alertid":24,"belongCD":0,"cdIdx":4,"chinesesinger":0,"docid":"13507383522679373732","grp":[],"interval":205,"isonly":0,"lyric":"《明年今日》国语版|《隐婚男女》电影插曲|《摆渡人》电影插曲","lyric_hilight":"《明年今日》国语版|《隐婚男女》电影插曲|《摆渡人》电影插曲","media_mid":"002AIxAT3HZwiA","msgid":15,"newStatus":2,"nt":360551177,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":1,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":60668,"tryend":95943,"trysize":960887},"pubtime":1050336000,"pure":0,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":3287859,"size320":8219359,"sizeape":0,"sizeflac":21724767,"sizeogg":4816438,"songid":4830342,"songmid":"001OyHbk2MSIi4","songname":"十年","songname_hilight":"十年","strMediaMid":"002AIxAT3HZwiA","stream":1,"switch":16881409,"t":1,"tag":11,"type":0,"ver":0,"vid":"u00138j4hcs"},{"albumid":51144,"albummid":"003nMzes28P7wv","albumname":"What's Going On...? (Remastered 2019)","albumname_hilight":"What's Going On...? (Remastered 2019)","alertid":23,"belongCD":0,"cdIdx":5,"chinesesinger":0,"docid":"17421115046798789842","grp":[],"interval":259,"isonly":0,"lyric":"","lyric_hilight":"","media_mid":"000Hv0Nh0m4ye8","msgid":16,"newStatus":2,"nt":1226614804,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":58599,"tryend":101674,"trysize":960887},"pubtime":1164211200,"pure":1,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":4147215,"size320":10367701,"sizeape":0,"sizeflac":27911982,"sizeogg":5570567,"songid":1249550,"songmid":"003dtkNk26WhJD","songname":"富士山下","songname_hilight":"富士山下","strMediaMid":"000Hv0Nh0m4ye8","stream":1,"switch":16888579,"t":1,"tag":11,"type":0,"ver":0,"vid":"k0012md5982"},{"albumid":89552,"albummid":"004S8YQr3UmEbG","albumname":"Shall We Dance? Shall We Talk!","albumname_hilight":"Shall We Dance? Shall We Talk!","alertid":24,"belongCD":0,"cdIdx":6,"chinesesinger":0,"docid":"15473432272639700324","grp":[],"interval":211,"isonly":0,"lyric":"","lyric_hilight":"","media_mid":"000wa9ED359rBP","msgid":15,"newStatus":2,"nt":1850647739,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":1,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":43648,"tryend":77357,"trysize":960887},"pubtime":987091200,"pure":1,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":3381117,"size320":8452425,"sizeape":0,"sizeflac":21556285,"sizeogg":4661676,"songid":4907894,"songmid":"004CU50m2JjBjr","songname":"单车","songname_hilight":"单车","strMediaMid":"000wa9ED359rBP","stream":1,"switch":16881409,"t":1,"tag":11,"type":0,"ver":0,"vid":"k003145jgxi"},{"albumid":31526,"albummid":"003yQidc3s7P65","albumname":"认了吧","albumname_hilight":"认了吧","alertid":23,"belongCD":0,"cdIdx":4,"chinesesinger":0,"docid":"15216281848330892662","grp":[],"interval":239,"isonly":0,"lyric":"","lyric_hilight":"","media_mid":"003LnSNo1ecdc3","msgid":16,"newStatus":2,"nt":1025624166,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":44558,"tryend":77883,"trysize":960887},"pubtime":1177344000,"pure":0,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":3840821,"size320":9601761,"sizeape":0,"sizeflac":23842755,"sizeogg":4860559,"songid":1313990,"songmid":"004EzHKM2jXY9i","songname":"红玫瑰","songname_hilight":"红玫瑰","strMediaMid":"003LnSNo1ecdc3","stream":1,"switch":16888579,"t":1,"tag":11,"type":0,"ver":0,"vid":"l0010mf18Sa"},{"albumid":31526,"albummid":"003yQidc3s7P65","albumname":"认了吧","albumname_hilight":"认了吧","alertid":23,"belongCD":0,"cdIdx":6,"chinesesinger":0,"docid":"10814090808139691550","grp":[],"interval":259,"isonly":0,"lyric":"《爱情呼叫转移》电影主题曲","lyric_hilight":"《爱情呼叫转移》电影主题曲","media_mid":"001TmGUh00SDKn","msgid":16,"newStatus":2,"nt":4203463155,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":59105,"tryend":101707,"trysize":960887},"pubtime":1177344000,"pure":0,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":4160979,"size320":10402155,"sizeape":0,"sizeflac":27659602,"sizeogg":5649433,"songid":1313992,"songmid":"003u2qmP0Mp2pW","songname":"爱情转移","songname_hilight":"爱情转移","strMediaMid":"001TmGUh00SDKn","stream":1,"switch":16888579,"t":1,"tag":11,"type":0,"ver":0,"vid":"p0010ejZrer"},{"albumid":35182,"albummid":"000J1pJ50cDCVE","albumname":"不想放手","albumname_hilight":"不想放手","alertid":23,"belongCD":0,"cdIdx":7,"chinesesinger":0,"docid":"14691017891116423173","grp":[],"interval":285,"isonly":0,"lyric":"《时尚先生》电影主题曲","lyric_hilight":"《时尚先生》电影主题曲","media_mid":"004cc3OU0GLJHb","msgid":16,"newStatus":2,"nt":1413023447,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":74064,"tryend":102207,"trysize":960887},"pubtime":1214755200,"pure":0,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":4566820,"size320":11416753,"sizeape":0,"sizeflac":30255204,"sizeogg":6051718,"songid":9059607,"songmid":"002B2EAA3brD5b","songname":"不要说话","songname_hilight":"不要说话","strMediaMid":"004cc3OU0GLJHb","stream":1,"switch":16888579,"t":1,"tag":11,"type":0,"ver":0,"vid":"e0011thbfzs"},{"albumid":8442,"albummid":"002FT46H18G1jW","albumname":"Life Continues","albumname_hilight":"Life Continues","alertid":23,"belongCD":0,"cdIdx":3,"chinesesinger":0,"docid":"18391503565895915970","grp":[],"interval":233,"isonly":0,"lyric":"","lyric_hilight":"","media_mid":"001honc23hEmz0","msgid":16,"newStatus":2,"nt":2764751392,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":0,"tryend":0,"trysize":960887},"pubtime":1140192000,"pure":1,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":3738029,"size320":9344742,"sizeape":0,"sizeflac":24984868,"sizeogg":5285512,"songid":1338414,"songmid":"003hFxQh276Cv5","songname":"最佳损友","songname_hilight":"最佳损友","strMediaMid":"001honc23hEmz0","stream":1,"switch":16888579,"t":1,"tag":11,"type":0,"ver":0,"vid":"q0012ac6bqn"},{"albumid":1180610,"albummid":"002DAg4x3jVzHI","albumname":"陪你度过漫长岁月 (\"陪安东尼度过漫长岁月\"电影主题曲)","albumname_hilight":"陪你度过漫长岁月 (\"陪安东尼度过漫长岁月\"电影主题曲)","alertid":23,"belongCD":0,"cdIdx":1,"chinesesinger":0,"docid":"11956688378241772946","grp":[],"interval":242,"isonly":0,"lyric":"《陪安东尼度过漫长岁月》电影主题曲","lyric_hilight":"《陪安东尼度过漫长岁月》电影主题曲","media_mid":"002jmqDQ1bMQpV","msgid":16,"newStatus":2,"nt":3738150625,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":48803,"tryend":90796,"trysize":960887},"pubtime":1445443200,"pure":0,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":3879711,"size320":9698957,"sizeape":0,"sizeflac":27421645,"sizeogg":5334938,"songid":104775916,"songmid":"003ULL5o2D7UMu","songname":"陪你度过漫长岁月","songname_hilight":"陪你度过漫长岁月","strMediaMid":"002jmqDQ1bMQpV","stream":1,"switch":16888579,"t":1,"tag":11,"type":0,"ver":0,"vid":"z0034d265mo"},{"albumid":31526,"albummid":"003yQidc3s7P65","albumname":"认了吧","albumname_hilight":"认了吧","alertid":23,"belongCD":0,"cdIdx":7,"chinesesinger":0,"docid":"11330780560051870950","grp":[],"interval":250,"isonly":0,"lyric":"《失恋33天》电影插曲","lyric_hilight":"《失恋33天》电影插曲","media_mid":"003Idtm746YJCM","msgid":16,"newStatus":2,"nt":659729728,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":67785,"tryend":126360,"trysize":960887},"pubtime":1177344000,"pure":0,"singer":[{"id":143,"mid":"003Nz2So3XXYek","name":"陈奕迅","name_hilight":"<em>陈奕迅</em>"}],"size128":4009260,"size320":10022832,"sizeape":0,"sizeflac":19875283,"sizeogg":4986886,"songid":1313993,"songmid":"004M3yRr3kOfnS","songname":"好久不见","songname_hilight":"好久不见","strMediaMid":"003Idtm746YJCM","stream":1,"switch":16888579,"t":1,"tag":11,"type":0,"ver":0,"vid":"F0010fy2zcy"}],"totalnum":600},"tab":0,"taglist":[],"totaltime":0,"zhida":{"chinesesinger":0,"type":0}},"message":"","notice":"","subcode":0,"time":1657182440,"tips":""})
# 进行截取 callback( 长度为9,从第十个字符开始,到倒数第二个字符为止
json_str = json_str[9:-1]
json_dict = json.loads(json_str) # 将获取到的json数据转变为字典类型
# print(json_dict)
song_list = json_dict['data']['song']['list']
# 格式化输出添加表格
tb = pt.PrettyTable()
tb.field_names = ['序号','歌名','歌手','专辑'] # 表头
music_info_list = []
count = 1
# 4.格式化输出
for song in song_list:
songname = song['songname'] # 歌曲名
songmid = song['songmid'] # 歌曲mid
singer = song['singer'][0]['name'] # 歌手
albumname = song['albumname'] # 专辑名称
# print(songmid,songname,singer,albumname)
tb.add_row([count,songname,singer,albumname])
music_info_list.append([songmid,songname,singer])
count += 1
print(tb)
while True:
input_index = eval(input('请输入下载的歌曲序号(按-1退出):'))
if input_index == -1 :
break
download_info = music_info_list[input_index-1]
# print(download_info)
songmid = download_info[0] # 获取songmid值
# 1.通过获取的歌曲mid拼接需要的音乐url
music_info_url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","filename":"M800","param":{"guid":"8846039534","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","filename":"M800","param":{"guid":"8846039534","songmid":["%s"],"songtype":[0],"uin":"1152921504784213523","loginflag":1,"platform":"20"}},"comm":{"uin":"1152921504784213523","format":"json","ct":24,"cv":0}}' % songmid
# print(music_info_url)
# 2.发送网络请求 需要的音乐url
json_data = requests.get(url=music_info_url,headers=headers).json()
# 3.获取数据 获取 里面生成的 部分音乐链接 合并 (mp3数据所在的链接)
purl = json_data['req_0']['data']['midurlinfo'][0]['purl']
media_url = 'https://dl.stream.qqmusic.qq.com/' + purl
# print(media_url)
# 4.发送请求 获取链接所在的数据
# 5.获取数据 音乐是二进制数据
music_data = requests.get(media_url).content
# 6.保存数据
with open(f'./file/music/{download_info[1]}-{download_info[2]}.mp3',mode='wb')as f:
f.write(music_data)
print(f'{download_info[1]},下载成功')