简单爬虫下载QQ音乐

环境:python3.6
需要用到的库:requests;json;os;multiprocessing
通过使用开发者工具进行比较查看确定需要用到的三个URL

u3 = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=63514736641951294&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%88%98%E5%BE%B7%E5%8D%8E&g_tk=5381&jsonpCallback=searchCallbacksong1651&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0"#取得media_mid

w字段为我们搜索的关键字

u2 = "https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&jsonpCallback=MusicJsonCallback3987557968181119&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback3987557968181119&uin=0&songmid=002Q4Jgw0dxWxt&filename=C400002Q4Jgw0dxWxt.m4a&guid=5939185138"#返回songmid和vkey

需要取得u2需要有songmid和filename

u1 = "dl.stream.qqmusic.qq.com/C400002Q4Jgw0dxWxt.m4a?vkey=2B7DD0E2584277EE4C9839F48E3F92F573E443960895BCF8CB107114E2753A49FDE61425996E1F984CD7C4970738AA3A878B1CF0D14501D0&guid=5939185138&uin=0&fromtag=66"#通过filename和vkey=确定歌曲链接

具体代码为:
"""
import requests
import random
import re
import json
import os
import multiprocessing

class DownLoadMusic(object):

def __init__(self, singer_name):
    self.singer_name = singer_name

def make_directory(self):
    folder_path ='F:\\test_auto\\spider\\music\\%s' % self.singer_name
    os.makedirs(folder_path)
    return folder_path

def get_mid_by_name(self):#通过歌手名字取得mid
    name = self.singer_name
    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=63514736641951294&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%s&jsonpCallback=searchCallbacksong1651&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0"%name
    response = requests.get(url)
    result_ = response.content
    result = result_.decode('utf-8')
    list_ = re.findall(r'\{(.*)\}', result, re.S)[0]
    result = re.findall(r'\{.*\}', list_, re.S)[0]
    #"file":{"media_mid":"002Q4Jgw0dxWxt","size_128":4177629,"size_320":10418855,"size_aac":6075090,"size_ape":25501357,"size_dts":0,"size_flac":26906455,"size_ogg":5951775,"size_try":0,"strMediaMid":"002Q4Jgw0dxWxt","try_begin":0,"try_end":0}
    result1 = re.findall(r'\"file.*?\}', result, re.S)
    mids = []
    for i in result1:
        mm = re.findall(r'\{.*\}', i, re.S)[0]
        x = json.loads(mm)
        mids.append(x['strMediaMid'])
    return mids

def get_music_by_mid(self, mid_):
    try:
        folder_path = self.make_directory()
    except:
        folder_path ='F:\\test_auto\\spider\\music\\%s' % self.singer_name
    filename = u'C400'+mid_+u'.m4a'
    url = "https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&jsonpCallback=MusicJsonCallback3987557968181119&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback3987557968181119&uin=0&songmid=%s&filename=%s&guid=5939185138"%(mid_, filename)
    response = requests.get(url)
    result_ = response.content
    result = result_.decode('utf-8')
    x = re.findall(r'\[.*?\]', result, re.S)[0]
    y = re.findall(r'\{.*?\}', x, re.S)[0]#正则表达式取得报文
    z = json.loads(y)#转化成字典
    vkey = z['vkey']
    uz = "http://dl.stream.qqmusic.qq.com/%s?vkey=%s&guid=5939185138&uin=0&fromtag=66" % (filename, vkey)
    try:
        response = requests.get(uz)
        result = response.content
    except:
        print("地址或者网络有点问题...")
    else:
        name = str(random.randint(1000, 9999))+'.m4a'
        file_path = folder_path + '\\' + name
        print("正在下载歌曲%s" % name)
        with open(file_path, 'wb') as f:
            f.write(result)

'''
‘’‘’
def main():
singer_name = input('请输入歌手名称:')
download = DownLoadMusic(singer_name)#多进程下载英语
mids = download.get_mid_by_name()
p = multiprocessing.Pool(4)
p.map(download.get_music_by_mid, mids)
p.close()
p.join()

if name == 'main':
main()
'''

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 脑海一直有个想法,想做一个音乐播放的小程序。奈何还只停留在脑海之中。音乐的数据的来源是个需要考虑的问题。之前用No...
    Evtion阅读 6,030评论 2 6
  • 利用perl语言抓取脚本的时候,我是拒绝的。因为用perl语言太繁琐。空闲时间在听音乐,突然发现有些歌没办法听,就...
    自闭症小孩阅读 538评论 0 1
  • 1、任务目标①爬五月天正规专辑的所有歌曲的歌词②按照年份进行情感分析,并制作词云2、方法在qq音乐上用Python...
    FancyFanyc阅读 9,186评论 0 5
  • 基于thinkphp的代码 1:搜索歌曲 接口: $url="http://soso.music.qq.com/f...
    暖暖的走阅读 1,006评论 0 0
  • 姓名:莫夏连 日期:2018年7月3日 名称:宁波三维电子 六项精进403期努力三组学员 【日精进打卡第23天】 ...
    莫夏连阅读 69评论 0 0