爬虫小案例:查询歌手歌单

需求:输入歌手名,查询出歌手的歌单

注意:数据来源 QQ 音乐,为了减少 QQ 音乐服务器压力,避免拒绝访问,请求的数据量不要太大。

代码仅限学习使用

 

# 引用requests库
import requests

# 控制循环
flag = True

# 获取歌单
def getmusiclist(singer=''):
    # 调用get方法,下载这个字典
    url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
    # 定制请求头,伪装成浏览器
    headers = {
        "origin": "https://y.qq.com",
        "referer": "https://y.qq.com/portal/search.html",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 OPR/65.0.3467.78 (Edition Baidu)",
    }
    # 请求参数
    params = {
        'ct': '24',
        'qqmusic_ver': '1298',
        'new_json': '1',
        'remoteplace': 'txt.yqq.song',
        'searchid': '70717568573156220',
        't': '0',
        'aggr': '1',
        'cr': '1',
        'catZhida': '1',
        'lossless': '0',
        'flag_qc': '0',
        'p': '1', # 当前歌曲页面
        'n': '20', # 每页歌曲的歌曲数目
        'w': singer, # 歌手名称
        'g_tk': '714057807',
        'loginUin': '0',
        'hostUin': '0',
        'format': 'json',
        'inCharset': 'utf8',
        'outCharset': 'utf-8',
        'notice': '0',
        'platform': 'yqq.json',
        'needNewCode': '0'
    }
    res = requests.get(url, headers=headers, params=params)
    if res.status_code == 200:
        # 返回 json 数据
        json_music = res.json()
        if len(json_music['data']['song']['list']) <= 0:
            print('很抱歉,暂时没有找到与“{}”相关的结果'.format(singer))
        else:
            for music in json_music['data']['song']['list']:
                # 歌曲名称
                title = music['title']

                # 专辑
                album_name = music['album']['name']

                # 播放时长
                interval = int(music['interval'])
                interval = "{}分{}秒".format(interval // 60, interval % 60)

                # 播放链接
                playurl = 'https://y.qq.com/n/yqq/song/{0}.html'.format(music['mid'])

                print('歌曲名称:{},专辑:{},播放时长:{},播放链接:{}'.format(title, album_name, interval, playurl))
    else:
        print('请求失败!')

def again():
    global flag
    n = input('是否要继续查询(输入 n/N 终止程序):')
    if n in ['n', 'N']:
        print('程序已停止,感谢使用!')
        flag = False

def main():
    while flag:
        singer = input('你想找哪位歌手的歌单?')
        getmusiclist(singer)
        again()

main()

 

 

posted @ 2020-01-07 17:45  KeenLeung  阅读(316)  评论(0编辑  收藏  举报