怎样才能导入import pymysql 怎样才能导入音乐_字符串

image

今年的风口一个接着一个,高产似母猪

  • 年初就骗我屯口罩,现在口罩都降到1毛钱了,我家里的10斤口罩不知道能用到什么时候
  • 后来又骗我屯头盔,刚屯买完头盔,居然说骑电瓶车又不用带头盔了???现在家里亲戚骑自行车的小孩都被强行带上头盔了,对只是为了安全着想
  • 再后来地摊经济又开始了,没有防备一场大雨又让我们回到了解放前,只记得那场大雨之后天台又挤满了很多人

这些风口就像周董的歌词一样,“爱像一阵风,吹完它就走”。真是太无情了

最近又迎来新来的风口,准确来说是从年初持续的一直在刮,就是微信的视频号,下半年视频领域将可能在线上复制当年的百团大战(拭目以待),之前行哥也分享了视频制作的相关教程,后台回复“pr”就可以获取咯

如果要做视频,其中一个蛮重要的环节就是音乐,音乐可能相当于视频的灵魂

作为一个python爱好者,能不能用代码自动下载音乐的想法就立马蹦出,说干就干

qq音乐代码案例

爬取原理很简单

  • 首先我们先来到QQ音乐的官网:https://y.qq.com/,在搜索栏上输入一首歌曲的名称;

如我在上输入最美的期待,按回车来到这个画面

怎样才能导入import pymysql 怎样才能导入音乐_json_02

我们首先要得到这些歌曲名称和其他一些信息,鼠标右键查看源代码发现这些数据应该应用了反爬虫,鼠标右键点击检查,点击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这个网址,如下图:

怎样才能导入import pymysql 怎样才能导入音乐_字符串_03

发现这里好像有我们需要的数据

怎样才能导入import pymysql 怎样才能导入音乐_字符串_04

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模块,来处理它,这样我们得到的数据就是一个字典了。

我们点击其中的一首歌试听,来到这个界面


怎样才能导入import pymysql 怎样才能导入音乐_json_05

image

右击鼠标,点击检查,点击NetWork,点击XHR,找到下面这个网址发现


怎样才能导入import pymysql 怎样才能导入音乐_数据_06

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, '对不起,你没有该歌曲的版权!')

运行结果如下:


怎样才能导入import pymysql 怎样才能导入音乐_字符串_07

image

当然这个代码有个缺点,就是不能下载付费歌曲,网上大部分下载qq音乐付费歌曲的代码大多都只是个噱头,毕竟腾讯每年花几百上千万的安全人员不是吃白饭的,所以涉及到付费歌曲下载的代码这里先不提。

「参考:」

不仅仅是qq音乐

技术爱好者的第一思维这个程序我能不能实现,如果效率高那还好,如果不高的我们可以借鉴其它现成方法,之前行哥也分享过使用一行代码下载全网视频音乐,想了解了的可以去看一下

你敢信?一行python代码能下载全网视频

当然还有很多不会写代码的读者想在网上直接下载,但须注意不得侵犯他人版权。这里行哥也搜罗了很多免费好用的无版权的音乐来源供大家使用:

  • FreePD:用 emoji 表情来指代歌曲风格,十分形象,网站中所有的歌曲都可以单独免费下载,你也可以选择花费 10 美元一次性下载 800 个音乐。
  • 爱给网:中文网站爱给网包含了免费可商用的音乐素材和商用素材,选择 CC 协议类素材库即可下载免费可商用的音乐素材。
  • audionautix:该网站音乐可免费使用,但需标明音乐来源于该网站。
  • musopen:网站提供的音乐大部分是古典音乐,全部都可以免费下载。
  • soundcloud:soundcloud 提供了大量的免费商用音乐素材,搜索类型后,选择可商用传播的音乐素材即可。
  • bensound:bensound 里的音乐均可免费下载,但需注明音乐来源于该网站。
  • YouTube 免费音乐库:YouTube 免费音乐库中所有音乐均可免费下载。

往期推荐

怎样才能导入import pymysql 怎样才能导入音乐_数据_08

怎样才能导入import pymysql 怎样才能导入音乐_字符串_09