ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用爬虫来爬取QQ音乐上的歌曲

2019-08-10 16:07:43  阅读:409  来源: 互联网

标签:QQ name 22% 爬虫 3A% mid json 歌曲 2C


近几天正在学习爬虫,于是做了一个这样的小东西,由于是初学者,写得不是很好,还请见凉!

以下直接上代码:

这个是运行的界面,有点儿简陋,没有办法,个人技术有限。

以下是代码:

import requests
from lxml import etree
import json
import time
import random
import os
import re


songMidAndName=[]
def QQMusicList():#这里面得到了mid / media_mid / name 这里是下载热歌榜单里的歌
    url='https://u.y.qq.com/cgi-bin/musicu.fcg?-=getUCGI6133160755874543&g_tk=5381&loginUin=1533182258&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data=%7B%22detail%22%3A%7B%22module%22%3A%22musicToplist.ToplistInfoServer%22%2C%22method%22%3A%22GetDetail%22%2C%22param%22%3A%7B%22topId%22%3A26%2C%22offset%22%3A0%2C%22num%22%3A100%2C%22period%22%3A%222019_31%22%7D%7D%2C%22comm%22%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%7D'
    headers={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
        "Referer": "https://y.qq.com/n/yqq/toplist/26.html"
    }
    r=requests.get(url,headers=headers).content.decode('utf-8')
    songlist=json.loads(r)['detail']['data']['songInfoList']
    for x in songlist:
        mid=x['mid']
        name=x['name']
        getPurl(mid,name)
        media_mid=x['file']['media_mid']
        songDict={'mid':mid,'name':name,'media_mid':media_mid}
        songMidAndName.append(songDict)

def getKey():#得到了一个随机的数字,加上mid就可以去匹配我们的purl了
    num=str(random.random()).replace("0.",'')
    return num

def getPurl(mid,name):
    url='https://u.y.qq.com/cgi-bin/musicu.fcg?-=getplaysongvkey'+getKey()+'&g_tk=142976560&loginUin=' \
        '1450133075&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&need' \
        'NewCode=0&data=%7B"req_0"%3A%7B"module"%3A"vkey.GetVkeyServer"%2C"method"%3A"CgiGetVkey"%2C"para' \
        'm"%3A%7B"guid"%3A"2422934060"%2C"songmid"%3A%5B"'+mid+'"%5D%2C"songtype"%3A%5B0%5D%2C"uin"%3A"14' \
        '50133075"%2C"loginflag"%3A1%2C"platform"%3A"20"%7D%7D%2C"comm"%3A%7B"uin"%3A1450133075%2C"format' \
        '"%3A"json"%2C"ct"%3A24%2C"cv"%3A0%7D%7D'

    values=requests.get(url).content.decode('utf-8')
    values=json.loads(values)['req_0']['data']['midurlinfo'][0]['purl']
    songURL="http://isure.stream.qqmusic.qq.com/"+values
    if songURL=="http://isure.stream.qqmusic.qq.com/":
        print("名为%s的歌曲只能通过客端下载"%(name))
        return
    downland(songURL,name)

def downland(songURL,name):
    basefile='./QQ音乐/'
    if os.path.exists(basefile)==False:
        os.mkdir(basefile)
    name=re.sub("[/\\\\><\?\":\*\|]",'',name)
    with open(basefile+'%s.mp3'%(name),'wb') as file:
        html = requests.get(songURL)
        for x in html.iter_content(10240):
            file.write(x)
        print("名为%s.mp3的音乐下载成功!"%(name))


def songList(id=874601481):#这里是通过一个歌单的来下载歌曲,ID可以手动输入
    url='https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?type=1&json=1&utf8=1&onlysong=0&new_format=1&disstid='+str(id)+' &g_tk=322671599&loginUin=1450133075&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0'
    headers={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
        "Referer":"https://y.qq.com/n/yqq/playlist/874601481.html"
    }
    r=requests.get(url,headers=headers).content.decode('utf-8')
    song=json.loads(r)['cdlist'][0]
    # songid=song['songids']
    songlist=song['songlist']
    for x in songlist:
        mid=x['mid']
        name=x['name']
        getPurl(mid,name)

def inputKey(num=200,name='初音未来'):#num指的是一共要下载多少首,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=59046815302372957&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n='+str(num)+'&w='+name+'&g_tk=322671599&loginUin=1450133075&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0'
    headers={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
        "Referer":"https://y.qq.com/portal/search.html"
    }
    keys=requests.get(url,headers=headers).content.decode("utf-8")
    songkey=json.loads(keys)['data']['song']['list']
    print()
    for x in songkey:
        mid=x['mid']
        name=x['name']
        getPurl(mid, name)



def main():
    while True:
        print("请输入1,2,3等三个数字来选择下载的方式")
        print('1代表下载热榜歌单,2代表下载所需要的歌单,3代表通过搜索来下载')
        print('下载的顺序都是按照QQ音乐的默认排名顺序下载的,暂时没有通过歌曲名来下载的功能')
        print('本程序下载的歌曲不会进行分类,请慎重!')
        print("请认真阅读上面的文字,三秒后开始执行程序")
        time.sleep(3)
        num = int(input("请输入数字来选取下载方式:"))
        if num == 1:
            QQMusicList()  # 直接下载热榜歌单里的歌
        elif num == 2:
            print("歌单ID举例https://y.qq.com/n/yqq/playsquare/874601481.html#stat=y_new.index.playlist.pic"
                  "看到那个.html前面的一串数字了嘛?在网页上打开你所需下载的歌单,把地址栏上面的在这儿的同样的数字复制进来就可以了")
            print("现在请输入,记得不要输错,程序报错后,请重新执行!")
            print("请认真阅读上面的文字,三秒后开始执行程序")
            time.sleep(3)
            id = int(input("请输入歌单的ID"))
            songList(id)
        elif num == 3:
            print('请输入两个值,第一个是数字,代表下载多少首,第二个是歌手的名字')
            print("请认真阅读上面的文字,三秒后开始执行程序")
            time.sleep(3)
            num = int(input('请输入第一个值(输完后回车):'))
            name = input('请输入歌手的名字:')
            inputKey(num, name)

        print('请问你要继续嘛 ?(按#键结束)')
        endInput=input('结请输入#,否则任意输入都行')
        if endInput=='#':
            break
            
main()

 

上面的是代码,现在放上去我的文件

 

标签:QQ,name,22%,爬虫,3A%,mid,json,歌曲,2C
来源: https://blog.csdn.net/lomikuve/article/details/99080452

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有