image
今年的风口一个接着一个,高产似母猪
- 年初就骗我屯口罩,现在口罩都降到1毛钱了,我家里的10斤口罩不知道能用到什么时候
- 后来又骗我屯头盔,刚屯买完头盔,居然说骑电瓶车又不用带头盔了???现在家里亲戚骑自行车的小孩都被强行带上头盔了,对只是为了安全着想
- 再后来地摊经济又开始了,没有防备一场大雨又让我们回到了解放前,只记得那场大雨之后天台又挤满了很多人
这些风口就像周董的歌词一样,“爱像一阵风,吹完它就走”。真是太无情了
最近又迎来新来的风口,准确来说是从年初持续的一直在刮,就是微信的视频号,下半年视频领域将可能在线上复制当年的百团大战(拭目以待),之前行哥也分享了视频制作的相关教程,后台回复“pr”就可以获取咯
如果要做视频,其中一个蛮重要的环节就是音乐,音乐可能相当于视频的灵魂
作为一个python爱好者,能不能用代码自动下载音乐的想法就立马蹦出,说干就干
qq音乐代码案例
爬取原理很简单
- 首先我们先来到QQ音乐的官网:https://y.qq.com/,在搜索栏上输入一首歌曲的名称;
如我在上输入最美的期待,按回车来到这个画面
我们首先要得到这些歌曲名称和其他一些信息,鼠标右键查看源代码发现这些数据应该应用了反爬虫,鼠标右键点击检查,点击NetWork,然后点击XHR,按F5刷新,然后点击
https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=66920929169890801&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%E6%9C%80%E7%BE%8E%E7%9A%84%E6%9C%9F%E5%BE%85&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0这个网址,如下图:
发现这里好像有我们需要的数据
image
那么这个网址要怎样才能得到呢!其实也不难发现,就下面的那个w=不同而已,对于不同歌曲。
而这个w=后面的那个数据好像就是我输入的歌曲名,最美的期待,只不过这里对于这个进行了编码罢了。
我们只要这样输入就可以了
from urllib import parse
w=parse.urlencode({'w':input('输入歌名:')})
url='https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=63229658163010696&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&%s&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0'%(w)
print(url)
这样我们就得到了这个url
这样得到的数据是一个字符串,这个字符串类似‘{'key':{'key_1':1}}’,我们可以导入json模块,来处理它,这样我们得到的数据就是一个字典了。
我们点击其中的一首歌试听,来到这个界面
image
右击鼠标,点击检查,点击NetWork,点击XHR,找到下面这个网址发现
image
在这里我们可以发现有这首歌曲的下载地址,发现purl下面的一个参数是上面得到的那个数据中的’mid‘,只要将两者结合起来,就可以下载这首歌曲了。
源代码如下
import urllib.parse as parse
from urllib.request import urlretrieve
import requests
import json
import os
import time
import sys
def Time_1(): # 进度条函数
for i in range(1, 51):
sys.stdout.write('\r')
sys.stdout.write('{0}% |{1}'.format(int(i % 51) * 2, int(i % 51) * '■'))
sys.stdout.flush()
time.sleep(0.125)
sys.stdout.write('\n')
print('''
公众号:一行数据
''')
w = parse.urlencode({'w': input('输入歌名:')})
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=63229658163010696&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&%s&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0' % (
w)
content = requests.get(url=url)
str_1 = content.text
dict_1 = json.loads(str_1)
song_list = dict_1['data']['song']['list']
str_3 = '''https://u.y.qq.com/cgi-bin/musicu.fcg?-=getplaysongvkey5559460738919986&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"1825194589","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"1825194589","songmid":["%s"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":24,"cv":0}}'''
url_list = []
music_name = []
for i in range(len(song_list)):
music_name.append(song_list[i]['name'] + '-' + song_list[i]['singer'][0]['name'])
print('{}.{}-{}'.format(i + 1, song_list[i]['name'], song_list[i]['singer'][0]['name']))
url_list.append(str_3 % (song_list[i]['mid']))
id = int(input('请输入你想下载的音乐序号:'))
content_json = requests.get(url=url_list[id - 1])
dict_2 = json.loads(content_json.text)
url_ip = dict_2['req']['data']['freeflowsip'][1]
purl = dict_2['req_0']['data']['midurlinfo'][0]['purl']
downlad = url_ip + purl
try:
os.mkdir('./QQ音乐')
except:
pass
finally:
try:
print('开始下载...')
urlretrieve(url=downlad, filename='./QQ音乐/{}.mp3'.format(music_name[id - 1]))
Time_1()
print('{}.mp3下载完成!'.format(music_name[id - 1]))
except Exception as e:
print(e, '对不起,你没有该歌曲的版权!')
运行结果如下:
image
当然这个代码有个缺点,就是不能下载付费歌曲,网上大部分下载qq音乐付费歌曲的代码大多都只是个噱头,毕竟腾讯每年花几百上千万的安全人员不是吃白饭的,所以涉及到付费歌曲下载的代码这里先不提。
「参考:」
不仅仅是qq音乐
技术爱好者的第一思维这个程序我能不能实现,如果效率高那还好,如果不高的我们可以借鉴其它现成方法,之前行哥也分享过使用一行代码下载全网视频音乐,想了解了的可以去看一下
你敢信?一行python代码能下载全网视频
当然还有很多不会写代码的读者想在网上直接下载,但须注意不得侵犯他人版权。这里行哥也搜罗了很多免费好用的无版权的音乐来源供大家使用:
- FreePD:用 emoji 表情来指代歌曲风格,十分形象,网站中所有的歌曲都可以单独免费下载,你也可以选择花费 10 美元一次性下载 800 个音乐。
- 爱给网:中文网站爱给网包含了免费可商用的音乐素材和商用素材,选择 CC 协议类素材库即可下载免费可商用的音乐素材。
- audionautix:该网站音乐可免费使用,但需标明音乐来源于该网站。
- musopen:网站提供的音乐大部分是古典音乐,全部都可以免费下载。
- soundcloud:soundcloud 提供了大量的免费商用音乐素材,搜索类型后,选择可商用传播的音乐素材即可。
- bensound:bensound 里的音乐均可免费下载,但需注明音乐来源于该网站。
- YouTube 免费音乐库:YouTube 免费音乐库中所有音乐均可免费下载。