酷我音乐爬虫

142 阅读2分钟
import requests
import time
import sys
from urllib.parse import quote


class KwSpider():


    def __init__(self, url):
        self.headers = {
        'Accept':'application/json, text/plain, */*',
        'Accept-Encoding':'gzip, deflate, br, zstd',
        'Accept-Language':'zh-CN,zh;q=0.9',
        'Host':'www.kuwo.cn',
        'Secret': '7767f1d5564331429b4492e319c3d76858a7b9b202b1ce697bb515abf6ff24ed03688d88',
        'Cookie': '_ga=GA1.2.84906351.1713248705; _gid=GA1.2.2076295143.1713248705; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1713248705; _gat=1; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1713414875; _ga_ETPBRPM9ML=GS1.2.1713414723.8.1.1713414875.52.0.0; Hm_Iuvt_cdb524f42f23cer9b268564v7y735ewrq2324=T7zwGdYiEa2rRyfEPhHe5KRnr5n2pyAa',
        'Referer':'https://www.kuwo.cn/',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
        }
        
        
        self.url = url
        
        
        self.json_data = requests.get(url=self.url, headers=self.headers).json()
        
        
if __name__ == "__main__":


    singer_name = input('请输入你要下载歌曲的歌手名:')
    new_singer_name = quote(singer_name.encode(sys.stdin.encoding).decode(sys.stdin.encoding).encode('utf8'))
    url = f'http://www.kuwo.cn/search/searchMusicBykeyWord?vipver=1&client=kt&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&mobi=1&issubtitle=1&show_copyright_off=1&pn=0&rn=20&all={new_singer_name}'
    
    
    kw = KwSpider(url)
    
    
    for i in range(20):
        #确保你在引用类成员时使用了正确的类名
        music_name = kw.json_data['abslist'][i]['NAME']
        singer = kw.json_data['abslist'][i]['FARTIST']
        album = kw.json_data['abslist'][i]['ALBUM']
        
        
        # 序号i,ID为music_id
        music_id = kw.json_data['abslist'][i]['DC_TARGETID']
        # 中间页音乐地址
        mid_url = f'https://www.kuwo.cn/api/v1/www/music/playUrl?mid={music_id}&type=music&httpsStatus=1&reqId=c723ddd1-fc6f-11ee-8c79-3f05cb6296ba&plat=web_www&from='
        
        
        detail_response = requests.get(url=mid_url, headers=kw.headers)
        detail_response_json = detail_response.json()
        
        
        if detail_response_json.get('data',''):
            detail_download_url = detail_response_json.get('data','')['url']
            if detail_download_url.split('kw-www/')[0].startswith('app'):
                continue
            else:
                print('序号:'+str(i+1)+'歌曲名:'+music_name+'------------'+'歌手:'+singer+'------------'+'专辑名:'+album+'------------'+'链接:'+detail_download_url)
                time.sleep(2)
        else:
            continue
            
            
    while True:
        input_i = eval(input('请输入你想下载的歌曲序号(-1退出):'))
        if input_i == -1:
            break
        # 序号i,ID为music_id
        music_id = kw.json_data['abslist'][input_i - 1]['DC_TARGETID']
        # 音乐名称
        music_name = kw.json_data['abslist'][input_i - 1]['NAME']
        
        
        # 中间页音乐地址
        mid_url = f'https://www.kuwo.cn/api/v1/www/music/playUrl?mid={music_id}&type=music&httpsStatus=1&reqId=c723ddd1-fc6f-11ee-8c79-3f05cb6296ba&plat=web_www&from='
        
        
        detail_response = requests.get(url=mid_url, headers=kw.headers)
        detail_response_json = detail_response.json()
        detail_download_url = detail_response_json['data']['url']
        
        
        if detail_download_url:
            detail_download_music_data = requests.get(detail_download_url).content
            
            
            with open(f'kwmusic/{music_name}.mp3', mode='wb') as f:
                f.write(detail_download_music_data)
            print(f'爬取成功:{music_name}')
```
```