Python爬虫实现千千音乐歌曲爬取

1.导入python模板

import requests
import json
from pprint import pprint
import os

2.创建目录及文件夹方法

#创建目录方法
k=os.path.exists('千千音乐')
if k==False:
    # 没有才创建
    os.makedirs('千千音乐')
#创建文件方法
if os.path.exists('千千音乐/{}.mp3'.format(music_url['data']['title'])):
    print('true')
else:
	print('false')

3.获取同一分类下的所有歌曲

在这里插入图片描述在此只展示一个分类,其他分类在千千音乐网页中查看

# url为当前分类下请求歌曲数据的路径
url='https://music.taihe.com/v1/song/info?sign=56cdab3b9092cbdd870e5a79e1a28a01&appid=16073360&TSID=T10049736422%2CT10053603750%2CT10053704552%2CT10055686712%2CT10040725440%2CT10049734100%2CT10056561270%2CT10049556116%2CT10058507148%2CT10038961805%2CT10049729058%2CT10049742477%2CT10054676204%2CT10051577859%2CT10048305736%2CT10054385057%2CT10044389725%2CT10051194799%2CT10053650317%2CT10057519284%2CT10044779449%2CT10038920637%2CT10054113223%2CT10038826793%2CT10054000106%2CT10038626780%2CT10049739231%2CT10049467977%2CT10052929701%2CT10040588896%2CT10049813516%2CT10049813517%2CT10049813518%2CT10049783488%2CT10040594947%2CT10040396162%2CT10052868574%2CT10053091729%2CT10038626778%2CT10044857774%2CT10044812250%2CT10044852766%2CT10044808426%2CT10044820931%2CT10044879237%2CT10044875830%2CT10044818822%2CT10044868541%2CT10044849927%2CT10044861457%2CT10044850274%2CT10044830319%2CT10044874276%2CT10044881722%2CT10044833443&timestamp=1609762305'
# str_url为每一首歌曲的TSID获取所对应的歌曲下载链接
str_url='https://music.taihe.com/v1/song/tracklink?sign=f0de68957c8aa94f2310863d8fbf0bed&appid=16073360&TSID=T10044833443&timestamp=1609762306'
req=requests.get(url=url)
req_str=req.content.decode()
# dict_req为当前分类下的歌曲数据
# 调用json_loads()方法将获取的json字符串转换为字典
dict_req=json.loads(req_str)['data']

#遍历所获取的数据,解析出每一首歌曲的TSID,通过TSID获取对应的歌曲下载链接res1
for i in dict_req:  tricklink=requests.get('https://music.taihe.com/v1/song/tracklink?TSID={}&timestamp=1609762306'.format(i['TSID']))
    music_url=json.loads(tricklink.text)
    # print(tricklink.status_code)
    # pprint(music_url['data'])
    if 'path' in music_url['data']:
        res1 =music_url['data']['path']
    else:
        res1 =music_url['data']['trail_audio_info']['path']
    print(music_url['data']['title'])
    print(res1)
#创建歌曲文件
    if os.path.exists('千千音乐/{}.mp3'.format(music_url['data']['title'])):
        print('true')
        pass
    else:
        print('false')
        #'wb'表示以二进制流下载歌曲
        with open(r'千千音乐/{}.mp3'.format(music_url['data']['title']), 'wb') as file:  # 保存到本地的文件名
            file.write(requests.get(url=res1).content)
            file.flush()

4.知道第3步的歌曲下载思路后,下载所有分类下的歌曲

import requests
import json
from pprint import pprint
import os
num = eval(input('请输入你想下载歌曲的种类数量'))
# 创建存放歌曲的文件夹
if not os.path.exists('千千音乐全爬虫'):
    os.makedirs('千千音乐全爬虫')
# url为获取所有分类的歌曲数据,其中pageSize为想下载的分类数量
url='https://music.taihe.com/v1/tracklist/list?sign=89d9c9b950b010c1d043434e7999d89b&subCateId=2376&pageSize={}'.format(num)
req=requests.get(url=url)
# decode 将类似于\\U8650的数据解码
html=req.text.encode('utf-8').decode("unicode-escape")
# print(type(html))
# json字符串转换,添加strict=False意为在非严格,防止报错
music_url=json.loads(html,strict=False)
url_data=music_url['data']['result']
for items in url_data:
    dirsname=items['title'].replace('|','')
    # print(dirsname)
    # print(i,item['id'],item['desc'])
    # 创建每个分类的目录,如果分类已存在,则不重复下载
    if not os.path.exists('千千音乐全爬虫/{}'.format(dirsname)):
        os.makedirs('千千音乐全爬虫/{}'.format(dirsname))
        print('以创建{}目录,下载中...'.format(dirsname))
 		# https://music.taihe.com/v1/tracklist/info?sign=955b1cf7feb748c62e86089f8f4aebd4&id=271713&pageSize=50           
        get_tsid=requests.get(url='https://music.taihe.com/v1/tracklist/info?sign=955b1cf7feb748c62e86089f8f4aebd4&id={}&pageSize=50'.format(items['id']))
        # print(get_tsid.text)
        list_tsid=json.loads(get_tsid.text,strict=False)
        # print(list_tsid['data']["trackList"])
        for item in list_tsid['data']["trackList"]:
            # print(item['TSID'])
            tricklink = requests.get(
                'https://music.taihe.com/v1/song/tracklink?TSID={}&timestamp=1609762306'.format(item['TSID']))
            print(tricklink.status_code)
            music_url = json.loads(tricklink.text)
            # print(tricklink.status_code)
            # pprint(music_url['data'])
            if 'path' in music_url['data']:
                res1 = music_url['data']['path']
            else:
                res1 = music_url['data']['trail_audio_info']['path']
            # print(music_url['data']['title'])
            # print(res1)
            if os.path.exists('千千音乐全爬虫/{}/{}.mp3'.format(dirsname,music_url['data']['title'])):
                # print('true')
                pass
            else:
                # print('false')
                with open(r'千千音乐全爬虫/{}/{}.mp3'.format(dirsname,music_url['data']['title']), 'wb') as file:  # 保存到本地的文件名
                    file.write(requests.get(url=res1).content)
                    print('已下载{}歌曲'.format(music_url['data']['title']))
                    file.flush()
   
    else:
        print('已存在{}目录,跳过创建'.format(dirsname))

5.运行结果

在这里插入图片描述
在这里插入图片描述在此个人只下载了43个分类下的歌曲,共1048首音乐,因为部分音乐是试听歌曲,无法完全下载,可以通过对下载的每首歌曲进行判断,筛选出完整的歌曲。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值